Слайд 2
Виды индексов:
B-деревья
Инвертированный индекс
Hash-индексы
Индексы на основе битовых карт
Пространственные индексы
Слайд 3
Поиск документов по содержащимся в них словам
WHERE Field1
like ‘%алгоритм%’
Полное сканирование таблицы
Слайд 4
Инвертированные индексы
Документ (текстовое поле) – это последовательность слов
D1:
w1 w2 w3 w1 w4 w2
D2: w1 w7 w8
w9 w5
D3: w1 w7 w3 w2 w8
Слайд 5
Поиск документов по содержащимся в них словам
Задача:
W1: d1
d2 d3
W2: d1 d3
W3: d1
W5: d2
Слайд 6
Полнотекстовый индекс FULLTEXT
В полнотекстовый индекс включается один или
несколько символьных столбцов в таблице.
Эти столбцы могут иметь
тип данных:
char, varchar, nchar, nvarchar, text, ntext, image, xml и varbinary(max).
Каждому столбцу может соответствовать определенный язык (из 50-ти возможных).
Английский 1033,
Русский 1049.
Слайд 7
Процесс полнотекстового индексирования
Фильтрацию, разбиение по словам,
Удаление стоп-слов
и нормализация токенов
Преобразует конвертированные данные в инвертированный список слов
Создание полнотекстового индекса.
Слайд 8
Обработка полнотекстовых запросов
разбиение по словам
расширение тезауруса
морфологический поиск
обработка
стоп-слов
поиск в индексе
ранжирование
Слайд 9
В полнотекстовых запросах не учитывается регистр букв.
Все
полнотекстовые запросы используют предикаты (CONTAINS и FREETEXT) и функции
(CONTAINSTABLE и FREETEXTTABLE)
Слайд 10
CONTAINS
Предикат, используемый в предложении WHERE для и проверки
точного или нечеткого совпадения с отдельными словами, расстояния между
словами или взвешенных совпадений.
CONTAINS ( { column_name | * } , 'condition')
слова или фразы;
префикса слова или фразы;
слова около другого слова;
Слайд 11
FREETEXT
Этот предикат используется в предложении WHERE для поиска
значений, которые соответствуют условию поиска по смыслу, а не
написанию.
FREETEXT ( { column_name | * } , 'string' )
Разбивает строку на отдельные слова
Формирует словоформы.
Определяет список расширений или замен на основании совпадений в тезаурусе.
Слайд 12
Виды запросов
Простое выражение.
Префиксные выражения.
Производное выражение.
Выражения с учетом расположения.
Синонимы.
Взвешенное
выражение.
Слайд 13
Простое выражение
Одно или несколько конкретных слов или фраз.
{
AND | & } | { AND NOT |
&! } | { OR | | }
SELECT Comments
FROM ProductReview
WHERE CONTAINS(Comments, 'ужасно');
… CONTAINS(Comments, 'ужасно OR плохо');
Слайд 14
Префиксные выражения
Слова, начинающиеся заданным текстом, или фразы с
такими словами.
… CONTAINS(Comments, ' "ужасн*" ');
Слайд 15
Производное выражение
Словоформы конкретного слова.
Синонимические формы конкретного слова.
SELECT *
FROM t3 WHERE freetext(s,'рама')
Слайд 16
Выражения с учетом расположения
Слова или фразы, находящиеся рядом
с другими словами или фразами.
CONTAINS(*,'мама ~ мыла')
Слайд 17
Взвешенное выражение
Слова или фразы со взвешенными значениями ()
SELECT
* from CONTAINSTABLE (
t3
, *
, 'ISABOUT (мама WEIGHT(0.9)
, auto
WEIGHT(0.1)) ' )
ORDER BY RANK;
Результат: ранжированная таблица (ключ, ранг)
Слайд 18
Для FULL TEXT индекса
Выбрать столбцы таблицы или индексированного
представления
Построить для таблицы индекс по одному полю, которое не
позволяет дубликатов и нулевых значений
Построить каталог
А потом уже строить индекс…
Слайд 19
Создание каталога
CREATE FULLTEXT CATALOG catalog_name
Полнотекстовый каталог — это
логическое понятие, обозначающее группу полнотекстовых индексов.
Слайд 20
Создание FULL TEXT индекса
CREATE FULLTEXT INDEX ON table_name
[ ( { column_name
[ TYPE COLUMN type_column_name ]
[ LANGUAGE language_term ]
[ STATISTICAL_SEMANTICS ]
} [ ,...n]
) ]
KEY INDEX index_name
Слайд 21
Полнотекстовый индекс FULLTEXT
Загрузка данных в таблицу, уже
имеющую индекс FULLTEXT, будет более медленной.
Слайд 22
Индексы на основе битовых карт
create bitmap index ind_4
on table_1(field1)
Нужны тогда, когда у столбца может быть ограниченное
число значений.
В индекс входят:
значение столбца
битовая последовательность по количеству строк таблицы, в кот. 1 означает, что в данной строке атрибут принимает заданное значение
Слайд 24
create bitmap index ind_4 on table_1(рост):
Высокий 0010001000
Средний 1101110100
Ниже среднего 0000000011
Слайд 25
create bitmap index ind_4 on table_1(рост):
Блондинка 1100010000
Шатенка 0010000100
Брюнетка 0000101001
Рыжая 0001000010
Слайд 26
Блондинка среднего роста:
Блондинка 1100010000
Средний 1101110100
Побитовое умножение 1100010000
Слайд 27
Появилась девушка с голубыми волосами:
Блондинка 1100010000
Шатенка 0010000100
Брюнетка 0000101001
Рыжая 0001000010
Мальвина 00000000001
Слайд 28
Индексы на основе битовых карт
Индексы на основе битовых
карт обычно создаются быстрее и могут занимать удивительно мало
места.
Размер индекса на основе битовых карт существенно зависит от распределения данных.
Индексы на основе битовых карт обычно выбираются стоимостным оптимизатором, если для выполнения запроса можно использовать несколько таких индексов.
Изменения столбцов, входящих в индексы на основе битовых карт, а также вставки и удаления данных могут вызывать существенные конфликты блокировок.
Изменения столбцов, входящих в индексы на основе битовых карт, а также вставки и удаления данных могут весьма существенно "ухудшать" индексы.
Слайд 29
Hash-индекс
Выбираем количество участков, в которых будем размещать записи.
Подбираем
функцию перемешивания, которая от ключевого столбца будет выдавать номер
участка.
В памяти храним таблицу адресов участков
Слайд 30
Создание hash-индекса
CREATE INDEX имя_индекса
USING HASH
ON
имя_таблицы (имя_столбца)
Слайд 32
Hash-индекс
Для размещения таблицы отводится заданное количество участков
Есть
функция hash(key)=n, где n – номер участка
В памяти хранится
таблица адресов участков
Доступ к данным за одно обращение к диску
Слайд 33
Недостатки hash-индексов
Таблица адресов участков может быть слишком велика
Если
в один участок попало слишком много записей, придется выделять
дополнительный блок.
Проблема – неравномерность размещения записей, возникновение коллизий
Слайд 35
Функции Hash
Деление
Мультипликативный метод
Слайд 36
Функции Hash деление
Размер таблицы hashTableSize - простое число.
Хеширующее значение hashValue, изменяющееся от 0 до (hashTableSize -
1), равно остатку от деления ключа на размер хеш-таблицы.
Увеличиваем число участков в два раза
Слайд 37
Функции Hash мультипликативный метод
Размер таблицы hashTableSize есть
степень 2n.
Значение key умножается на константу, затем от
результата берется n бит.
В качестве такой константы Кнут рекомендует золотое сечение (sqrt(5) - 1)/2 = 0.6180339887499.
Слайд 38
Функции Hash
для строк переменной длины
Аддитивный метод –
преобразовываем слова в числа, складываем и берем остаток деления
по модулю 256.
Метод ИЛИ
Слайд 41
Пространственные типы данных
geometry используется для планарных или евклидовых данных
geography, который используется для хранения эллиптических данных, таких как
координаты GPS широты и долготы
Слайд 42
Пространственные типы данных
geometry используется для планарных или евклидовых данных
geography, который используется для хранения эллиптических данных, таких как
координаты GPS широты и долготы
объекты geography должны помещаться в одном полушарии, расстояние обычно вычисляется в метрах
Слайд 43
Пространственные типы данных
Point
MultiPoint
LineString
MultiLineString
Polygon
Слайд 44
R-дерево
Избавляемся от формы – окружаем фигуру min ограничивающим
прямоугольником
(oid, Rectangle), oid – ссылка на запись
Слайд 45
Иерархия R-дерева
Окружаем фигуры
ограничивающими
прямоугольниками
(cp, Rectangle)
При переполнении
делим пополам
Слайд 46
Критерии разделения узла
Минимальная площадь
Минимальное перекрытие
Минимальные границы
Слайд 48
R-дерево - недостатки
Не удается избежать перекрытий – необходим
просмотр нескольких веток
Слайд 50
Spatial grid
CREATE SPATIAL INDEX
4 уровня вложенности
Слайд 51
Spatial grid
Декомпозиция индексированного пространства в cеточную иерархию
Считывает
данные из пространственного столбца по строкам.
Тесселяция - помещаем
объект в cеточную иерархию, устанавливая связь между объектом и набором сеточных ячеек, с которыми он соприкасается.
Слайд 52
Правила тесселяции
Правило покрытия
Правило ячеек на объект
Правило самой глубокой
ячейки