Комментарии 8
Спасибо. Было интересно почитать. Очень понравилась идея использовать при создании индекса вычисляемые значения, а не как на SQL Server — вначале создавать COMPUTED столбец, а потом по нему строить индекс:
SELECT *
FROM ...
WHERE CAST(InsertDateTime AS DATE) = '20160101'
ALTER TABLE ...
ADD InsertDate AS CAST(InsertDateTime AS DATE)
CREATE NONCLUSTERED INDEX ix ON ... (InsertDate)
SELECT *
FROM ...
WHERE InsertDate = '20160101'
+2
Дополните пожалуйста статью. Одно из назначений функциональных индексов — это уникальность по какому либо параметру при условии. Например — у нас есть таблица с утверждаемыми документами, в которой есть поле — основание (другой документ). И есть требование — основание должно быть уникально для документов в статусе на рассмотрении и утвержден, и не уникально для черновиков и отказанных документов. Тогда нам необходимо выполнить что то типа:
CREATE UNIQUE INDEX uidx_uniq_justif ON t ( case when(status=2 or status=3) then justification_id else null end;); (не работал имено с постгрессом)
Это довольно таки частое использование function based indexes
CREATE UNIQUE INDEX uidx_uniq_justif ON t ( case when(status=2 or status=3) then justification_id else null end;); (не работал имено с постгрессом)
Это довольно таки частое использование function based indexes
+2
В PostgreSQL есть более элегантное решение данной проблемы:
CREATE UNIQUE INDEX uidx_uniq_justif ON t (justification_id) WHERE status=2 or status=3;
Подробнее можно прочесть здесь
CREATE UNIQUE INDEX uidx_uniq_justif ON t (justification_id) WHERE status=2 or status=3;
Подробнее можно прочесть здесь
+4
В Постгресе для этого существуют «частичные индексы». Подробнее можно ознакомиться документации
+2
А еще функциональные индексы крайне полезны для регистронезависимого поиска по строковому полю.
Делаем индекс на LOWER(название_поля), а в запросе пишем условие LOWER(искомая_строка) = LOWER(название_поля).
Если этого не делать, то, в отличии от MySQL, по умолчанию поиск будет регистро зависимым. И обычный индекс помочь не сможет.
Делаем индекс на LOWER(название_поля), а в запросе пишем условие LOWER(искомая_строка) = LOWER(название_поля).
Если этого не делать, то, в отличии от MySQL, по умолчанию поиск будет регистро зависимым. И обычный индекс помочь не сможет.
+3
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
О полезности индексов по выражениям