Delphi 3 и создание приложений баз данных

         

Многопоточность поиска по OR и IN


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

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

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

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

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

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

WHERE A IN (100,200,300)

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

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

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

WHERE A BETWEEN 100 AND 300

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



Содержание раздела