如题。
3个表20万左右数据的一个检索。以前都是几秒后完事。 最近突然变得很慢。
暂时的解决方案是
1)把表1数据备份
2)TRUNCATE TABLE 表1
3)把备份数据倒回到表1
暂时正常了。请教各位大神这种情况是什么原因造成的以及解决方法。
多谢。解决方案检索变慢
3个表20万左右数据的一个检索。以前都是几秒后完事。 最近突然变得很慢。
暂时的解决方案是
1)把表1数据备份
2)TRUNCATE TABLE 表1
3)把备份数据倒回到表1
暂时正常了。请教各位大神这种情况是什么原因造成的以及解决方法。
多谢。解决方案检索变慢
如果是碎片过多的话,除了现在的TRUNCATE TABLE,要怎样去做出力可以解决呢。
因为客户不认可TRUNCATE TABLE,一定要我提出另外的解决方法。
烦恼中…………
如果是碎片过多的话,除了现在的TRUNCATE TABLE,要怎样去做出力可以解决呢。
因为客户不认可TRUNCATE TABLE,一定要我提出另外的解决方法。
烦恼中…………重建表上的聚集索引就可以了
如果是碎片过多的话,除了现在的TRUNCATE TABLE,要怎样去做出力可以解决呢。
因为客户不认可TRUNCATE TABLE,一定要我提出另外的解决方法。
烦恼中…………重建表上的聚集索引就可以了
是把表的索引都删掉再重做聚集索引的意思吧?
ON Production.WorkOrder(ProductID)
WITH (FILLFACTOR = 80,
PAD_INDEX = ON,
DROP_EXISTING = ON);
GO
索引名、表名、列名改一下就可以了
--如果avg_fragmentation_in_percent 大于25,那么可以考虑重建索引
select object_name(object_id),
avg_fragmentation_in_percent
from sys.dm_db_index_physical_stats(
db_id('数据库'), --数据库id
object_id('数据库.dbo.表名'), --对象id
null, --索引id
null, --分区号
'detailed'
);--重建索引
alter index 索引名称on 表名
rebuild2.更新统计信息,由于表中的数据会有增删改,所以数据变化了,但表的各种统计信息可能不变,那么运行sql语句时,sql server 的优化器就会根据错误的统计信息,来生成执行计划,而这个执行计划会导致你的sql语句,慢很多:update statistics 表名称;
刚才确认了一下表的设计书,没有设计index。 测试用的数据库的那个表也没有创建index。
这样的话是否和现在说的索引碎片有关系呢。
结果是2条数据表1 66.6666666666667
表1 0
alter table 表名 rebuild一下就可以了,没必要truncate那些
30 is a reference, actually you can adjust based on your sql server performance.
嗯,再遇到试试更新统计信息先
不过有没有比较准确的检测方法呢?
嗯,再遇到试试更新统计信息先
不过有没有比较准确的检测方法呢?没有什么太好的办法,比如你说查询变慢了,到底是什么原因导致的呢?这个很难说,所以一般的做法比较,比如上个月的时候这个语句运行只需要10秒,这个月怎么就需要10分钟呢,而且查询条件一样,这种一般都是由于产生了比较差的执行计划导致的,而这个执行计划是由优化器产生的,而优化器主要是根据,表的基本信息,比如你的表的记录数,你的表的索引,另外,根据你的where查询条件,或者on的关联条件,来估计你的结果集会有多少条记录,然后计算开销是多少。那么在这个估计的过程中,如果统计信息不准确,就会导致产生错误的执行计划,你可以通过下面的命令来了解,统计信息是否正确:dbcc show_statistics(表,索引名称)返回结果中,包含了详细的统计信息,比方说,你的索引包含了name字段,那么下面的结果就会详细返回在表中的name字段的,所有可能的值,以及每个值的分布,比如值xxx的个数是1000,值yyy的个数是20000,而你可以直接通过语句来验证,这个信息是否正确,比如:select count(*) from tb where name = xxx如果这个语句返回的也是100000,或者相近,那么说明统计信息基本上是正确的,如果相差比较大,比如原来可能是1000,但最近可能删除了一部分,变成了 10,那么就可能导致产生不准确的执行计划,就应该考虑更新统计信息
嗯,再遇到试试更新统计信息先
不过有没有比较准确的检测方法呢?上面写了错了一点:
没有什么太好的办法,比如你说查询变慢了,到底是什么原因导致的呢?这个很难说,所以一般的做法比较,比如上个月的时候这个语句运行只需要10秒,这个月怎么就需要10分钟呢,而且查询条件一样,这种一般都是由于产生了比较差的执行计划导致的,而这个执行计划是由优化器产生的,而优化器主要是根据,表的基本信息,比如你的表的记录数,你的表的索引,另外,根据你的where查询条件,或者on的关联条件,来估计你的结果集会有多少条记录,然后计算开销是多少。那么在这个估计的过程中,如果统计信息不准确,就会导致产生错误的执行计划,你可以通过下面的命令来了解,统计信息是否正确:
SQL code
?
1
dbcc show_statistics(表,索引名称)返回结果中,包含了详细的统计信息,比方说,你的索引包含了name字段,那么下面的结果就会详细返回在表中的name字段的,所有可能的值,以及每个值的分布,比如值xxx的个数是100000,值yyy的个数是20000,而你可以直接通过语句来验证,这个信息是否正确,比如:select count(*) from tb where name = xxx如果这个语句返回的也是100000,或者相近,那么说明统计信息基本上是正确的,如果相差比较大,比如原来可能是1000,但最近可能删除了一部分,变成了 10,那么就可能导致产生不准确的执行计划,就应该考虑更新统计信息