代码之家  ›  专栏  ›  技术社区  ›  Brian

SQL优化查询

  •  1
  • Brian  · 技术社区  · 16 年前

    下面的MSSQL2005查询非常慢。我觉得他们应该是一种加快速度的方法,但不确定如何实现。请注意,我编辑了内部连接,使用select语句,使其更明显(对阅读此问题的人来说)发生了什么,尽管这对速度没有影响(可能执行计划是相同的)。有趣的是,除了计数之外,我从来没有真正使用关键字值组,但我不确定是否有办法利用这一点。

    select top 1 cde.processPath as 'keywordValue', count(*) as 'total'
    from dbo.ClientDefinitionEntry AS cde INNER JOIN dbo.KeywordValueGroups  AS kvg
    ON cde.keywordGroupId = kvg.keywordValueGrpId
    where kvg.[name] = @definitionName
    group by cde.processPath
    order by total desc      
    

    ClientDefinitionEntry:
    IX_ClientDefinitionEntry   |nonclustered located on PRIMARY|clientId, keywordGroupId
    
    KeyWordValueGroups
    IX_KeywordValueGroups      |nonclustered located on PRIMARY|keywordValueGrpId
    IX_KeywordValueGroups_2    |nonclustered located on PRIMARY|version
    IX_KeywordValueGroups_Name |nonclustered located on PRIMARY|name
    
    5 回复  |  直到 16 年前
        1
  •  2
  •   Robin Day    16 年前

    执行计划是什么样子的? 通过查看它,您将了解查询的哪个部分需要最多的时间/资源。


        2
  •  3
  •   Frederik Gheysels    16 年前

    并将结果添加到问题中。

    还要检查您的统计数据是否是最新的:

    SELECT 
        object_name = Object_Name(ind.object_id),
        IndexName = ind.name,
        StatisticsDate = STATS_DATE(ind.object_id, ind.index_id)
    FROM SYS.INDEXES ind
    order by STATS_DATE(ind.object_id, ind.index_id) desc
    

    关于索引、表定义和外键的信息也会有所帮助。

        3
  •  3
  •   Andomar    16 年前

    我会确保你有以下索引。

    KeywordValueGroups上的ID。

    ClientDefinitionEntry上的ID,带有processPath的INCLUDE。

    CREATE INDEX [IX_ClientDefinitionEntry_Id_ProcessPath] ON [dbo].[ClientDefinitionEntry] ( [keywordGroupId] ASC ) INCLUDE ( [processPath]) ON [PRIMARY]
    CREATE INDEX [IX_KeywordValueGroups_Id] ON [dbo].[KeywordValueGroups] ( [keywordValueGrpId] ASC )
    CREATE INDEX [IX_KeywordValueGroups_Name] ON [dbo].[KeywordValueGroups] ( [name] ASC )
    

    select top 1
        cde.processPath as 'keywordValue',
        count(*) as 'total'
    from
        dbo.ClientDefinitionEntry AS cde
    INNER JOIN
        dbo.KeywordValueGroups  AS kvg
    ON
        cde.keywordGroupId = kvg.keywordValueGrpId
    where
        kvg.[name] = @definitionName
    group by
        processPath
    order by
        total desc
    
        4
  •  2
  •   Euro Micelli    16 年前

    确实没有足够的信息可以确定。如果您在该查询中遇到性能问题,那么表中必须有大量数据,并且必须缺少重要索引。

    哪些索引肯定会有所帮助,这在很大程度上取决于表的大小,在较小程度上也取决于KeywordGroupId和KeywordValueGrpId字段中的值分布。

    如果没有其他信息,我想说你想确保 dbo.KeywordValueGroups.[name] 被索引,以及 dbo.ClientDefinitionEntry.[keywordGroupId]

    由于查询的编写方式 dbo.KeywordValueGroups.[keywordValueGrpId] 单靠这一点也无济于事,但综合指数 [name], [keywordValueGrpId] 可能会。如果你有这个索引,你不需要一个专门的索引 [name] .

    仅凭直觉,我可能会冒险认为该指数 是一个 必须 ,并且cde.keywordGroupId可能很重要。综合指数是否 [名称],[关键字ValueGrpId] 会有所帮助,这取决于有多少条记录具有相同的[名称]。

    唯一能确定的方法是添加索引,看看会发生什么。

        5
  •  0
  •   HLGEM    16 年前

    我会先专注于索引。我们经常忘记,当我们创建foriegn键时,它们不会自动索引。检查连接的两个部分是否都有索引。

    由于您正在传递参数中的值,因此也可能存在参数嗅探问题。谷歌这个技术来解决这个问题。