Поддержка сайта

Высокие позиции в поисковой системе, на прямую зависят от развития вашего сайта.

Продвижение сайтов

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

Создание сайтов

Мы делаем сайты быстро, недорого и профессионально. От работы с нами, у вас останутся только положительные эмоции.

Эффективный текстовый поиск в SQL Server

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

Индекс — это программная конструкция реляционной базы данных (в том числе и SQL Server), ускоряющая доступ к строкам таблиц. Название заимствовано от индексного справочника, обычно приводимого в конце книги. Индексы структурируются с целью облегчения сканирования и содержат небольшой объем данных, ссылающихся на большие куски информации. Например, если в индексном справочнике книги нужно найти ссылку для слова Index, то мы обращаемся к разделу "I", затем находим в нем слово "Index" и получаем ссылки на несколько страниц книги, где обсуждается термин Index.

Обычно индексы применяются для упорядочения информации, содержащейся в столбце, в алфавитном порядке. SQL Server в принципе делает то же самое, что и индексный справочник книги, но используемые для этого методы существенно улучшены за последний десяток лет.

Например, если нужен список покупателей, фамилии которых начинаются на "С", то в таблице Customers создается индекс по столбцу фамилий, что ускоряет выполнение запроса. Другими словами, SQL Server строит упорядоченный по алфавиту список всех фамилий. При поиске фамилии на букву "С" SQL Server быстро переходит к нужному разделу списка и получает ссылки на все затребованные фамилии (которые ограничиваются снизу секцией фамилий на букву "D").

Однако запросы "Какие фамилии оканчиваются на С?" и "Какие товары содержат в описании слово espresso?" не будут поддержаны созданным индексом SQL Server, поскольку он предназначен для других целей. Реализация нестандартных запросов обсуждается в конце главы.

Microsoft SQL Server поставляется с инструментом Query Analyzer, который помогает понять внутренние действия SQL Server во время исполнения запроса. Рассмотрим анализ простого запроса SQL в Query Analyzer.

Запрос к базе данных JoCoffee в Query Analyzer

1. В SQL Server Enterprise Manager найдите базу данных JoCoffee и выполните команду панели инструментов Tools  SQL Server Query Analyzer. Будет запущен Query Analyzer, и откроется новая панель запроса.

2. По умолчанию выделяется главная база данных (master database). Раскройте список в верхнем правом углу и перейдите в базу данных JoCoffee.

3. Введите следующий запрос SQL и выполните команду Query  Execute: SELECT * FROM Products WHERE name=’carezza’

Это простейший оператор SQL, который выделяет все содержащие имя carezza строки в таблице Products.

Анализаторы запросов известны тем, кто когда-либо работал с базами данных. Query Analyzer запустит запрос и выведет полученные результаты в таблицу, находящуюся в нижней части окна. Однако мы пока ничего не знаем о внутренних операциях SQL Server.

4. Оставьте запрос в панели запросов и выполните Query  Display Estimated Execution Plan (Показать примерный план исполнения). На этот раз Query Analyzer тоже запустит запрос, но выведет не результат, а графическое изображение того, что мог проделать SQL Server во время исполнения запроса (обратите внимание на слово "мог" — это лишь предположение, поскольку SQL Server в действительности может исполнять запрос иначе):

 Эффективный текстовый поиск в SQL Server

Обратите внимание на то, что в окне Query Analyzer значок Table Scan показан красным цветом. Это предостережение! Если SQL Server не может выполнить операцию быстро, лучше исследовать все и каждую строку таблицы, и проверить каждое значение. Эта рекомендация применима к таблицам малых размеров, но совершенно неприемлема для больших таблиц. Одним словом, чем больше таблица, тем медленнее выполняется запрос.

5. Для ускорения сканирования таблиц достаточно создать индекс по столбцу Name, и при следующем запуске запроса SQL Server будет пользоваться индексом и не станет проверять каждую строку таблицы.

В Enterprise Manager есть неплохие средства для создания и обслуживания индексов, однако мы воспользуемся языком SQL. Выполните оператор SQL, создающий индекс по столбцу Name: CREATE INDEX ProductName ON Products(Name)

6. Теперь при выполнении Query I Display Estimated Execution Plan в SQL Server мы получим следующее:

 Эффективный текстовый поиск в SQL Server

Крайний правый значок показывает, что для поиска данных выполняется Index Seek, который более эффективен и лучше масштабируется, чем обычный запрос к базе данных. Bookmark Lookup работает совместно с Index Scan.

Полнотекстовый поиск

Сколько бы индексов мы ни создали, нам не удастся увеличить эффективность текстового поиска. Вместо

SELECT * FROM Products WHERE Name=’carezza’

нам хотелось бы найти товары, в имени (Name) которых содержится слово Carezza. Для этого потребуется оператор типа:

SELECT * FROM Products WHERE Name LIKE ‘%carezzaV

Индексы SQL Server ничем не помогут в таких запросах, так что придется вернуться к сканированию таблиц. Попробуйте ввести второй оператор SQL и проанализируйте панель исполнения.

Первый оператор выявляет полное совпадение, поэтому слово carezza ищется только в столбце Name, без учета начальных и заключительных фраз, которые SQL проверяет на соответствие и присутствие в конечном результате.

На практике SQL Server обычно работает в режиме, не учитывающем регистр, поэтому запросу удовлетворят слова

Читайте так же:
Not found

Нам доверяют

Интернет магазин