sql server运行时间久了速度会变慢,如何解决?

如题所述

1. 执行计划中明明有使用到索引,为什么执行还是这么慢?

2. 执行计划中显示扫描行数为 644,为什么 slow log 中显示 100 多万行?
a. 我们先看执行计划,选择的索引 “INDX_BIOM_ELOCK_TASK3(TASK_ID)”。结合 sql 来看,因为有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能会更差,优化器选择这个索引避免了排序。
那为什么不选 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很简单,TASK_DATE 字段区分度太低了,走这个索引需要扫描的行数很大,而且还要进行额外的排序,优化器综合判断代价更大,所以就不选这个索引了。不过如果我们强制选择这个索引(用 force index 语法),会看到 SQL 执行速度更快少于 10s,那是因为优化器基于代价的原则并不等价于执行速度的快慢;
b. 再看执行计划中的 type:index,"index" 代表 “全索引扫描”,其实和全表扫描差不多,只是扫描的时候是按照索引次序进行而不是行,主要优点就是避免了排序,但是开销仍然非常大。
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。
在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;
c. 关于执行计划中:“rows:644”,其实这个只是估算值,并不准确,我们分析慢 SQL 时判断准确的扫描行数应该以 slow log 中的 Rows_examined 为准。
4. 优化建议:添加组合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)

优化过程:
TASK_DATE 字段存在索引,但是选择度很低,优化器不会走这个索引,建议后续可以删除这个索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+

在这个 sql 中 REL_DEVID 字段从命名上看选择度较高,通过下面 sql 来检验确实如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+

由于有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 组合选择度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+

在测试环境添加 REL_DEVID,TASK_ID 组合索引,测试 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引后执行计划:
这里还要注意一点“隐式转换”:REL_DEVID 字段数据类型为 varchar,需要在 sql 中加引号:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'

执行时间从 10s+ 降到 毫秒级别:
1 row in set (0.00 sec)
结论
一个典型的 order by 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-06
这个问题很大,可以写一本厚厚的书了。 建议阅读DBA和数据库优化方面的书籍。
第2个回答  2013-05-06
是不是你使用过程中,内存没有及时释放呢?
第3个回答  2013-05-06
那是因为数据读写过大,你机器本身的性能不足,如果有需要就优化一下数据库,可以建立字段和索引
第4个回答  2013-05-05
重启机器是最好的解决之道。

sql server运行时间久了速度会变慢,如何解决?
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;c. 关于执行计划中:“rows:644”,...

如何解决SQL Server查询速度缓慢的问题
一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时便应该使用UNION ALL,如xx模块的某个查询程序就曾经存在这种情况,见,由于语句的特殊性,在这个脚本中几个...

如何解决SQL Server查询速度缓慢的问题
将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同...

如何解决SQL Server查询速度缓慢的问题
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2、I\/O吞吐量小,形成了瓶颈效应。3、没有创建计算列导致查询不优化。4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的...

SQL Server占用内存过高,什么原因导致的,用什么方法可以解决
解决SQL Server占用内存过高的方法:1.定期重启SQL Server 2008 R2数据库服务即可。2.进入Sql server 企业管理器,在数据库服务器名称上点击【右键】,选择【属性】,然后,找到【内存】选项,在右边的【使用AWE分配内存】(sqlServer64的应该不用勾)左边把对勾打上。在最大服务器内存(MB)上填入适当...

为什么装了SQL Server2000后,电脑运行变得很慢了
SQL Server2000是服务器,在你的启动项里面有很多服务,要占一些内存和CPU的,而且SQL Server2000一般都是在开机就启动的,所以你要在启动项里设置一下

SQL Server 视图查询慢,如何优化?请不要复制粘贴谢谢
【DELETE_FLAG='R' OR DELETE_FLAG='X' OR DELETE_FLAG='U' OR DELETE_FLAG='D'】而数据库一旦使用了【OR】条件做查询的话,索引就不会用到了,因此就会造成查询过慢。建议:SELECT 。。。WHERE DELETE_FLAG='R'UNION SELECT 。。。WHERE DELETE_FLAG='X'UNION SELECT 。。。WHERE DELETE_...

如何释放Sqlserver所占用的内存?
SQLServer运行越久,占用内存会越来越大。解决方法:在程序里面启动SQLServer2008,系统登录,右键点击服务名,选择“属性”。服务器内存占用过高的解决方法:1,首先通过任务管理器进行进程排序,查找占用内存较大的程序进程。如何释放Sqlserver所占用的内存?如何释放Sqlserver所占用的内存?1、如果你只是开发用,...

装完SQL SERVER后开机变得很慢,怎么解决?
如果操作系统是windows7操作系统的话,那么其启动的进程大约是在四个左右。每一个进程都是会占用超过30MB的内存空间,在某些情况之下占用的内存资源还是会更多。这就是安装了sql server之后操作系统变得十分卡顿的原因。如果在最开始开机的时候就是关闭这些应用程序的话就是会发现系统立马就是会快速很多。

sql server insert 与 delete 三百万级数据量时速度极慢,有10分钟左右...
你首先确定是否用上了索引,你可以再网上搜下sql server的一些系统调优函数,我知道sybase数据库有个sp_showplan id,null,null,null 就可以看出那些使用了索引,那么定义了索引但是没被使用,一般用上了正确的索引如果还是10分钟的,那么在怎么优化都提高不了很多了,300万数量的表除了必要的索引外其他索引...

相似回答