基础数据库查询优化

昨天检查一位小兄弟的代码,发现执行起来很慢,就找找原因优化一下。

项目是C# WebForm  +  SQLSERVER  +  EF 的。开了 SQLSERVER 的 PROFILER 监听,发现有连续几条 READS (硬盘读取次数)在3万左右的记录。查询的语句如下:

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[Customers] AS [Extent1]
        WHERE ((DATEDIFF(d, [Extent1].[AddTime], GetDate())) <= 30) AND (5 = [Extent1].[SectionId])
    )  AS [GroupBy1]

语义大概是查询客户表,添加时间在30天内,部门ID是5的记录数量。这个表有几十万条记录,根据两个字段查数量,READS高肯定是没有经过优化。根据这个查询来找一下程序段,如下:

p => SqlFunctions.DateDiff("d", p.AddTime, DateTime.Now) <= 30 && p.SectionId == 5;

第一步,建立索引。由于使用这两个字段执行查询的地方很多,所以索引要建。我建立了一个索引,字段就是 AddTime 和 SectionId ,没有包含性字段。建立好后执行同样的语句,READS 降到了 1000 左右。虽然成功减少到30分之一,但和理想中的查询还是差很多。

第二步,优化语句。SqlFunctions 的调用肯定没有  < > = 这些比较符快,所以这里需要改一下。思考一下改成如下:

var d = DateTime.Now.AddDays(-30);
p => p.AddTime >  d && p.SectionId == 5;

再执行一下,生成的SQL语句如下:

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[Customers] AS [Extent1]
        WHERE ([Extent1].[AddTime] > convert(datetime, '2016-11-29 18:06:27.889', 121)) AND (5 = [Extent1].[SectionId])
    )  AS [GroupBy1]

READS 成功降到了个位数。 这样就没什么问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值