|
Оптимизация запроса
|
|||
---|---|---|---|
#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)) буду признательна за ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 23:03 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#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, 00:41 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#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:28 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
nadin_sh, если пренебречь возможным эффектом нелинейности на больших размерах таблиц, можно оценить разницу и на малых таблицах, зациклив выполнение на столько раз, чтобы продолжительности выборок превышали несколько секунд или десятков секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 01:37 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#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 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 07:08 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Dima T, В свое время тоже долго мучался, знаю по себе как тяжело решить - казалось бы тяжелый вопрос, не знаю актуально или нет, думаю смогу помочь. Я сам нашел решение ответа на этом сайте: (не сочтите за спам) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2014, 19:13 |
|
|
start [/forum/topic.php?fid=41&msg=38741178&tid=1582552]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
101ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
others: | 315ms |
total: | 496ms |
0 / 0 |