LINUX.ORG.RU

Запрос работает слишком медленно

 


0

2

Короче, есть такое чудо - КЛАДР. В некоторой программке происходит выбор адресов именно через него. И в одном месте, нужно определить принадлежность адреса к городу/краю. Делается это посредством сравнения двух строк. По скольку данных оче много, то работает это все неимоверно медленно и вешает всю базу, на долго.

Ну, можно что нибудь сделать?

Deleted

Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от habamax

А так партиционирование по, например, «кладру города» дало бы существенный выигрыш.

У нас он разбит на несколько таблиц, да. Но это не решает проблему. При JOIN'е перебирается куча значений, все люто-адово глючит. П.С. Партицирование - это что? Вроде верно ответил.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 2)
Ответ на: комментарий от Deleted

донести, что сравниваю я как раз по коду

При наличии индекса по коду и сравнению по CODE BETWEEN индекс очень хорошо помогает.

monk ★★★★★
()
Ответ на: комментарий от Deleted

У нас он разбит на несколько таблиц, да. Но это не решает проблему. При JOIN'е перебирается куча значений, все люто-адово глючит.

Подожди, вот есть у тебя код Уфы 001, Надо найти принадлежность улицы Красина к городу, у которой адрес разложен по КЛАДРУ: город 001, улица 0429

Тут простое сравнение кладров 001 с таблицей кладров городов...

Или есть нюансы?

habamax ★★★
()
Ответ на: комментарий от Deleted

CODE у тебя странный — похоже, внутренний. KLADR — похоже, на стандартный СС РРР ГГГ ППП АА, где

  • СС – код субъекта Российской Федерации (региона), коды регионов представлены в Приложении 2 к Описанию классификатора адресов Российской Федерации (КЛАДР);
  • РРР – код района;
  • ГГГ – код города;
  • ППП – код населенного пункта,
  • АА – признак актуальности адресного объекта.

Соотвественно, код города (select k.kladr from kladr k where name='имягорода' and right(kladr, 5) = '00000' and right(kladr, 8) <> '00000000'), проверка принадлежности населённого пункта к городу:

select k.kladr 
from kladr as k 
join (select k.kladr from kladr as k 
      where name='имягорода' 
            and right(kladr, 5) = '00000' 
            and right(kladr, 8) <> '00000000') as k2
on  left(k.kladr, 8) = left(k2.kladr, 8)
where name='имяпункта' 
and right(k.kladr, 5) <> '00000' 
and right(k.kladr, 2) = '00'

Необходим индекс по полю name. А если у тебя на входе не имя, а код то вообще без запроса сравниваешь начала кодов и всё.

monk ★★★★★
()
Ответ на: комментарий от monk

CODE у тебя странный

И мне так кажется.

Соотвественно, код города (select k.kladr from kladr k where name='имягорода' and right(kladr, 5) = '00000' and right(kladr, 8) <> '00000000'), проверка принадлежности населённого пункта к городу:

Нам мало того, что нужно проверить принадлежность, нужно еще и вытянуть из КЛАДРа этот самый город/район.

А если у тебя на входе не имя, а код то вообще без запроса сравниваешь начала кодов и всё.

This. Сейчас так и делаю. Запрос выполняется в среднем 300 секунд :(

Вообще, есть одна идея... Край по которому нужно выберать, мне известен. Я, наверное, попробую создать доп. табличку, куда руками забью все города и районы края. И буду работать уже с этой табличкой, маленькой и красивой. В общем, по эксперементирую сегодня.

Deleted
()
Ответ на: комментарий от Deleted

Запрос выполняется в среднем 300 секунд

Это сильно много.

Край по которому нужно выберать, мне известен. Я, наверное, попробую создать доп. табличку, куда руками забью все города и районы края.

Можешь просто предвыбрать из общей во временную (select * from kladr where left(kladr, 2) = '..'). Тогда индекс по полю kladr ещё нужен. Но в целом при наличии индексов на kladr и name почти любой запрос с условиями типа name = ... left(kladr, ...) = ... будет и по полной таблице выполнять почти мгновенно

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Можешь просто предвыбрать из общей во временную

Точно, чет я не догадался. Спасибо за идею, попробую сегодня.

Deleted
()
Ответ на: комментарий от monk

В общем, по совещались чуть-чуть и решили сделать табличку только по нужному краю. Запрос выполняется в среднем 5 секунд.

Спасибо за помощь!

Deleted
()
12 ноября 2014 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.