当我索引列时,为什么我的视图会变慢?

时间:2010-11-08 16:16:17

标签: sql-server performance indexing views

在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

修改 谢谢大家,但我知道 LIKE语句和REPLACE会使这种观点效率低下。这就是我添加聚集索引的原因。我认为将聚簇索引放在视图上会将数据实现到表中,这样数据库就不必进行连接。查询计划确实说它正在进行连接。这是为什么?

3 个答案:

答案 0 :(得分:5)

我在本文中找到了解决方案:http://technet.microsoft.com/en-us/library/cc917715.aspx

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

由于某种原因,查询计划没有使用索引,但我添加了 WITH(NOEXPAND)提示,我的查询立即运行 - 非常感谢Quassnoi指出正确的事情要做

答案 1 :(得分:1)

请注意,WITH(NOEXPAND)表示视图应仅查看索引,而不是表数据。这意味着如果索引不是最新的,那么视图也不会。

答案 2 :(得分:0)

搜索字词开头的LIKE '%' + Replace(K.Word, '-', ' ') + '%'%通配符)将从不能够使用任何索引。如果您使用这种声明,请不要惊讶您将始终进行全表扫描。

如果你真的需要那种搜索,你需要对你获得的速度感到满意,或者调查全文搜索。

另一种选择是将LIKE语句更改为:LIKE K.Word + '%'

如果最后只使用%通配符,SQL Server有机会在K.Word上实际使用索引,从而加快查找速度。