怎樣將索引碎片數(shù)量降至最低_Mssql數(shù)據(jù)庫教程
推薦:SQL Server中, DateTime (日期)型操作的 SQL語法這兩天操作SQL Server的數(shù)據(jù),需求是將一個日期類型字段的時、分、秒去處,即 ‘2007-11-07 16:41:35.033’ 改為‘2007-11-07 00:00:00‘,所以查詢了一下網(wǎng)上對DateTime類型操作的SQL語法,發(fā)現(xiàn)實現(xiàn)這個功能很簡單。 update YourTable set YourDateColumn
索引碎片能增大索引樹的大小,增加不必要的IO,所以每隔一段時間對索引碎片進(jìn)行檢查時很有必要的。下面一個示例一起來分析如何將索引降至最低。
新建一個表:
(
i int primary key,
xx varchar(200) not null
)
加入數(shù)據(jù):
set @x = 0while @x <1000
begin
insert into t3 values (@x,'qweasdqweasdqweasdqweqweasdqwe')
set @x = @x+1
end
執(zhí)行動態(tài)管理視圖:
可以看到:

index_id為0表示這個是堆,平均的碎片有33%
現(xiàn)在執(zhí)行幾個可以減少碎片的方法都不管用,不能減少碎片。
包括:
alter index PK__t3__0EA330E9 on t3
rebuild
dbcc dbreindex ('t3')
后來我覺得是因為數(shù)據(jù)太少了,導(dǎo)致頁也很少,數(shù)據(jù)庫可能存在某種智能,判斷是否值得去做重建索引的工作,所以加大的數(shù)據(jù)量:
set @x = 1000
while @x <10000
begin
insert into t3 values (@x,'qweasdqweasdqweasdqweqweasdqwe')
set @x = @x+1
end
再執(zhí)行語句:
alter index t3index on t3
rebuild
顯示出來了!
結(jié)論:
SQL Server在執(zhí)行相關(guān)的操作的時候都會智能去判斷是否值得去做,比如在頁面數(shù)太小的情況下可以不去重建索引,rebuild reindex 。類似的,在SQL Server 2005 里面也多了許多智能的判斷來保證一個完整龐大而又不失智能的設(shè)計,
比如:
生成查詢計劃的閥值
緩存機(jī)制,緩存的篩選,LRU算法
預(yù)讀機(jī)制
checkpoint減少回滾距離
智能join判斷
重編譯
了解SQL Server這種類似的軟件產(chǎn)品能夠為我們在設(shè)計產(chǎn)品的時候提供更多的思路想法,即使你了解上面的東西對你的SQL開發(fā)也不會有太多幫助。
另外附上幾種方式的區(qū)別:
reindex是比較好的選擇,速度快,但是他不能在線操作
INDEXDEFRAG 比較慢,但是可以在線操作
rebuild建議在碎片較少時采用。
附上微軟的重建索引腳本,從里面也可以看出微軟根據(jù)碎片大小推薦的方式,不過這個要隨每個不同的數(shù)據(jù)庫而定。-- ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname sysname;
DECLARE @objectname sysname;
DECLARE @indexname sysname;
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command varchar(8000);
-- ensure the temporary table does not exist
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
-- conditionally select from the function, converting object and index IDs to names.
SELECT
object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM work_to_do;
-- Open the cursor.
OPEN partitions;
-- Loop through the partitions.
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag;
WHILE @@FETCH_STATUS = 0
BEGIN;
SELECT @objectname = o.name, @schemaname = s.name
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;
SELECT @indexname = name
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;
SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;
-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding
IF @frag < 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname + ' ON ' + @schemaname + '.' + @objectname + ' REORGANIZE';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
EXEC (@command);
END;
IF @frag >= 30.0
BEGIN;
SELECT @command = 'ALTER INDEX ' + @indexname +' ON ' + @schemaname + '.' + @objectname + ' REBUILD';
IF @partitioncount > 1
SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
EXEC (@command);
END;
PRINT 'Executed ' + @command;
FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;
-- drop the temporary table
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
DROP TABLE work_to_do;
GO
BOL的推薦:
| avg_fragmentation_in_percent 值 | 修復(fù)語句 |
|---|---|
> 5% 且 < = 30% | ALTER INDEX REORGANIZE |
> 30% | ALTER INDEX REBUILD WITH (ONLINE = ON)* |
小于5沒必要重建,所以上面的SQL語句還是有得商量的地方。
分享:解析Sqlserver常用函數(shù)在操作SQLServer的時候, 很多時候記不住具體的函數(shù)如何使用, 查找聯(lián)機(jī)幫助還是嫌麻煩, 且有很多時候例子也不好懂, 下面對每個常用的函數(shù)用用例子說明,一目了然,你自己在數(shù)據(jù)庫中執(zhí)行一下,結(jié)果就知道什么回事了 --字符串功能 --substring print substring('ia
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- 在SQL Server中實現(xiàn)最短路徑搜索的解決方法
- SQL Server 數(shù)據(jù)庫清除日志的方法
- SQL2005 性能監(jiān)視器計數(shù)器錯誤解決方法
- SQL Server 2008存儲結(jié)構(gòu)之GAM、SGAM介紹
- MySQL的數(shù)據(jù)類型和建庫策略
- SQL Server數(shù)據(jù)庫中處理空值時常見問題
- 按指定排列順序獲取數(shù)據(jù)的sql語句
- SqlServer2005 數(shù)據(jù)庫同步配置圖文詳解
- 確定幾個SQL Server欄中的最大值
- SQL SQL Server 2008中的新日期數(shù)據(jù)類型
猜你也喜歡看這些
- 淺談SQLite時間函數(shù)的使用說明與總結(jié)分析
- MYSQL SET類型字段的SQL操作知識介紹
- DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用
- 遠(yuǎn)程連接mysql數(shù)據(jù)庫注意點記錄
- 使用MySQL Slow Log來解決MySQL CPU占用高的問題
- MySQL 替換某字段內(nèi)部分內(nèi)容的UPDATE語句
- mysql導(dǎo)出數(shù)據(jù)庫幾種方法
- 更新text字段時出現(xiàn)Row size too large報錯應(yīng)付措施
- SQL查詢超時的設(shè)置方法(關(guān)于timeout的處理)
- MySQL索引簡單分析
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-怎樣將索引碎片數(shù)量降至最低
。