今天,一哥们反馈系统很慢,很卡,让我远程看一下。我远程过去查了一下数据库系统,发现很多阻塞,语句都基本相似,并且表的数据也不大,只有10多万条记录。


1、问题分析:

本系统是sql server数据库,仔细分析了该语句,就是想查询与当前日期差异为3分钟。就这么一个条件,由于使用的人多,所以造成了阻塞。
条件如下:

where datediff(mi,uptime,getdate())>=3

仔细查看了数据库的索引,并没有关于uptime的索引,再查看执行计划,该语句走的是全表扫描,但实际上即使使用索引,该语句也不会使用索引,因为针对此列使用函数。

2、优化解决

将where后面的条件进行修改调整

修改为如下:

uptime <=  DateAdd(minute,-3,getdate())

另外,如果条件可以,再建议查询前将getdate()

@date = getdate()

这样调整后,再针对uptime字段建上索引,问题得到圆满解决,阻塞没有了。

3、关于两个函数的说明

3.1 dateiff使用说明

DateDiff 函数用于判断在两个日期之间存在的指定时间间隔的数目。例如可以使用 DateDiff 计算两个日期相差的天数,或者当天到当年最后一天之间的星期数。要计算 date1 和 date2 相差的天数,可以使用“一年的日数”(“y”)或“日”(“d”)。当 interval 为“一周的日数”(“w”)时,DateDiff 返回两个日期之间的星期数。如果 date1 是星期一,则 DateDiff 计算到 date2 之前星期一的数目。此结果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),则 DateDiff 函数返回日历表中两个日期之间的星期数。函数计算 date1 和 date2 之间星期日的数目。如果 date2 是星期日,DateDiff 将计算 date2,但即使 date1 是星期日,也不会计算 date1。

如果 date1 晚于 date2,则 DateDiff 函数返回负数。

firstdayofweek 参数会对使用“w”和“ww”间隔符号的计算产生影响。

如果 date1 或 date2 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date1 或 date2 被包括在引号 (" ") 中并且省略年份,则在代码中每次计算 date1 或 date2 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。
在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。

下面的示例利用 DateDiff 函数显示今天与给定日期之间间隔天数:

Function DiffADate(theDate)DiffADate = "从当天开始的天数:" & DateDiff("d", Now, theDate)
End Function

由于该函数在查询使用过程中,经常会把列做为一个参数值,再加上另一个时间值进行比较,导致函数无法使用索引,很多情况下会导致性能下降

3.2 dateadd使用说明

可以使用 DateAdd 函数对日期加上或减去指定的时间间隔。例如,可以用 DateAdd 来计算距今天为三十天的日期;或者计算距现在为 45 分钟的时间。
为了对 date 加上“日”,可以使用“一年的日数” (“y”),“日” (”d”) 或“一周的日数” (”w”)。
DateAdd 函数将不返回有效日期。在以下实例中将 1 月31 日加上一个月:
DateAdd(m, 1, 31-Jan-95)
上例中,DateAdd 返回 1995 年 2 月 28 日,而不是 1995 年 2 月 31 日。如果 date 是 1996 年 1 月 31 日,则由于 1996 年是闰年,返回值是 1996 年 2 月 29 日。
如果计算的日期超前 100 年(减去的年度超过 date 中的年份),就会导致错误发生。
如果 number 不是一个 Long 值,则在计算时取最接近的整数值来计算。
注意 DateAdd 返回值的格式由 Control Panel设置决定,而不是由传递到date 参数的格式决定。
DateAdd ( "m" , 1 , "31-Jan-98") 
结果: 28-Feb-98 
将日期 31-Jan-98 加上一个月,结果为 28-Feb-98 而非 31-Fe-98 。 
DateAdd ( "d" , 20 , "30-Jan-99") 
结果: 1999/2/9 
将一个日期 30-Jan-99 加上 20 天后的日期。

由于该函数里面只包含一个日期值,那么在查询的时候,就可以不对当前的日期列进行转换,而是将比较的日期及差值放在=、<=、>=的右面,这样,就可以使用索引。

4、最后关于这个系统的建议

最后应这哥们的要求,我们对数据库进行了一番巡检,发现问题还是比较多的
4.1、调整隔离级别!
4.2、内存使用不多,cpu高,io比较大,可能很多物理读,索引优化及碎片整理!
4.3、内存使用上不去,是不是存在sql server支持的内存方面有问题,需要进一步排查!

原文连接:

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29371470/viewspace-2130906/,如需转载,请注明出处,否则将追究法律责任。


本人补充内容:

首先说明一下,如果 使用 DateAdd 方法能够解决问题,下面的内容就不需要看了(根据你查询数据的实际情况)。如果没办法使用dateAdd方法完成我们想要实现的功能,那么要考虑使用其他函数了(我这里使用的是 sqlserver中的 convert 函数进行处理的)

