Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.01.11;
Скачать: CL | DM;

Вниз

Оптимизация SELECT-запроса   Найти похожие ветки 

 
Scott Storch ©   (2013-12-10 13:04) [0]

СУБД: DBISAM

Нужно максимально быстро проверить, есть ли в таблице записи с пустым значением в поле code и delete_flag <> 1. Делаю так:

SELECT item_id FROM item WHERE LOWER(ALLTRIM(code)) = """" AND delete_flag <> 1 TOP 1;

DBISAM-анализатор запросов пишет что запрос неоптимизирован. Что можно улучшить?


 
RWolf ©   (2013-12-10 13:05) [1]

смысл применять LOWER, если условие — проверка на пустую строку?


 
RWolf ©   (2013-12-10 13:08) [2]

и да, delete_flag лучше проверять на равенство или нахождение в диапазоне, тогда индекс по этому полю поможет ускорить запрос.


 
Scott Storch ©   (2013-12-10 13:08) [3]

с LOWER почему-то на несколько сек быстрее ищет


 
Scott Storch ©   (2013-12-10 13:09) [4]

и еще: по полю code есть индекс


 
RWolf ©   (2013-12-10 13:10) [5]


> по полю code есть индекс

не поможет, тут нужен индекс по ALLTRIM(code), если СУБД такое умеет.


 
Scott Storch ©   (2013-12-10 13:12) [6]


> не поможет, тут нужен индекс по ALLTRIM(code), если СУБД
> такое умеет.


буду смотреть, спасибо


 
Inovet ©   (2013-12-10 13:19) [7]

> [0] Scott Storch ©   (10.12.13 13:04)
> записи с пустым значением

is null
Пробелов нафигачили? - Очистить.


 
Anatoly Podgoretsky ©   (2013-12-10 14:52) [8]

Для чего делается запрос?


 
Scott Storch ©   (2013-12-10 15:18) [9]


> Для чего делается запрос?


Пользователь открывает некую форму со списком товаров. При открытии формы нужно проверять, все ли товары имеют коды и, если нет, то выводить диалог с предложением сгенерировать их. Когда товаров ~ 1 000 000 и для всех их заданы коды, SELECT-запрос выполняется достаточно долго - больше минуты на относительно слабом компьютере. Нужно его как-то оптимизировать.


> is null
> Пробелов нафигачили? - Очистить.


уже пробовал - эффекта 0.

Путем извратов пришел к:

SELECT item_id FROM item WHERE LOWER(code) = LOWER("""") AND delete_flag <> 1 TOP 1;

Некрасиво конечно, но зато скорость выполнения увеличилась раз в 20-25


 
Inovet ©   (2013-12-10 15:28) [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:36) [11]


> Такое надо разово делать, если постоянно приходиться - что-
> то не так в консерватории.


оно и делается разово в большинстве случаев. в диалоге предлагается - больше не спрашивать.


> Поясни - какого эффекта.


Если написать SELECT ... WHERE code IS NULL ... - запрос будет выполняться столько же по времени сколько и в [0]

вообщем решение проблемы найдено, тему можно закрывать


 
Anatoly Podgoretsky ©   (2013-12-10 16:31) [12]

Вместо извратов лучше настроить индексы.


 
Ega23 ©   (2013-12-10 16:34) [13]

select distinct code from item where code = "" and delete_flag <> 1;


 
Ega23 ©   (2013-12-10 16:35) [14]


> Вместо извратов лучше настроить индексы.


DBISAM - такая специфичная штука. ЕМНИП, там даже вторичных ключей неть.


 
Омлет ©   (2013-12-15 22:03) [15]

условие delete_flag <> 1 поставь слева - флаг всяко проверить быстрее, чем строку сравнить.


 
Inovet ©   (2013-12-15 22:06) [16]

> [15] Омлет ©   (15.12.13 22:03)
> условие delete_flag <> 1 поставь слева

Ну, если оптимизатор тупой совсем. Но проверить надо.


 
Омлет ©   (2013-12-15 22:18) [17]

Я бы даже так сделал:


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 необходимо убрать.


 
Омлет ©   (2013-12-15 22:21) [18]

> число из пробелов

*code чисто из пробелов


 
Ega23 ©   (2013-12-16 10:58) [19]


> условие delete_flag <> 1 поставь слева - флаг всяко проверить
> быстрее, чем строку сравнить.


В некоторых СУБД порядок следования условий в where задаёт индексы, которые будут задействованы при выборке.
Надо экспериментировать.



Страницы: 1 вся ветка

Текущий архив: 2015.01.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
2-1387206682
demi
2013-12-16 19:11
2015.01.11
Фильтрация


2-1387273889
_guest_
2013-12-17 13:51
2015.01.11
Текст по столбцам в Excel из Delphi XE4


2-1387118291
demi
2013-12-15 18:38
2015.01.11
фильтр в делфи


1-1329069169
Eraser
2012-02-12 21:52
2015.01.11
Форма в доп. потоке


2-1387229735
вова
2013-12-17 01:35
2015.01.11
Работа с указателями вопросы