powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация запроса
7 сообщений из 7, страница 1 из 1
Оптимизация запроса
    #38741139
nadin_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, в каком виде запрос будет быстрее выполняться (проверить на больших объемах пока нет возможности)
1)
SELECT F.*, CJ.*, CP.* ;
FROM FIRM F ;
INNER JOIN CITY CJ ON F.JUR_CITY_ID=CJ.CITY_ID ;
AND IIF(nvl(?P_NAME,' ')=' ',1,UPPER(F.NAME))=IIF(nvl(?P_NAME,' ')=' ',1,UPPER(?P_NAME)) ;
AND IIF(nvl(?P_CJ,' ')=' ',1,UPPER(CJ.NAME))=IIF(nvl(?P_CJ,' ')=' ',1,UPPER(?P_CJ)) ;
LEFT JOIN CITY CP ON F.POST_CITY_ID=CP.CITY_ID ;
WHERE IIF(nvl(?P_CP,' ')=' ',1,UPPER(CP.NAME))=IIF(nvl(?P_CP,' ')=' ',1,UPPER(?P_CP))

2) или
SELECT F.*, CJ.*, CP.* ;
FROM FIRM F ;
INNER JOIN CITY CJ ON F.JUR_CITY_ID=CJ.CITY_ID ;
LEFT JOIN CITY CP ON F.POST_CITY_ID=CP.CITY_ID ;
WHERE ;
IIF(nvl(?P_NAME,' ')=' ',1,UPPER(F.NAME))=IIF(nvl(?P_NAME,' ')=' ',1,UPPER(?P_NAME)) ;
AND IIF(nvl(?P_CJ,' ')=' ',1,UPPER(CJ.NAME))=IIF(nvl(?P_CJ,' ')=' ',1,UPPER(?P_CJ)) ;
and IIF(nvl(?P_CP,' ')=' ',1,UPPER(CP.NAME))=IIF(nvl(?P_CP,' ')=' ',1,UPPER(?P_CP))

буду признательна за ответ
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38741178
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nadin_sh, не могу ответить на твой вопрос, но в плане оптимизации кажется, что значение выражения
(ISNULL (?P_NAME) OR UPPER(F.NAME) == UPPER(?P_NAME))
то же, что и
IIF(nvl(?P_NAME,' ')=' ',1,UPPER(F.NAME))=IIF(nvl(?P_NAME,' ')=' ',1,UPPER(?P_NAME))
при том, что первое выражение не только короче, но и скорее исполняемо.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38741190
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nadin_sh, не кажется ли тебе, что прежде чем ставить вопрос, проблему надо очистить от громоздких и несущественных деталей?
Варианты для сравнения могут выглядеть вот как:
1)
SELECT F.*, CJ.*, CP.* FROM F ;
INNER JOIN CJ ON F.JUR_CITY_ID = CJ.CITY_ID AND F.NAME = P_NAME AND CJ.NAME = P_CJ;
LEFT JOIN CP ON F.POST_CITY_ID = CP.CITY_ID;
WHERE CP.NAME = P_CP
2)
SELECT F.*, CJ.*, CP.* FROM F ;
INNER JOIN CJ ON F.JUR_CITY_ID = CJ.CITY_ID ;
LEFT JOIN CP ON F.POST_CITY_ID = CP.CITY_ID ;
WHERE F.NAME = P_NAME AND CJ.NAME = P_CJ AND CP.NAME = P_CP

На мой профанский взгляд, в варианте 1) выборка встроенными средствами JOIN по большему числу полей сработает быстрее, чем выполнение проверок WHERE в варианте 2). Но насколько существенна должна быть эта разница - не представляю.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38741195
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nadin_sh, если пренебречь возможным эффектом нелинейности на больших размерах таблиц, можно оценить разницу и на малых таблицах, зациклив выполнение на столько раз, чтобы продолжительности выборок превышали несколько секунд или десятков секунд.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38741254
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про SYS(3054), показывает как будет использован оптимизатор. Делаешь SYS(3054, 11) затем выполняешь запрос и смотришь что напишет.

Оптимизатор не сработает на IIF(), индексы не задействует и будет просто перебор, что не быстро.

Второй вариант предпочтительнее, только where немного поправить (чтобы оптимизатор включился)
Код: sql
1.
2.
3.
4.
... WHERE ;
UPPER(F.NAME)=UPPER(nvl(?P_NAME,'')) ;
AND UPPER(CJ.NAME)=UPPER(nvl(?P_CJ,'')) ;
and UPPER(CP.NAME)=UPPER(nvl(?P_CP,''))



Еще посоветовал бы избавится от UPPER() - использовать set collate to "russian" (тогда UPPER() можно не писать)
Код: sql
1.
2.
3.
4.
... WHERE ;
F.NAME=nvl(?P_NAME,'');
AND CJ.NAME=nvl(?P_CJ,'');
and CP.NAME=nvl(?P_CP,'')



или (если уже невозможно set collate) делать индексы с использованием UPPER(), т.е.
Код: sql
1.
index on UPPER(NAME) tag name


Тогда оптимизатор задействует такой индекс. Т.е. чтобы оптимизатор задействовал индекс - индексное выражение должно совпадать с выражением во where
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38746040
caunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

В свое время тоже долго мучался, знаю по себе как тяжело решить - казалось бы тяжелый вопрос, не знаю актуально или нет, думаю смогу помочь. Я сам нашел решение ответа на этом сайте: (не сочтите за спам)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38746058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caunt...(не сочтите за спам)
url=http://www.modber.ru/]
Это не спам, а скрытая раскрутка сайта, не надо этим тут заниматься.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]