记录一次SqlServer查询优化的过程(聚合索引的使用)

记录一次SqlServer查询优化的过程(聚合索引的使用),第1张

概述前提: 最近给人做一个程序,由于有导入导出 *** 作,所以主键采用了GUID类型。 由于客户不能上网,SqlServer选择了2005,因为Sql2005比较小。。。 问题描述: 当数据量大于200w条后查询的效率直线下降。甚至到后来SqlServer连接超时引起了程序报错:CLR20r3。 问题分析: 这个当然是Sql查询时间太长惹的祸。 分页查询语句: SELECT * FROM (  SELECT 前提:

最近给人做一个程序,由于有导入导出 *** 作,所以主键采用了GUID类型。

由于客户不能上网,sqlServer选择了2005,因为sql2005比较小。。。

问题描述:

当数据量大于200w条后查询的效率直线下降。甚至到后来sqlServer连接超时引起了程序报错:CLR20r3。

问题分析:

这个当然是SQL查询时间太长惹的祸。

分页查询语句:

SELECT * FROM (  SELECT ROW_NUMBER() OVER (order by T.sortCode)AS Row,T.*  from tableA T  WHERE DepartGUID = 'd4d22c04-6d15-4bad-b0f7-f8466eb371cc' ) TTWHERE TT.Row between 1 and 100

在查询编辑器中执行会耗时48S。

解决过程:

当然是创建索引了。在where,groupby语句所涉及到的表字段都添加了非聚合索引,但是效率依旧,仍然是48s。

这下有些麻烦了,难道索引也解决不了问题,而且数据量也不大啊~!

直到看到这篇文章:SQLSERVER聚集索引和主键(Primary Key)的误区认识

因为聚合索引是唯一的,而且一般会设置在主键上。但是主键ID都是自动创建的,查询的时候一般不会涉及到,而且分页的时候更不是按照主键来分页的。所以需要取消主键的聚合索引并添加到了主要区分的字段上。

解决方案:

如何删除主键上的聚合索引?

如何在非主键上创建聚合索引?

参考了文章:SQL Server 关于聚集索引的 *** 作

创建于主键上的聚集索引是不可以通过Drop等语句来删除的,要想删除位于主键上的聚集索引,我们可以通过先删除主键约束,这样将会自动删除主键上的聚集索引,然后在其他字段上创建聚集索引,最后在创建主键时将其修改为非聚集索引;

ALTER table tableA DROP CONSTRAINT PK_tableACREATE CLUSTERED INDEX Index_IndexGUID ON tableA(IndexGUID)ALTER table tableA ADD CONSTRAINT PK_tableA PRIMARY KEY NONCLUSTERED(ItemGUID)
这样就解决了问题,现在再执行上述的分页查询基本不会耗时,1S以内,效率提高非常明显! 总结

以上是内存溢出为你收集整理的记录一次SqlServer查询优化的过程(聚合索引的使用)全部内容,希望文章能够帮你解决记录一次SqlServer查询优化的过程(聚合索引的使用)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170323.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存