Sql Server數(shù)據(jù)庫(kù)優(yōu)化的一些高級(jí)方法
1:通過(guò)下列語(yǔ)句, 查找比較耗資源的查詢(xún),將列表中提到的equality_columns和inequality_columns建成索引。
SELECT TOP 50
ROUND(s.avg_total_user_cost * s.avg_user_impact * (s.user_seeks + s.user_scans),0) AS [Total Cost]
, s.avg_user_impact
, d.statement AS TableName
, d.equality_columns
, d.inequality_columns
, d.included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC
創(chuàng)建索引的Sql:
CREATE NONCLUSTERED INDEX [索引名] ON [dbo].[t_ShopSerWaiter]
(
[SerElementCode] ASC, [Status] ASC, [DeleFlag] ASC,
[SerLogCode] ASC ,
[SaleType] ASC,
[UserCode] ASC,
[ShopCode] ASC, [CreateTime] ASC
)WITH (ONLINE = off) ON [PRIMARY]
GO
2:用語(yǔ)句清理索引碎片,設(shè)置填充因子(FILLFACTOR)。
查詢(xún)數(shù)據(jù)庫(kù)索引碎片情況的語(yǔ)句:
SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE indexstats.avg_fragmentation_in_percent > 50
ORDER BY indexstats.avg_fragmentation_in_percent DESC
清理索引碎片有四種方式:
1)刪除并重建
2)使用 DROP_EXISTING 語(yǔ)句重建索引
3)使用 ALTER INDEX REBUILD 語(yǔ)句重建索引
4)使用 ALTER INDEX REORGANIZE 重新組織索引
重新組織和重新生成索引:摸這里
參考文檔:摸這里
查看填充因子---》索引-右鍵-碎片-頁(yè)填充度
填充因子大的時(shí)候,插入或修改記錄后重新索引的工作會(huì)很大,磁盤(pán)IO操作增加,性能必然降低,但其占用空間小.填充因子小的時(shí)候,索引文件占用磁盤(pán)及內(nèi)存空間相對(duì)要大,但是,系統(tǒng)本身重新索引所需IO操作減少,性能提高,只是多占用一些存儲(chǔ)空間. 孰輕孰重要自已決定。
通常只有當(dāng)不會(huì)對(duì)數(shù)據(jù)進(jìn)行更改時(shí)(例如,在只讀表中)才會(huì)使設(shè)置100%。另外,只有當(dāng)在表中根據(jù)現(xiàn)有數(shù)據(jù)創(chuàng)建新索引,并且可以精確預(yù)見(jiàn)將來(lái)會(huì)對(duì)這些數(shù)據(jù)進(jìn)行哪些更改時(shí),將填充因子選項(xiàng)設(shè)置為另一個(gè)值才有用。所以填充因子不是很容易設(shè)置的。
參考文檔:摸這里
如何設(shè)置固定的填充因子(全局性的):摸這里
為索引指定填充因子:摸這里
該示例重新生成現(xiàn)有索引,并在重新生成操作過(guò)程中應(yīng)用指定的填充因子。
Transact-SQL語(yǔ)句:
USE AdventureWorks2012; GO -- Rebuilds the IX_Employee_OrganizationLevel_OrganizationNode index -- with a fill factor of 80 on the HumanResources.Employee table. ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee REBUILD WITH (FILLFACTOR = 80); GO 設(shè)置一個(gè)表中的所有索引的因子:
ALTER INDEX ALL ON dbo.t_GoodsSale REBUILD WITH(FILLFACTOR=90)