Как DB2 реагирует без функционального индекса - PullRequest
2 голосов
/ 22 марта 2012

У меня есть таблица, как

Table1:

col1
col2
col3

и иметь индекс выше col3. Если я выберу данные из таблицы по следующему запросу.

SELECT * FROM Table1 WHERE LCASE(col3) ='abcde'

Индекс помогает по производительности?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2015

Теперь Db2 наконец-то поддерживает индексы на основе выражений. Индекс на основе функций AKA, доступный в DB2 10.5 +

https://www.ibm.com/developerworks/community/blogs/DB2PLSQL/entry/db2_expression_based_indexes?lang=en

Теперь вы можете создать индекс, например

CREATE INDEX col3_lcase_idx  on Table1 ( LCASE(col3) )
RUNSTATS ON TABLE Table1 AND INDEXES ALL
2 голосов
/ 22 марта 2012

Краткий ответ: Нет.

Длинный ответ: Нет.

Представьте следующее содержимое в вашем col3:

Foo
bar
baz
foo
BAR

Индекс на col3 будет знать этот порядок:

BAR
Foo
bar
baz
foo

Однако порядок запроса lcase (col3) будет

bar
BAR
baz
foo
Foo

полностью отличаться от индекса, поэтому индекс имеет ограниченное использование.

Однако вы можете добавить автоматически созданное поле с нижним регистром к вашей таблице:

ALTER TABLE Table1
      ADD COLUMN col3_lcase VARCHAR(?) 
          GENERATED ALWAYS AS ( LCASE(col3) );
CREATE INDEX col3_lcase_idx ON Table1 ( col3_lcase );

при выборе выше будет использоваться индекс col3_lcase_idx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...