Учебное пособие Санкт-Петербург «бхв-петербург»



Pdf көрінісі
бет193/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   189   190   191   192   193   194   195   196   ...   256
sql osnovi yazika

INSERT INTO aircrafts
VALUES ( '123', 'Cessna 208 CARAVAN', 1300);
ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности
"aircrafts_unique_model_key"
ПОДРОБНОСТИ: Ключ "(lower(model))=(cessna 208 caravan)" уже существует.
Встроенная функция lower преобразует все символы в нижний регистр. Индекс стро-
ится уже на основе преобразованных значений, поэтому при поиске строки в таблице
искомое значение сначала переводится в нижний регистр, а затем осуществляется
поиск в индексе.
Индексы на основе выражений требуют больше ресурсов для их создания и поддер-
жания при вставке и обновлении строк в таблице. Зато при выполнении выборок,
построенных на основе сложных выражений, работа происходит с меньшими на-
кладными расходами, поскольку в индексе хранятся уже вычисленные значения этих
выражений, пусть даже самых сложных. Поэтому такие индексы целесообразно ис-
пользовать тогда, когда выборки производятся многократно, и время, затраченное
на создание и поддержание индекса, компенсируется (окупается) при выполнении
выборок из таблицы.
8.5. Частичные индексы
PostgreSQL поддерживает очень интересный тип индексов — частичные индексы.
Такой индекс формируется не для всех строк таблицы, а лишь для их подмножества.
248


8.5. Частичные индексы
Это достигается с помощью использования условного выражения, называемого пре-
дикатом индекса
. Предикат вводится с помощью предложения WHERE.
В качестве иллюстрации создадим частичный индекс для таблицы «Бронирования».
Представим, что руководство компании интересуют бронирования на сумму свыше
одного миллиона рублей. Такая выборка выполняется с помощью запроса
SELECT *
FROM bookings
WHERE total_amount > 1000000
ORDER BY book_date DESC;
book_ref |
book_date
| total_amount
----------+------------------------+--------------
D7E9AA
| 2016-10-06 09:29:00+08 |
1062800.00
EF479E
| 2016-09-30 19:58:00+08 |
1035100.00
3AC131
| 2016-09-28 05:06:00+08 |
1087100.00
3B54BB
| 2016-09-02 21:08:00+08 |
1204500.00
65A6EA
| 2016-08-31 10:28:00+08 |
1065600.00
(5 строк)
Время: 90,996 мс
Хотя сортировка строк производится по датам бронирования в убывающем порядке,
т. е. от более поздних дат к более ранним, тем не менее, включать ключевое слово
DESC в индексное выражение, когда индекс создается только по одному столбцу, нет
необходимости. Это объясняется тем, что PostgreSQL умеет совершать обход индекса
как по возрастанию, так и по убыванию с одинаковой эффективностью.
Обратите внимание, что индексируемый столбец book_date не участвует в форми-
ровании предиката индекса — в предикате используется столбец total_amount. Это
вполне допустимая ситуация.


Достарыңызбен бөлісу:
1   ...   189   190   191   192   193   194   195   196   ...   256




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет