Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Порядок условий в where  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Добрый Э - Эх
Guest
the_moon,

порядок роли не играет. в силу коммутативности и транзитивности оператора AND
13 май 16, 12:58    [19168557]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Добрый Э - Эх
Guest
the_moon,

если в поле всего три значения и распределение данных близко к равномерному, то как ни пиши - индекс использовать не будет в виду его низкой селективности
13 май 16, 13:01    [19168576]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
the_moon
Member

Откуда: Германия
Сообщений: 332
Добрый Э - Эх
the_moon,

если в поле всего три значения и распределение данных близко к равномерному, то как ни пиши - индекс использовать не будет в виду его низкой селективности


Да это аргумент. А если "CANCEL" значение встречается реже чем "NEW" и "UPDATE" и индекс составной к примеру по CLIENTNO, CONTRACTNO и STATE

где CLIENTNO, CONTRACTNO это внешние ключи?
13 май 16, 13:22    [19168707]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
Добрый Э - Эх
the_moon,

если в поле всего три значения и распределение данных близко к равномерному, то как ни пиши - индекс использовать не будет в виду его низкой селективности


Неверно в случае MDC (многомерных кластеров), которые построены как индексы (вместо RID-ов блоки строк).

OR, если я правильно помню, переписывается на IN.
13 май 16, 14:20    [19169026]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
the_moon
Добрый Э - Эх
the_moon,

если в поле всего три значения и распределение данных близко к равномерному, то как ни пиши - индекс использовать не будет в виду его низкой селективности


Да это аргумент. А если "CANCEL" значение встречается реже чем "NEW" и "UPDATE" и индекс составной к примеру по CLIENTNO, CONTRACTNO и STATE

где CLIENTNO, CONTRACTNO это внешние ключи?


Судя по контексту, CLIENTNO и CONTRACTNO в условии фильтрации не упоминаются. Знаю про два возможных сценария использования.

1. Индекс полностью сканируется, в процессе фильтруется по STATE='CANCEL'.
2. Для возможной каждой пары (CLIENTNO, CONTRACTNO) ищется STATE='CANCEL' (как если бы это был UNION ALL из индексов)

Не вполне уверен, что DB2 умеет второй сценарий.

Да лучше натравите на свой запрос Index Adivser и спросите его, что он предложит.
13 май 16, 14:29    [19169056]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Добрый Э - Эх
Guest
Victor Metelitsa
Неверно в случае MDC
и много ты их в среднестатистической системе видел? Я ни одного.
13 май 16, 14:31    [19169064]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
Индексы у DB2 в ораклячьем смысле компрессованные, т.е. для каждого значения идёт список RID'ов (у Oracle надо явно задавать, у DB2 всегда). Это ещё не считая собственно DB2-шной компрессии. Поэтому, когда selectivity слаба, они очень-очень маленькие. Для случаев select count(*) from ... where state=:var (то бишь, index only access) очень выгодные, несмотря на слабую selectivity.
13 май 16, 14:35    [19169084]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
Добрый Э - Эх
Victor Metelitsa
Неверно в случае MDC
и много ты их в среднестатистической системе видел? Я ни одного.

MDC - один из видов табличного партишионирования, хотя в чём-то лучше ораклячьего, а в чём-то хуже. Люди ораклячье партишионирование где-то видят. Ну да, на DB2 я имею дело только с самописной системой, а Oracle у нас SE1, но не все люди такие.
13 май 16, 14:40    [19169098]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
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]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
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]     Ответить | Цитировать Сообщить модератору
 Re: Порядок условий в where  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2548
Не может (пока?).
Тут куча примеров на тему:

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 Ответить