Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Неделя 11 Лекция 1 (16).doc
Скачиваний:
1
Добавлен:
13.11.2019
Размер:
120.32 Кб
Скачать

16.3.3. Частичное использование составного индекса.

Если запросы часто используют для поиска одни и те же столбцы, следует построить по этим столбцам индекс (если это возможно), так, чтобы чаще используемые столбцы выступали в качестве ведущих полей индекса. Тогда при поиске может быть использована часть индексных полей.

Пример. Пусть часто выполняются запросы

SELECT *

FROM SOMETABLE

WHERE A = : ParamA AND В = :ParamB

SELECT *

FROM SOMETABLE

WHERE A = : ParamA AND В = .-ParamB AND С = : ParamC

SELECT *

FROM SOMETABLE

WHERE A = : ParamA AND В = :ParamB AND С = :ParamC AND D = :ParamD

SELECT *

FROM SOMETABLE

ORDER ВУ А,В

Тогда, построив индекс по столбцам А, В, С, D, мы можем с большой долей уверенности утверждать, что данный индекс будет использован при оптимизации всех четырех запросов. В первом случае будут использовано подмножество индекса, т.е. значения А, В; во втором - значения А, В, С, в третьем - А, В, С, D (то есть все значения индекса); в четвертом - А, В.

Следует помнить, что при использовании в запросах не всех столбцов из индекса, можно использовать только непрерывную последовательность столбцов, что важно для указания порядка сортировки в предложении ORDER BY. Например, если индекс построен по столбцам А, В, С, D, этот индекс не может использоваться для выполнения запросов

SELECT *

FROM SOMETABLE

ORDER BY А, С

SELECT *

FROM SOMETABLE

ORDER BY B,D

Порядок следования условий по столбцам в предложении WHERE оператора SELECT не важен (если условия объединены с помощью AND). Например, для выполнения следующих запросов может использоваться один и тот же индекс:

SELECT *

FROM SOMETABLE

WHERE A = 100 AND В = 200

SELECT *

FROM SOMETABLE

WHERE В = 200 AND A = 100

Однако при указании уровней сортировки в предложении ORDER BY оператора SELECT порядок следования столбцов является существенным. Например, для выполнения следующих запросов не может использоваться один и тот же индекс:

SELECT *

FROM SOMETABLE

ORDER BY А, В, С

SELECT *

FROM SOMETABLE

ORDER BY А, С, В

16.3.4. Уменьшение общего количества индексов.

Следует стремиться к уменьшению количества индексов, поскольку при большом их количестве снижается скорость добавления, изменения и удаления записей в таблицах базы данных. Как правило, в базе данных определяется два вида индексов: индексы, фактически использующиеся запросами для доступа к данным, и индексы, введенные в базе данных для обеспечения ссылочной целостности между родительскими и дочерними таблицами базы данных. Если индексы не используются при доступе к данным, их следует удалять, а ссылочную целостность обеспечивать с использованием триггеров.

16.3.5. Многопоточность поиска по or и in.

При частом использовании в условной части WHERE оператора SELECT нескольких столбцов, связанных между собой операцией "или" (OR):

SELECT *

WHERE A = 100 OR В = 200 OR С = 300

вместо индекса по столбцам А, В, С лучше создать несколько индексов, построенных по каждому из этих полей, поскольку в противном случае будет осуществлен последовательный просмотр всей таблицы. Это неудивительно, так как индексно-последовательный доступ для индексов А, В, С может быть осуществлен только для столбца А; значения столбцов В и С в этом случае спонтанно разбросаны по индексу. Важно помнить, что при использовании оператора OR в условной части оператора SELECT каждая часть условия влечет за собой отдельное сканирование таблиц, участвующих в запросе. Так, например, при выполнении оператора SELECT с условной частью

WHERE A = 100 OR В = 200 OR С = 300

будет осуществлено три отдельных сканирования таблицы (таблиц) для поиска значений, удовлетворяющих условиям А = 100; В = 200; С = 300.

Отдельный поток поиска порождает и каждый элемент в списке IN. Например,

WHERE A IN (100, 200, 300)

интерпретируется как

WHERE A = 100 OR A = 200 OR A = 300.

Однако при указании диапазона BETWEEN

WHERE A BETWEEN 100 AND 300

этого не происходит. Поэтому там, где возможно, следует заменять IN на BETWEEN.