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

Многопоточность поиска по 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.

 

При выполнении запросов к базе данных в утилите WISQL установим режим показа плана выполнения запроса (выбрав элемент меню Session | Basic Settings и отметив режим Display Query Plan). Тогда при выполнении запросов будет выводиться и план их выполнения. Под планом выполнения запроса понимается перечень индексов, используемых InterBase при выполнении запроса. Слово NATURAL означает последовательный перебор таблицы.

Для принудительного выполнения запроса по тому или иному плану, следует в операторе SELECT использовать предложение

 

PLAN <план _выполнения_запроса> = [JOIN | [SORT] MERGE]

(<элемент_плана> | <план _выполнения_запроса> [, <элемент_плана> |

<план _выполнения_запроса> ...]) <элемент_плана> = {таблица | псевд.}

NATURAL | INDEX (<индекс> [, <индекс> ...]) | ORDER <индекс>

 

Синтаксис предложения PLAN относится как к единичной таблице базы данных, так и к нескольким таблицам. В последнем случае выполняется соединение таблиц для увеличения скорости выполнения запроса, что определяется использованием необязательного ключевого слова JOIN. В том случае, если не существует индексов, по которым данные таблицы могли бы быть соединены, для увеличения скорости выполнения запроса указывают ключевые слова SORT MERGE.

<элемент_плана> – является именем таблицы, в которой производится поиск данных. В том случае, если одна и та же таблица несколько раз участвует в запросе, для сокращения текста плана полезно использовать ее псевдоним, то есть обозначение, указываемое в предложении FROM после имени таблицы. Следующие ключевые слова определяют способ доступа к данным.

NATURAL (по умолчанию) – указывает, что для поиска записей применяется последовательный доступ. Это единственный способ поиска записей в том случае, если нет подходящих индексов.

INDEX – указывает один или несколько индексов, которые должны использоваться для поиска записей, удовлетворяющих условию запроса.

ORDER – указывает, что <элемент_плана> должен быть отсортирован по указанному индексу.