Вопрос о оптимальном алгоритме поиска в БД

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 22 июн 2007, 11:27

WildSery писал(а): Не вижу тут проблемы:

Код: Выделить всё

select first 1 * 
  from prefixes px
  where '83466343126' starting with (px.prefix)
  order by char_length(px.prefix) desc
Если там с пробелами - перед определением длины отрезать.
Погонял вариант с starting with для поиска префикса в триггере при вставке строки с телефоном (ибо есть такая задача) - при загрузке 10000-12000 строк в базу получил 4 мин
мой путь с усечением номера телефона в цикле дал 30сек
индексы помимо первичного ключа не строил

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 22 июн 2007, 12:38

stix-s писал(а):индексы помимо первичного ключа не строил
Зря. Непонятно тогда, что тестировал.
Уж проверил бы тогда с индексами по полю PREFIX и дополнительному полю с заранее рассчитанной длиной префикса.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 25 июн 2007, 09:08

WildSery писал(а):
stix-s писал(а):индексы помимо первичного ключа не строил
Зря. Непонятно тогда, что тестировал.
Уж проверил бы тогда с индексами по полю PREFIX и дополнительному полю с заранее рассчитанной длиной префикса.
Пардон, в предыдущем посте ввел в заблуждение (восстанавливал в тестовую из рабочей и не деактивировал индекс по полю PREFIX)
Так что преды дущий пост относится к ситуации с индексом.
Без индекса

Код: Выделить всё

select first 1 * 
  from prefixes px 
  where '83466343126' starting with (px.prefix) 
  order by char_length(px.prefix) desc
те же 4 мин
с усечением номера телефона в цикле - более часа :roll:
________________
с индексами по полю PREFIX и дополнительному полю с заранее рассчитанной длиной префикса.

Код: Выделить всё

where '83466343126' starting with (px.prefix) 
  order by px.len_prefix  desc
снова 4 мин
(вместо одного номера телефона естественно при загрузке подставляется каждый раз новый)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 июн 2007, 17:00

снова 4 мин
(вместо одного номера телефона естественно при загрузке подставляется каждый раз новый)
ты на планы запросов смотришь? или пофиг?
по ph.prefix есть обратный индекс?

чего вообще меряем? скорость поиска, или скорость сортировки?

кстати. если есть desc индекс для order by, то с таким where будет на мой взгляд только хуже. Потому что выборка в порядке индекса приведет к офигительному числу чтений с диска. т.е. метанию сервера от индекса к записи и обратно.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 26 июн 2007, 05:56

kdv писал(а): ты на планы запросов смотришь? или пофиг?
Смотрю, только здесь не привел :( натуралом шпарит
kdv писал(а): по ph.prefix есть обратный индекс?

для эксперимента построил
kdv писал(а): чего вообще меряем? скорость поиска, или скорость сортировки?
Да просто эксперементирую :)
а вообще, конечно интересует скорость поиска
kdv писал(а): кстати. если есть desc индекс для order by, то с таким where будет на мой взгляд только хуже. Потому что выборка в порядке индекса приведет к офигительному числу чтений с диска. т.е. метанию сервера от индекса к записи и обратно.
В моем случае с

Код: Выделить всё

where '83466343126' starting with (px.prefix)
время существенно не меняется

Ответить