仓酷云

标题: 利用Delete删除大批数据后SQL Server功能下落的成绩及办理办法 [打印本页]

作者: 莫相离    时间: 2015-1-16 14:07
标题: 利用Delete删除大批数据后SQL Server功能下落的成绩及办理办法
修复过程包含最多4个阶段,在下面描述。在你开始前,你应该cd到数据库目录和检查表文件的权限,确保他们可被运行mysqld的Unix用户读取(和你,因为你需要存取你正在检查的文件)。如果它拒绝你修改文件,他们也必须是可被你写入的。一样平常情形下,假如我们在sqlserver中删除大批的数据后,数据库中的数据削减,那末应当提拔sqlserver的功能才对,可明天我们看一个案例,在这个案例中,情形是相反的,利用Delete删除大批数据后SQLServer功能下落的成绩

成绩形貌:
1,利用delete删除大批数据后数据的功能下载。
2,本来一些存储历程的实行工夫为20分钟摆布,删除数据后实行工夫必要2-3个小时。

背景信息:
1,经由过程delete在数据库中删除大批的数据。
2,数据删除后,客户也举行了相干的保护事情,如重修索引,更新统计信息等。
3,功能变慢的存储历程是对表做良多的delete,insert,select的操纵。

成绩的查询拜访:
1,相干的表都是堆(heaptable)
2,这些表中并没有良多的数据
3,对表举行dbcccheckcontig扫描发明表很年夜,但页的密度(PageDensity)却很小

扫描数据以下:
DBCCSHOWCONTIG正在扫描……表...
表:……(7983405);索引ID:1,数据库ID:5
已实行TABLE级其余扫描。
-扫描页数................................:1
-扫描区数..............................:1
-区切换次数..............................:0
-每一个区的均匀页数........................:1.0
-扫描密度[最好计数:实践计数].......:100.00%[1:1]
-逻辑扫描碎片..................:0.00%
-区扫描碎片..................:0.00%
-每页的均匀可用字节数........................:7997.0
-均匀页密度(满).....................:1.20%

DBCCSHOWCONTIG正在扫描……表...
表:……(11667635);索引ID:1,数据库ID:5
已实行TABLE级其余扫描。
-扫描页数................................:1
-扫描区数..............................:1
-区切换次数..............................:0
-每一个区的均匀页数........................:1.0
-扫描密度[最好计数:实践计数].......:100.00%[1:1]
-逻辑扫描碎片..................:0.00%
-区扫描碎片..................:0.00%
-每页的均匀可用字节数........................:8025.0
-均匀页密度(满).....................:0.85%


成绩发生缘故原由:
1,当表上有会萃索引时,删除操纵会开释空页。但是,从堆中删除行时,数据库引擎可使用行锁定或页锁定举行操纵。了局,删除操纵招致的空页将持续分派给堆。未开释空页时,数据库中的其他工具将没法重用联系关系的空间。
2,固然表中没有大批数据,可是它们具有大批的几近为空的数据页。扫描表因而变得非常花工夫。

办理计划:
若要删除堆中的行并开释页,我们可使用以下办法中的一种。
1,在DELETE语句中指定TABLOCK提醒。利用TABLOCK命令会招致删除操纵猎取表的共享锁,而不是行锁或页锁。这将同意开释页。
2,假如要从表中删除一切行,可以使用TRUNCATETABLE取代Delete
3,删除行之前,请对堆创立会萃索引。删除行以后,能够删除会萃索引。与后面的办法比拟,此办法十分耗时,而且利用更多的一时资本。线上或者测试环境经常出现的误操作总是让DBA同学那么闹心。
作者: 飘灵儿    时间: 2015-1-18 12:00
连做梦都在想页面结构是怎么样的,绝非虚言
作者: 小女巫    时间: 2015-1-25 20:35
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
作者: 只想知道    时间: 2015-2-4 03:09
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
作者: 精灵巫婆    时间: 2015-2-9 13:38
入门没那么困难,精通没那么容易
作者: 再现理想    时间: 2015-2-27 07:43
原来公司用过MYSQL自己也只是建个表写个SQL
作者: 小妖女    时间: 2015-3-9 01:09
发几份SQL课件,以飨阅者
作者: 简单生活    时间: 2015-3-16 21:25
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者: admin    时间: 2015-3-23 05:22
总感觉自己还是不会SQL




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2