最近在测试系统的时候,发现系统有些统计功能非常慢,界面功能有按年、月、季度等选项来统计数据,最后找到sql语句发现没有走索引,但是表中创建了索引以及表数据才 10万条数据量。

查询条件是这样的(这里是按月统计数据):

where datediff(month, upload_time, getdate()) = 0 

发现没有走索引,数据库表中为 upload_time 字段创建了索引。于是对sql语句进行整改。

整改后的查询条件是这样的(查询10月份数据):

where convert(varchar(7), upload_time, 23) = '2020-10'

关于 convert 及其他日期函数详细信息,请查看下面的内容:

SqlServer数据类型及日期格式转换参照表

SQL Date 函数( MySQL 与 SQL SERVER)

SQL SERVER数据库datediff函数引发的性能问题相关推荐

  1. SQL Server数据库是否会引发恶意?

    介绍 (Introduction) There is a lot of talk about how bad triggers are, how you should never use them, ...

  2. SQL Server 数据库统计信息更新对性能优化的切身体会

    年底前在开发一个SQL Server BI项目的过程中,我们测试SSIS包的时候,发现有好几天晚上取数的时间都超出了以前的 取数时间,刚开始我们以为是换了服务器,服务器硬件的性能有差异导致,后来我们仔 ...

  3. SQL server 数据库 (函数篇 2)

    函数 上篇:函数篇1 聚合函数 sum() 求和,将指定字段中的数据累加求和,只能对数字型字段进行统计. avg() 求平均值,统计指定字段中的平均数值. max() 最大值,统计指定字段中的最大数值 ...

  4. MS SQL Server数据库在线远程管理工具

    MS SQL Server数据库在线管理工具 MS SQL Server数据库以其优异的性能,被广泛使用,特别是政务,医疗行业.但是远程维护挺不方便的,目前有一款基于WEB的工具TreeSoft数据库 ...

  5. 转载SQL Server 数据库的性能优化

    你是否在千方百计优化SQL Server 数据库的性能?如果你的数据库中含有大量的表格,把这些表格分区放入独立的文件组可能会让你受益匪浅.SQL Server 2005引入的表分区技术,让用户能够把数 ...

  6. 5. SQL Server数据库性能监控 - 当前请求

    5. SQL Server数据库性能监控 - 当前请求 原文:5. SQL Server数据库性能监控 - 当前请求 对于在线运行的系统,当前数据库性能监控,通常监视以下几点: (1) 是否有阻塞 ( ...

  7. Serverless 解惑——函数计算如何访问 SQL Server 数据库

    函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务 ...

  8. 从外到内提高SQL Server数据库性能

    如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能.如下图: 第一层:网络环境 到企业碰到数据库反映速度比较慢时,首先想到的是是否是网络环 ...

  9. 10步骤优化SQL Server 数据库性能

    作者从基础的数据库索引开始全面讲述了SQL Server数据库应用程序的性能优化,包括数据库设计和数据访问代码.系列文章如下: Top 10 steps to optimize data access ...

最新文章

  1. 从Apache Kafka 重温文件高效读写
  2. Dagger简单Demo
  3. windows系统启动时显示cpu over voltage error错误解决办法
  4. yii 加载php文件,Yii2框架加载css和js文件的方法分析
  5. Go 超时引发大量 fin-wait2
  6. RecycleView 与 Elevation
  7. root 密码丢失后的重新设置
  8. 看看大货车到底有多少盲区,肯定用得到!救命的!
  9. ReportViewer教程(12)-按组折叠
  10. mysql sqlsugar_【开源框架】SqlSugarRepository 全库ORM 正式发布
  11. 【ASP.NET MVC 学习笔记】- 09 Area的使用
  12. 排序sort,统计wc
  13. php的instanceof和判断闭包Closure
  14. Vijos P1772 巧妙填数【进制+置换】
  15. 用 JMeter 测试 MySQL 数据库
  16. 车载 DCDC 电源模块
  17. 如何使用robots.txt及其详解
  18. 重庆大学计算机学院毕业设计题目,图像处理毕业设计题目.docx
  19. python实现向qq邮箱发送邮件
  20. 关于WPF的资源引用问题

热门文章

  1. c++ 字符串流 sstream
  2. ChatGPT 版必应发飙!怒斥人类:放尊重些
  3. jps,jstack,jheap,jhat(原创)
  4. 解决 Windows 应用图片右上角出现蓝色双箭头
  5. SM2 国密加密加签操作工具
  6. (推荐!)元旦祝福语大全(100句)
  7. MySQL 字符串截取函数,字段截取,字符串截取
  8. Spring Cloud Alibaba 实战(四)Oauth2篇【单点登录】
  9. 安卓期末大作业——英语词典
  10. numpy_fix函数