首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL优化查询

SQL优化查询
EN

Stack Overflow用户
提问于 2009-05-26 14:57:36
回答 5查看 216关注 0票数 1

下面的MSSQL2005查询非常慢。我觉得他们应该是一种加快速度的方法,但我不确定该怎么做。请注意,我编辑了内部连接,以便使用select语句使其更明显(对于阅读此问题的人而言),尽管这不会影响速度(执行计划可能是相同的)。有趣的是,除了计数之外,我从未真正使用过关键字Interestingly,但我不确定是否有办法利用这一点。

代码语言:javascript
复制
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      

编辑:显然,人们一直在抱怨我使用子查询。事实上,这并没有什么区别。我在张贴这个问题之前添加了它们,以便更容易地看到正在发生的事情。但它们只会让事情变得更加混乱,所以我将其更改为不使用它们。

编辑:正在使用的索引:

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-26 15:18:01

我会确保你有以下索引。

KeywordValueGroups上的ID。

KeywordValueGroups上的名称。

包含processPath的ClientDefinitionEntry上的ID。

代码语言:javascript
复制
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 )

我还会将查询更改为以下内容。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2009-05-26 15:11:29

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

您是否对筛选的列建立了索引?您是否对用于连接的列建立了索引?您是否对用于排序的列建立了索引?

一旦您了解了这一点,并且查询仍然很慢,您就可以查看数据库/表是如何分段的(dbcc showcontig),并查看是否有必要重新构建索引。

有一个定期重建索引的维护计划可能会很有帮助。

票数 3
EN

Stack Overflow用户

发布于 2009-05-26 15:14:16

使用此选项运行查询:

将SHOWPLAN_TEXT设置为ON

并将结果添加到问题中。

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/911145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档