Учебно-практическое пособие москва 2017 ббк


INSERT INTO aircrafts VALUES ( '123', 'Cessna 208 CARAVAN', 1300)



Pdf көрінісі
бет188/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   184   185   186   187   188   189   190   191   ...   243
Байланысты:
Язык SQL. Базовый курс

INSERT INTO aircrafts VALUES ( '123', 'Cessna 208 CARAVAN', 1300);
ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности
"aircrafts_unique_model_key"
,

ПОДРОБНОСТИ: Ключ "(lower(model))=(cessna 208 caravan)" уже существует.
Встроенная функция lower преобразует все символы в нижний регистр. Индекс стро-
ится уже на основе преобразованных значений, поэтому при поиске строки в табли-
це искомое значение сначала переводится в нижний регистр, а затем осуществляется
поиск в индексе.
Индексы на основе выражений требуют больше ресурсов для их создания и поддер-
жания при вставке и обновлении строк в таблице. Зато при выполнении выборок, по-
строенных на основе сложных выражений, работа происходит с меньшими наклад-
ными расходами, поскольку в индексе хранятся уже вычисленные значения этих вы-
ражений, пусть даже самых сложных. Поэтому такие индексы целесообразно исполь-
зовать тогда, когда выборки производятся многократно, и время, затраченное на со-
здание и поддержание индекса, компенсируется (окупается) при выполнении выбо-
рок из таблицы.
193


8.5 Частичные индексы
PostgreSQL поддерживает очень интересный тип индексов —
частичные индексы
.
Такой индекс формируется не для всех строк таблицы, а лишь для их подмножества.
Это достигается с помощью использования условного выражения, называемого
пре-
дикатом индекса
. Предикат вводится с помощью предложения WHERE.
В качестве иллюстрации создадим частичный индекс для таблицы «Бронирования»
(bookings). Представим, что руководство компании интересуют бронирования на
сумму свыше одного миллиона рублей. Такая выборка выполняется с помощью за-
проса
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   ...   184   185   186   187   188   189   190   191   ...   243




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

    Басты бет