Почему мое представление медленно, когда я проиндексировал столбцы? - PullRequest
2 голосов
/ 08 ноября 2010

В SQL Server я поместил кластеризованный индекс в представление исключить неэффективность объединения с использованием операторов LIKE :

   CREATE VIEW KeywordCount WITH SCHEMABINDING
    AS
    SELECT 
        K.ID AS KeywordID
        ,COUNT_BIG(*) AS KeywordCount
    FROM dbo.Grants G
    INNER JOIN dbo.GrantStatuses GS2 ON GS2.ID = G.StatusID AND GS2.Status NOT IN ('Pre-Submission', 'Awaiting Signatory Approval', 'Modifying', 'Closed')
    INNER JOIN dbo.Keywords K
        ON G.Keywords LIKE '%' + K.Word + '%'                                           --It's one of the grant's keywords
        OR G.Title LIKE '%' + K.Word + '%'                                              --Word appears in the title
        OR Replace(G.Title, '-', ' ') LIKE '%' + Replace(K.Word, '-', ' ') + '%'        --Word with hyphens replaced appears in the title
        OR G.Synopsis LIKE '%' + K.Word  + '%'                                          --Word appears in the Synopsis
        OR Replace(G.Synopsis, '-', ' ') LIKE '%' + Replace(K.Word, '-', ' ')+ '%'      --Word with hyphens replaced appears in the synopsis
    GROUP BY K.ID
    GO

    CREATE UNIQUE CLUSTERED INDEX IX_KeywordCount 
        ON dbo.KeywordCount (KeywordID)
    GO

Затем я добавил еще один индекс в столбец KeywordCount:

    CREATE INDEX IX_KeywordCount_Count 
        ON dbo.KeywordCount (KeywordCount)
    GO

Так почему следующий запрос выполняется 7 минут? Разве индекс не должен дать мне намного лучшую производительность?

    SELECT TOP 10 * FROM KeywordCount ORDER BY KeywordCount DESC

EDIT Спасибо всем, но я знаю, что операторы LIKE и REPLACE сделают это представление неэффективным . Вот почему я добавил кластерный индекс. Я думал, что размещение кластеризованного индекса в представлении материализует данные в таблицу, так что базе данных не придется выполнять объединения . В плане запроса указано, что он выполняет объединения. Это почему?

Ответы [ 3 ]

5 голосов
/ 09 ноября 2010

Я нашел решение в этой статье: http://technet.microsoft.com/en-us/library/cc917715.aspx

SELECT TOP 10 * FROM KeywordCount WITH (NOEXPAND) ORDER BY KeywordCount DESC

По какой-то причине план запроса не использовал индекс, но я добавил WITH (NOEXPAND) подсказка и мой запрос запустился мгновенно - большое спасибо Quassnoi за указание на правильную вещь.

1 голос
/ 27 января 2016

Обратите внимание, что WITH (NOEXPAND) означает, что представление должно смотреть только на индексы, а не на данные таблицы.Это означает, что если индексы не обновлены, представление также не будет.

0 голосов
/ 08 ноября 2010

A LIKE '%' + Replace(K.Word, '-', ' ') + '%' (% подстановочные знаки в начале поисковых терминов) НИКОГДА не сможет использовать любые индексы. Если вы используете такое утверждение, не удивляйтесь, что у вас будет полное сканирование таблицы.

Если вам действительно нужен такой поиск, вам нужно либо справиться со скоростью, с которой вы работаете, либо, возможно, исследовать полнотекстовый поиск.

Другой вариант - изменить ваши операторы LIKE на: LIKE K.Word + '%'

Если вы используете подстановочный знак % только в конце, SQL Server имеет шанс фактически использовать индекс для K.Word и, таким образом, ускорить поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...