基础数据库查询优化
来源:互联网 发布:淘宝分销商发货流程 编辑:程序博客网 时间:2024/04/27 23:27
昨天检查一位小兄弟的代码,发现执行起来很慢,就找找原因优化一下。
项目是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
- 基础数据库查询优化
- 数据库优化:优化查询
- 数据库优化--优化查询语句
- 数据库查询优化技术
- MYSQL数据库查询优化
- 数据库查询优化
- 数据库查询优化
- 数据库 查询优化
- 优化MySQL数据库查询
- 数据库查询性能优化
- 优化MySQL数据库查询
- 优化MySQL数据库查询
- 数据库查询优化
- 数据库查询优化(上)
- 数据库查询优化(下)
- 数据库查询优化
- 数据库查询优化
- 优化MySQL数据库查询
- MySQL安装
- React学习笔记—虚拟DOM
- 备忘[cocos lua 绑定c方法] 3.10
- 简单楼层效果
- AVPlayer 截取视频流的当前帧
- 基础数据库查询优化
- mongdb模糊查询与分页
- TCP窗口扩大选项
- 倒计时效果
- mysql日期类型比较
- git命令之git tag 给当前分支打标签
- 张小龙:微信小程序服务范围重大更新,小程序1月9日发布
- Spring in Action 前言
- installation failed with message