![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация SELECT-запроса
Scott Storch © (2013-12-10 13:04:00)СУБД: DBISAM
Нужно максимально быстро проверить, есть ли в таблице записи с пустым значением в поле code и delete_flag <> 1. Делаю так:
SELECT item_id FROM item WHERE LOWER(ALLTRIM(code)) = '''' AND delete_flag <> 1 TOP 1;
DBISAM-анализатор запросов пишет что запрос неоптимизирован. Что можно улучшить?
Ega23 (2013-12-16 10:58:00) [1]
> условие delete_flag <> 1 поставь слева - флаг всяко проверить
> быстрее, чем строку сравнить.
В некоторых СУБД порядок следования условий в where задаёт индексы, которые будут задействованы при выборке.
Надо экспериментировать.
Омлет (2013-12-15 22:21:00) [2]> число из пробелов
*code чисто из пробелов
Омлет (2013-12-15 22:18:00) [3]Я бы даже так сделал:
SELECT item_id FROM item
WHERE (delete_flag <> 1) AND ((code IS NULL) OR (LENGTH(CODE) = 0) or (LENGTH(ALLTRIM(code) = 0))
TOP 1;
Тогда в случае наличия таких записей и, если предположить, что число из пробелов - это скорее исключение, то выполняться может значительно быстрее, т.к. не придется сканировать всю таблицу.
Если поле не нулабельно - code IS NULL необходимо убрать.
Inovet (2013-12-15 22:06:00) [4]> [15] Омлет © (15.12.13 22:03)
> условие delete_flag <> 1 поставь слева
Ну, если оптимизатор тупой совсем. Но проверить надо.
Омлет (2013-12-15 22:03:00) [5]условие delete_flag <> 1 поставь слева - флаг всяко проверить быстрее, чем строку сравнить.
Ega23 (2013-12-10 16:35:00) [6]
> Вместо извратов лучше настроить индексы.
DBISAM - такая специфичная штука. ЕМНИП, там даже вторичных ключей неть.
Ega23 (2013-12-10 16:34:00) [7]
select distinct code from item where code = '' and delete_flag <> 1;
Anatoly Podgoretsky (2013-12-10 16:31:00) [8]Вместо извратов лучше настроить индексы.
Scott Storch (2013-12-10 15:36:00) [9]
> Такое надо разово делать, если постоянно приходиться - что-
> то не так в консерватории.
оно и делается разово в большинстве случаев. в диалоге предлагается - больше не спрашивать.
> Поясни - какого эффекта.
Если написать SELECT ... WHERE code IS NULL ... - запрос будет выполняться столько же по времени сколько и в [0]
вообщем решение проблемы найдено, тему можно закрывать
Inovet (2013-12-10 15:28:00) [10]> [9] Scott Storch © (10.12.13 15:18)
> При открытии формы нужно проверять, все ли товары имеют
> коды и, если нет, то выводить диалог с предложением сгенерировать
> их.
Такое надо разово делать, если постоянно приходиться - что-то не так в консерватории.
> [9] Scott Storch © (10.12.13 15:18)
> > is null
> > Пробелов нафигачили? - Очистить.
>
> уже пробовал - эффекта 0.
Поясни - какого эффекта.
Scott Storch (2013-12-10 15:18:00) [11]
> Для чего делается запрос?
Пользователь открывает некую форму со списком товаров. При открытии формы нужно проверять, все ли товары имеют коды и, если нет, то выводить диалог с предложением сгенерировать их. Когда товаров ~ 1 000 000 и для всех их заданы коды, SELECT-запрос выполняется достаточно долго - больше минуты на относительно слабом компьютере. Нужно его как-то оптимизировать.
> is null
> Пробелов нафигачили? - Очистить.
уже пробовал - эффекта 0.
Путем извратов пришел к:
SELECT item_id FROM item WHERE LOWER(code) = LOWER('''') AND delete_flag <> 1 TOP 1;
Некрасиво конечно, но зато скорость выполнения увеличилась раз в 20-25
Anatoly Podgoretsky (2013-12-10 14:52:00) [12]Для чего делается запрос?
Inovet (2013-12-10 13:19:00) [13]> [0] Scott Storch © (10.12.13 13:04)
> записи с пустымзначением
is null
Пробелов нафигачили? - Очистить.
Scott Storch (2013-12-10 13:12:00) [14]
> не поможет, тут нужен индекс по ALLTRIM(code), если СУБД
> такое умеет.
буду смотреть, спасибо
RWolf (2013-12-10 13:10:00) [15]
> по полю code есть индекс
не поможет, тут нужен индекс по ALLTRIM(code), если СУБД такое умеет.
Scott Storch (2013-12-10 13:09:00) [16]и еще: по полю code есть индекс
Scott Storch (2013-12-10 13:08:00) [17]с LOWER почему-то на несколько сек быстрее ищет
RWolf (2013-12-10 13:08:00) [18]и да, delete_flag лучше проверять на равенство или нахождение в диапазоне, тогда индекс по этому полю поможет ускорить запрос.
RWolf (2013-12-10 13:05:00) [19]смысл применять LOWER, если условие — проверка на пустую строку?