Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 27

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 21 22 23 24 25 26 < 27 > 28 29 30 31 32 33 .. 161 >> Следующая

54

2. Основы доступа к данным

тивному индексированному соединению, если при этом внешний ключ одного типа указывает на первичный ключ другого типа.

ВНИМАНИЕ ------------------------------------------------------------------------

Чтобы избежать проблем с неявным преобразованием типов, мешающим применению индексов, ваша база данных всегда должна использовать внешние ключи того же типа, что и первичные ключи, на которые они указывают.

При вычислении размера диапазона сканирования индекса можно применять несколько правил.

¦ Условия на ведущий столбец рассматриваемого индекса подходят для выяснения начальной или конечной точки диапазона. Условия на остальные столбцы того же индекса не подходят для выяснения начальной или конечной точки диапазона, если только у вас нет точных условий равенства для всех упомянутых столбцов этого индекса. Например, индекс по (Date_Col umn. ID_Number), если применить его для условия Date_Col umn >= T0_DATE( '2003/01/01'. ' YYYY/MM/DD'), позволяет узнать диапазон сканирования, полностью определенный условием даты. Дальнейшие условия на второй столбец, например, ID_Number=137, не сужают диапазон сканирования. Чтобы сузить диапазон, основываясь на втором условии, вам необходимо просмотреть длинный список диапазонов, по одному для каждого возможного значения Date Col umn, удовлетворяющего первому условию, но серверы баз данных не делают этого. Однако если вы поменяете местами столбцы в индексе, получив (ID_Number, Date_Column), то эти же два условия совместно определят крайние точки диапазона, и сканирование полученного небольшого диапазона индекса будет выполнено быстрее.

ВНИМАНИЕ ------------------------------------------------------------------------

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

¦ Сервер баз данных обычно решает, что Indexed_Col IS NULL определяет слишком большой диапазон значений, чтобы он мог быть полезным, и поэтому игнорирует такие условия при установлении конечных точек диапазона.

ПРИМЕЧАНИЕ------------------------------------------------------------------------

DB2 представляет собой исключение из этого правила. Oracle не хранит ссылки на строки, в которых для всех столбцов индекса присутствуют только значения null. Однако DB2 поддерживает такие ссылки и рассматривает значения null точно так же, как любые другие значения, с той же вероятностью появления. Поэтому DB2 в состоянии работать с планом выполнения, использующим условие «равен null», так как значения null, если они разрешены, встречаются намного чаще, чем отдельные ненулевые значения.

¦ База данных предполагает, что условие Indexed_Col IS NOT NULL покрывает слишком большой диапазон данных, чтобы он был полезным, поэтому она не будет использовать индекс для этого условия. В редких случаях присутствие любого ненулевого значения настолько маловероятно, что предпочтительней становится сканирование диапазона индекса по всем возможным ненулевым значениям. В таких случаях, если вы можете определить безопасную нижнюю или верх-
Вычисление селективности

55

нюю границу диапазона всех возможных значений, то сможете использовать сканирование диапазона с условием, например, Positive_ID_Column > -I or Date_Col umn > T0_DATEC 0001/01/01'. ' YYYY/MM/DD’).

¦ Условие Indexed_Char_Col LIKE ' ABC*' устанавливает начальную и конечную точки допустимого диапазона для индекса, причем Indexed_Char_Col является ведущим столбцом индекса. Схожим образом работает блок сравнения шаблонов в SQL, где % является символом подстановки.

¦ Условие Indexed_Char_Col LIKE 1 ABCffiEF1 также задает начальную и конечную точки допустимого диапазона, но в этом случае только часть 'ABCX' сужает диапазон сканирования индекса.

¦ Условие Indexed_Number_Column LIKE '123?' не устанавливает начальную и конечную точки допустимого диапазона, так как сравнение LIKE имеет смысл только для строк символов. В этом случае серверу для проверки условия необходимо неявно преобразовать Indexed_Number_Column в строку символов, делая невозможным применение любого индекса, для которого ведущим является столбец Indexed_Number_Col umn. В терминах чисел это условие задает целую группу диапазонов:

(Indexed_Number_Column >= 123 AND Indexed_Number_Column <124) OR (Indexed_Number_Column >= 1230 AND Indexed_Number_Column <1240) OR (Indexed_Number_Column >= 12300 AND Indexed_Number_Column < 12400) OR...

¦ Условие Indexed_Char_Col LIKE ' ШС?' вообще не задает начальную и конечную точки допустимого диапазона, так как стартовый символ подстановки указывает, что этот шаблон может появиться в любом месте индекса.

¦ Равенство (=), BETWEEN и большинство неравенств (<, <=, >, >=) для первых столбцов индексов устанавливают допустимые конечные точки диапазона индекса.

¦ Неравенство вида «не равно», которое обычно выражается как != или <>, не устанавливает диапазон индекса, так как база данных не считает такое условие достаточно селективным, чтобы использовать для него индексный доступ. Если исключенное значение покрывает практически все строки, а другие значения встречаются редко, можно включить индексный доступ, заменив условие Column!=1DominantVaIue' HaColumn IN (<список остальных, редко встречающихся значений>), хотя с изменением приложения с течением времени такой подход может стать неудобным.
Предыдущая << 1 .. 21 22 23 24 25 26 < 27 > 28 29 30 31 32 33 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100