sqlserver表碎片是如何产生的 如题 我这么理解比方说 有一张表 有十条数据 表的数据是递增的 我删除了第五条那么如果用户新增一条数据的话 应该是插入第十条后面 那么第五条的空间可能不会在被利用了 】这样我理解为表碎片了 请各位大牛 解答一下 感激之至! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这么理解也还真是独特, 当表有聚集索引的时候这些会被删除的记录应该会标记为虚影,虚影记录大概60秒被一个叫什么clear的线程清除掉。这样当有用户需要这空间时就直接被利用了。这个叫索引碎片,因为聚集索引就是数据本身吗?产生碎片的主要原因就是页不完成的删除也就是一页数据100条数据只删除了60条。和分页。 你说的这个是堆结构的表,也就是没有聚集索引的表,如果在堆上删除时获取行级或分页级锁,这些空间不被释放,那怕你删除某一页的最后一条数据。这部分空间也不会马上释放。算了我懒得打字了,直接上某论坛上的例子吧。今天给大家分享一个”删除大量数据后SQL Server性能下降”的案例。一般而言,数据库数据减少后,应该有助于提高SQL server的整体性能。可是在这个案例中,情况恰恰相反。 症状=========- 删除大量数据后SQL Server性能下降- 一些存储过程之前运行20分钟左右,现在需要运行2-3个小时。 背景信息=========- 大量数据通过DELETE语句而删除- 数据删除后,客户进行了相关的维护工作 : 重建索引和更新统计数据- 性能变慢的存储过程会对一些表做很多的”DELETE”,”INSERT”和”SELECT”操作。 调查=========- 相关的表都是堆( heap table) - 这些表中并没有大量数据 - DBCC CHECKCONTIG 结果显示表很大,但其页的密度 (Page Density) 却相当小。 DBCC SHOWCONTIG scanning 'tblA' table...Table: 'tblA' (322816212); index ID: 0, database ID: 14TABLE level scan performed.- Pages Scanned................................: 1779939 à13.6GB- Extents Scanned..............................: 223475- Extent Switches..............................: 223474- Avg. Pages per Extent........................: 8.0- Scan Density [Best Count:Actual Count].......: 99.56% [222493:223475]- Extent Scan Fragmentation ...................: 23.65%- Avg. Bytes Free per Page.....................: 8059.1- Avg. Page Density (full).....................: 0.43% DBCC SHOWCONTIG scanning 'tblB' table...Table: 'tblB' (1005246636); index ID: 0, database ID: 14TABLE level scan performed.- Pages Scanned................................: 215600 à1.6GB- Extents Scanned..............................: 27269- Extent Switches..............................: 27268- Avg. Pages per Extent........................: 7.9- Scan Density [Best Count:Actual Count].......: 98.83% [26950:27269]- Extent Scan Fragmentation ...................: 38.87%- Avg. Bytes Free per Page.....................: 7998.3- Avg. Page Density (full).....................: 1.18% 原因=========- 当表上有聚集索引时,删除操作会释放空页。然而,从堆中删除行时,数据库引擎可以使用行锁定或页锁定进行操作。结果,删除操作导致的空页将继续分配给堆。未释放空页时,数据库中的其他对象将无法重用关联的空间。 - 虽然表中没有大量数据,但是它们拥有大量的几乎为空的数据页。扫描表因此变得十分花时间。 解决方案=========- 若要删除堆中的行并释放页,我们可以使用下列方法之一。· 在 DELETE 语句中指定 TABLOCK 提示。使用 TABLOCK 提示会导致删除操作获取表的共享锁,而不是行锁或页锁。这将允许释放页。· 如果要从表中删除所有行,请使用 TRUNCATE TABLE。· 删除行之前,请对堆创建聚集索引。删除行之后,可以删除聚集索引。与先前的方法相比,此方法非常耗时,并且使用更多的临时资源。参考信息=========使用 DELETE 删除行 事务怎么实现级联删除\修改\插入 MS AdoDataGrid (SP6) 控件,记录非常多时,拖动不起作用,有什么办法,或合适的控件吗? 使用Transact-sql拷贝远程数据库的表,表的属性丢失? 数据库备份提示"不能用于以紧急模式打开的数据库" 请大家来判断这两个SQL语句有什么不同? 如何多表查询唯一数据 求教高手,一个数据同步产生的问题 大虾求助!!!小妹拜谢!!1 定时触发器怎么建?? 推荐系统新手小白求助大神 还原数据库时显示:该LSN 太晚,无法应用到数据库 sql求助:怎样返回表中某些记录以外的记录
你说的这个是堆结构的表,也就是没有聚集索引的表,如果在堆上删除时获取行级或分页级锁,这些空间不被释放,那怕你删除某一页的最后一条数据。这部分空间也不会马上释放。算了我懒得打字了,直接上某论坛上的例子吧。
今天给大家分享一个”删除大量数据后SQL Server性能下降”的案例。一般而言,数据库数据减少后,应该有助于提高SQL server的整体性能。可是在这个案例中,情况恰恰相反。 症状=========- 删除大量数据后SQL Server性能下降- 一些存储过程之前运行20分钟左右,现在需要运行2-3个小时。 背景信息=========- 大量数据通过DELETE语句而删除- 数据删除后,客户进行了相关的维护工作 : 重建索引和更新统计数据- 性能变慢的存储过程会对一些表做很多的”DELETE”,”INSERT”和”SELECT”操作。 调查=========- 相关的表都是堆( heap table) - 这些表中并没有大量数据 - DBCC CHECKCONTIG 结果显示表很大,但其页的密度 (Page Density) 却相当小。 DBCC SHOWCONTIG scanning 'tblA' table...Table: 'tblA' (322816212); index ID: 0, database ID: 14TABLE level scan performed.- Pages Scanned................................: 1779939 à13.6GB- Extents Scanned..............................: 223475- Extent Switches..............................: 223474- Avg. Pages per Extent........................: 8.0- Scan Density [Best Count:Actual Count].......: 99.56% [222493:223475]- Extent Scan Fragmentation ...................: 23.65%- Avg. Bytes Free per Page.....................: 8059.1- Avg. Page Density (full).....................: 0.43% DBCC SHOWCONTIG scanning 'tblB' table...Table: 'tblB' (1005246636); index ID: 0, database ID: 14TABLE level scan performed.- Pages Scanned................................: 215600 à1.6GB- Extents Scanned..............................: 27269- Extent Switches..............................: 27268- Avg. Pages per Extent........................: 7.9- Scan Density [Best Count:Actual Count].......: 98.83% [26950:27269]- Extent Scan Fragmentation ...................: 38.87%- Avg. Bytes Free per Page.....................: 7998.3- Avg. Page Density (full).....................: 1.18% 原因=========- 当表上有聚集索引时,删除操作会释放空页。然而,从堆中删除行时,数据库引擎可以使用行锁定或页锁定进行操作。结果,删除操作导致的空页将继续分配给堆。未释放空页时,数据库中的其他对象将无法重用关联的空间。 - 虽然表中没有大量数据,但是它们拥有大量的几乎为空的数据页。扫描表因此变得十分花时间。 解决方案=========- 若要删除堆中的行并释放页,我们可以使用下列方法之一。· 在 DELETE 语句中指定 TABLOCK 提示。使用 TABLOCK 提示会导致删除操作获取表的共享锁,而不是行锁或页锁。这将允许释放页。· 如果要从表中删除所有行,请使用 TRUNCATE TABLE。· 删除行之前,请对堆创建聚集索引。删除行之后,可以删除聚集索引。与先前的方法相比,此方法非常耗时,并且使用更多的临时资源。参考信息=========使用 DELETE 删除行