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

 

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

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

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


SELECT I / COUNT<DISTINCT OrderJD) FROM OrderJetail s;

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

SELECT ... FROM Customers WHERE LastJarae - ’SMITH':

Если вы здесь подсчитаете различные имена так же, как ранее подсчитывались идентификаторы запросов, то получите сверхоптимистичную селективность, которая предполагает, что вероятность поиска по LastJame-'KMETEC' такая же, как и по LastJame- 'SMITH'. Для каждой фамилии селективность равна п (і) / С, где п (і) — количество строк с і-й отличной от нуля фамилией, а С — общее количество строк в таблице. Если бы вероятность выбора любой фамилии была одинакова, то можно было бы просто подсчитать среднее n( і) / С по всем фамилиям. Это среднее значение было бы одинаково для всех различных фамилий. Однако вероятность поиска фамилии в нашем сценарии равна n(i) / С', где С' — количество строк с фамилиями, не равными null. Следовательно, нам требуется сумма селективностей, умноженных на вероятность появления каждой селективности, то есть сумма (n(i) / C') ? (п(1) / С) по всем фамилиям. Так как C1 — это также сумма отдельных значений n(i), можно подсчитать селективность фильтра на SQL следующим образом:

SELECT SUM С COUNT(LastName)*C0UNT(La St Name))/

(SUM (COUNT (La stJame) )*SUM(C0UNT(*)))

FROM Customers GROUP BY LastJame:

Селективность условия на диапазоне индекса

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

53

и точка конца диапазона. Значением этих конечных точек может быть плюс или минус бесконечность, что означает, что диапазон может быть не ограничен на любом из концов, хотя обычно не на обоих. Диапазон может исключать любую или обе конечных точки в зависимости от природы граничного условия. Например, условие на диапазон (Sal агу > 4000 AND Sal агу < 8000) исключает обе конечных точки граничными условиями неравенства.

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

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

Индексы, базирующиеся на функциях, которые поддерживает Oracle, — основное исключение из этого правила. Они позволяют отдельно индексировать результат применения к столбцам таблицы некоторого выражения (например, UPPER(Last_Name)), чтобы использовать индексированный доступ к условиям по этому выражению, например, UPPER(Last_Name) LIKE ’SMITH%'.

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

Простой пример функции, делающей невозможным использование индекса, — сравнение выражений различных типов, для которого база данных неявно применяет функцию преобразования типов. Например, несовместимое по типу условие CharacterColumn = 94303 на самом деле превращается в Oracle в TO_NUMBER(CharacterColumn) = 94303. Чтобы разрешить эту проблему и использовать индекс по символьному столбцу, выполните преобразование явно. Например:

Таблица 2.1. Соответствия преобразования

Исходное выражение Чем заменить
CharacterColumn=94303 CharacterColumn='94303'
CharacterColumn=TRUNC(SYSDATE) CharacterColumn=TO_CHAR(SYSDATE,'DD-MON-YYYY')

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

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

Даже при сравнении чисел преобразование типов может привести к трудностям, если производитель базы данных поддерживает различные числовые типы, например, целые и десятичные. Преобразование типов также препятствует эффек-
Предыдущая << 1 .. 20 21 22 23 24 25 < 26 > 27 28 29 30 31 32 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100