Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
08.09.2014, 23:03
|
|||
---|---|---|---|
|
|||
Оптимизация запроса |
|||
#18+
Подскажите, в каком виде запрос будет быстрее выполняться (проверить на больших объемах пока нет возможности) 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)) буду признательна за ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
|
09.09.2014, 00:41
|
|||
---|---|---|---|
|
|||
Оптимизация запроса |
|||
#18+
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)) при том, что первое выражение не только короче, но и скорее исполняемо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
09.09.2014, 01:28
|
|||
---|---|---|---|
|
|||
Оптимизация запроса |
|||
#18+
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). Но насколько существенна должна быть эта разница - не представляю. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
09.09.2014, 01:37
|
|||
---|---|---|---|
|
|||
Оптимизация запроса |
|||
#18+
nadin_sh, если пренебречь возможным эффектом нелинейности на больших размерах таблиц, можно оценить разницу и на малых таблицах, зациклив выполнение на столько раз, чтобы продолжительности выборок превышали несколько секунд или десятков секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
09.09.2014, 07:08
|
|||
---|---|---|---|
Оптимизация запроса |
|||
#18+
Почитай про SYS(3054), показывает как будет использован оптимизатор. Делаешь SYS(3054, 11) затем выполняешь запрос и смотришь что напишет. Оптимизатор не сработает на IIF(), индексы не задействует и будет просто перебор, что не быстро. Второй вариант предпочтительнее, только where немного поправить (чтобы оптимизатор включился) Код: sql 1. 2. 3. 4.
Еще посоветовал бы избавится от UPPER() - использовать set collate to "russian" (тогда UPPER() можно не писать) Код: sql 1. 2. 3. 4.
или (если уже невозможно set collate) делать индексы с использованием UPPER(), т.е. Код: sql 1.
Тогда оптимизатор задействует такой индекс. Т.е. чтобы оптимизатор задействовал индекс - индексное выражение должно совпадать с выражением во where ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.09.2014, 19:13
|
|||
---|---|---|---|
|
|||
Оптимизация запроса |
|||
#18+
Dima T, В свое время тоже долго мучался, знаю по себе как тяжело решить - казалось бы тяжелый вопрос, не знаю актуально или нет, думаю смогу помочь. Я сам нашел решение ответа на этом сайте: (не сочтите за спам) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/moderation_log.php?user_name=%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9+%D0%9A%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0%D0%BB%D0%BE%D0%B2]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
others: | 1468ms |
total: | 1620ms |
0 / 0 |