Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! Есть таблица TAB1 c полем DATFLD типа DATE. Индексов нет. Нужно сделать выборку записей за один месяц. Меня интересует, какая конструкция отработает быстрее: Код: plaintext Код: plaintext Код: plaintext Спасибо С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 10:30 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
Если есть индекс по полю с датой, то первый вариант однозначно самый медленный... Так как индекс не будет использоваться.... ИМХО, второй и третий варианты одинаковы... Я пользую второй конструкцией... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 11:09 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
Ещё можно добавить в таблицу generated-поле (назову его Y) по выражению 100 * year(DATFLD) + month(DATFLD) и искать select * from TAB1 where YM=:month + 100 * :year. По YM неплохо не только индексировать, но и использовать в качестве измерения для MDC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 11:46 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
С маркерами параметров надо иметь ввиду следующее: План запроса строится до того, как становятся известны актуальные значения (есть, конечно, варианты с опцией компиляции reopt, но мы рассматриваем общий случай). Если у вашей таблицы не стоит флаг volatile, то план запроса в этом случае трудно предсказать, ведь на этапе компиляции не понятно, какое кол-во строк будет в итоге выбрано. Поэтому, если вы хотите побудить оптимизатор использовать индекс вы можете - при установленной заранее переменной окружения DB2_SELECTIVITY=ALL: select * from TAB1 where DATFLD between ? and ? selectivity 0.00001 - не использовать в таких запросах маркеры, а вместо них - актуальные значения параметров. Тогда оптимизатор по собранной статистике может сам, в зависимости от этих значений, выбрать оптимальный план. Другой вариант: - завести generated always поле: datfld_ym generated always as (year(datfld)*100+month(datfld)) - создать индекс по нему - использовать запросы типа: select * from TAB1 where year(datfld)*100+month(datfld)=? select * from TAB1 where datfld_ym=? оптимизатор при обоих запросах должен будет использовать индекс по datfld_ym. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 11:54 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
TORTЕсли есть индекс по полю с датой, то первый вариант однозначно самый медленный... Так как индекс не будет использоваться.... ИМХО, второй и третий варианты одинаковы... Я пользую второй конструкцией...Спасибо. А если индексов, использующих это поле, нет? Моё мнение, что первый вариант в любом случае будет самым медленным. Victor MetelitsaЕщё можно добавить в таблицу generated-поле (назову его Y) по выражению 100 * year(DATFLD) + month(DATFLD) и искать select * from TAB1 where YM=:month + 100 * :year. По YM неплохо не только индексировать, но и использовать в качестве измерения для MDC.Спасибо. Как-нибудь учту при проектировании следующей базы. Сейчас не хотелось бы менять структуру существующей базы. Записей не много - до 50 тыс., поэтому второй вариант из предложенных мною, думаю, будет достаточным. Хотя индекс и напрашивается, но таких полей-дат, по которым производятся различные расчёты и выборки, много. Некоторые разработчики утверждают, что таблицу не стоит нагружать(?) большим количеством индексов. Mark BarinsteinС маркерами параметров надо иметь ввиду следующее: План запроса строится до того, как становятся известны актуальные значения (есть, конечно, варианты с опцией компиляции reopt, но мы рассматриваем общий случай). Если у вашей таблицы не стоит флаг volatile, то план запроса в этом случае трудно предсказать, ведь на этапе компиляции не понятно, какое кол-во строк будет в итоге выбрано. Поэтому, если вы хотите побудить оптимизатор использовать индекс вы можете - при установленной заранее переменной окружения DB2_SELECTIVITY=ALL: select * from TAB1 where DATFLD between ? and ? selectivity 0.00001 - не использовать в таких запросах маркеры, а вместо них - актуальные значения параметров. Тогда оптимизатор по собранной статистике может сам, в зависимости от этих значений, выбрать оптимальный план. ...Спасибо. Таблица not volatile. Насколько разумно побуждать оптимизатор использовать индекс, если количество записей до 50 тыс? В каких условиях рекомендуется побуждать оптимизатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 12:31 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
Semen PopovНасколько разумно побуждать оптимизатор использовать индекс, если количество записей до 50 тыс? В каких условиях рекомендуется побуждать оптимизатор?Если ваша таблица настолько мала, что влезает на одну страницу данных, например, то индекс ей, вероятно, не нужен - страницы всё равно в память целиком считываются. Если же нет, то возможны варианты - там желательно создать индекс и дать возможность оптимизатору оценить, использовать его или нет. 50 тыс. строк не влезут в 1 страницу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 13:11 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinSemen PopovНасколько разумно побуждать оптимизатор использовать индекс, если количество записей до 50 тыс? В каких условиях рекомендуется побуждать оптимизатор?Если ваша таблица настолько мала, что влезает на одну страницу данных, например, то индекс ей, вероятно, не нужен - страницы всё равно в память целиком считываются. Если же нет, то возможны варианты - там желательно создать индекс и дать возможность оптимизатору оценить, использовать его или нет. 50 тыс. строк не влезут в 1 страницу...Спасибо. А если мы будем говорить только о рассчётах, а не выборке записей? Например, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 16:15 |
|
||
|
Какое условие по дате будет быстрее?
|
|||
|---|---|---|---|
|
#18+
Semen PopovА если мы будем говорить только о рассчётах, а не выборке записей? Например, Код: plaintext Т.е. вы должны создать такой индекс и дать оптимизатору возможность решить, какой метод доступа использовать - в зависимости от актуальных значений параметров, т.к. в этом случае нельзя заставлять оптимизатор компилировать запрос без предоставления этих значений. Разумеется, все эти утверждения - не для крошечных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 16:58 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35634463&tid=1603600]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 352ms |

| 0 / 0 |
