Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / IBM DB2, WebSphere, IMS, U2, etc |
![]() ![]() |
the_moon Member Откуда: Германия Сообщений: 332 |
Привет, играет ли какую то роль порядок условий в where в случае DB2? Имею ввиду, есть индекс по полям А, Б, В, есть индекс по полям Г, Д Нужно в таком же порядке записывать условия в селекте? where А = 1 AND Б = 2 AND В = 3 AND Г = 4 И еще, есть проиндексированное поле, в котором три разных значения "NEW", "UPDATE", "CANCEL" Как лучше искать (STATE = "NEW" OR STATE = "UPDATE") или STATE in ( "NEW", "UPDATE" ) или STATE <> "CANCEL" Может все это не имеет значения и все апросы все равно будут переписанны в соотвествии со статистиками? Спасибо Может есть умная статья по этому поводу? |
13 май 16, 12:22 [19168362] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
the_moon, порядок роли не играет. в силу коммутативности и транзитивности оператора AND |
13 май 16, 12:58 [19168557] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
the_moon, если в поле всего три значения и распределение данных близко к равномерному, то как ни пиши - индекс использовать не будет в виду его низкой селективности |
13 май 16, 13:01 [19168576] Ответить | Цитировать Сообщить модератору |
the_moon Member Откуда: Германия Сообщений: 332 |
Да это аргумент. А если "CANCEL" значение встречается реже чем "NEW" и "UPDATE" и индекс составной к примеру по CLIENTNO, CONTRACTNO и STATE где CLIENTNO, CONTRACTNO это внешние ключи? |
||
13 май 16, 13:22 [19168707] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
Неверно в случае MDC (многомерных кластеров), которые построены как индексы (вместо RID-ов блоки строк). OR, если я правильно помню, переписывается на IN. |
||
13 май 16, 14:20 [19169026] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
Судя по контексту, CLIENTNO и CONTRACTNO в условии фильтрации не упоминаются. Знаю про два возможных сценария использования. 1. Индекс полностью сканируется, в процессе фильтруется по STATE='CANCEL'. 2. Для возможной каждой пары (CLIENTNO, CONTRACTNO) ищется STATE='CANCEL' (как если бы это был UNION ALL из индексов) Не вполне уверен, что DB2 умеет второй сценарий. Да лучше натравите на свой запрос Index Adivser и спросите его, что он предложит. |
||||
13 май 16, 14:29 [19169056] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||
13 май 16, 14:31 [19169064] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
Индексы у DB2 в ораклячьем смысле компрессованные, т.е. для каждого значения идёт список RID'ов (у Oracle надо явно задавать, у DB2 всегда). Это ещё не считая собственно DB2-шной компрессии. Поэтому, когда selectivity слаба, они очень-очень маленькие. Для случаев select count(*) from ... where state=:var (то бишь, index only access) очень выгодные, несмотря на слабую selectivity. |
13 май 16, 14:35 [19169084] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
MDC - один из видов табличного партишионирования, хотя в чём-то лучше ораклячьего, а в чём-то хуже. Люди ораклячье партишионирование где-то видят. Ну да, на DB2 я имею дело только с самописной системой, а Oracle у нас SE1, но не все люди такие. |
||||
13 май 16, 14:40 [19169098] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.perf.doc/doc/c0005296.html?lang=en - пример переписывания OR в IN http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.perf.doc/doc/c0024525.html?lang=en а дальше IN может превратиться в Join |
13 май 16, 14:50 [19169153] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.perf.doc/doc/c0005299.html?lang=en см. про Index Jump Scan. Однако из описания и примеров непонятно, может ли первая колонка быть Index Gap'ом. |
13 май 16, 14:56 [19169194] Ответить | Цитировать Сообщить модератору |
Victor Metelitsa Member Откуда: Тюмень Сообщений: 2551 |
Не может (пока?). Тут куча примеров на тему: http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.perf.doc/doc/r0024842.html?lang=en |
13 май 16, 15:24 [19169381] Ответить | Цитировать Сообщить модератору |
Все форумы / IBM DB2, WebSphere, IMS, U2, etc | ![]() |