- •Содержание
- •16.1. Направления оптимизации работы с базой данных.
- •16.2. Оптимизация структуры базы данных.
- •16.3. Оптимизация запросов к базе данных.
- •16.3.1. Оптимальная структура индекса.
- •16.3.2. Эффективность использования индекса.
- •16.3.3. Частичное использование составного индекса.
- •16.3.4. Уменьшение общего количества индексов.
- •16.3.5. Многопоточность поиска по or и in.
- •16.3.6. Просмотр плана выполнения запросов.
- •16.4. Оптимизация клиентских приложений.
- •16.4.1. Минимизация соединения с базой данных.
- •16.4.2. Использование tQuery.
- •16.4.3. Перенос тяжести вычислительной работы на сервер.
- •Контрольные вопросы:
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.