Задавая вопрос о производительности SQL Server без предоставления схемы, это полная трата времени. Я собираюсь ответить на другой вопрос, который один вы должны были спросить в первую очередь:
Что схемы следует использовать для эффективно удовлетворить запрос как SELECT DISTINCT TOP (200) COUNT(1) AS COUNT, KEYWORD FROM QUERIES WHERE KEYWORD LIKE '%Something%'GROUP BY KEYWORD ORDER BY 'COUNT' DESC
, когда таблица имеет ЗАПРОСЫ над рядами 1M ?
Правильная схема зависит от избирательности KEYWORD
. Одним из возможных конструкций будет нормализовать KEYWORD в таблице поиска и имеют узкий, не кластерный индекс поиска ID:
CREATE TABLE KEYWORDS (KeywordId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Keyword VARCHAR(...) UNIQUE);
CREATE TABLE QUERIES (...,
KeywordId INT NOT NULL,
CONSTRAINT FK_KEYWORD
FOREIGN KEY KeywordId
REFERENCES KEYWORDS (KeywordId),
...);
CREATE INDEX ndxQueriesKeyword ON Queries (KeywordId);
Если число различных ключевых слов является относительно низким, первоначальный запрос может быть удовлетворен быстро сканирование таблицы Keywqord с последующим сканированием диапазона циклов индекса ndxQueriesKeyword, который очень узкий и, следовательно, генерирует низкий IO.
Поскольку число различных ключевых слов увеличивается, этот подход может начать выявлять проблемы из-за большого количества сканирования диапазона в таблице запросов и возможно даже из-за полного сканирования в таблице ключевых слов.
Вы можете использовать другое предложение WHERE, а именно одно LIKE 'Something%
, которое является SARGable, и может использовать индекс в KEYWORK, используя уменьшение диапазона и более узкое сканирование, чем полное сканирование таблицы.
Если вы на Enterprise Edition вы можете рассмотреть вопрос о включении индексов просмотра с предварительно вычисленными агрегатами:
CREATE VIEW vwQueryKeywords
WITH SCHEMABINDING
AS SELECT KEYWORD, COUNT_BIG(*) as COUNT
FROM dbo.QUERIES
GROUP BY KEYWORD;
CREATE CLUSTERED INDEX cdxQueryKeywords ON vwQueryKeywords(KEYWORD);
На EE оптимизатор рассмотрит индексированное представление для исходного запроса. О не EE вам придется изменить запрос для запуска против того, с NOEXPAND намек:
SELECT KEYWORD, COUNT
FROM vwQueryKeywords WITH(NOEXPAND)
WHERE KEYWORD LIKE '%Something%';
Другой совершенно иной подход к канаве условию LIKE '%Something%'
вообще в пользу fullt полнотекстового поиска:
SELECT DISTINCT TOP (200) COUNT(1) AS
COUNT, KEYWORD FROM QUERIES WHERE
CONTAINS (Keyword, Something)
GROUP BY
KEYWORD ORDER BY 'COUNT' DESC
Поскольку поиск FT является обратным индексом, он может оказаться оптимальным по сравнению с традиционным ГДЕ. Единственная проблема заключается в том, что вы сможете искать только полные слова, так как FT не позволит вам искать частичные совпадения, как это делает LIKE. Опять же, фактический пробег будет зависеть от профиля данных ключевого слова (то есть его статистики и распределения).
Btw, если и downvote, объяснить, почему –