Sql Server數據庫優化的一些高級方法
1:通過下列語句, 查找比較耗資源的查詢,將列表中提到的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
創建索引的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:用語句清理索引碎片,設置填充因子(FILLFACTOR)。
查詢數據庫索引碎片情況的語句:
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 語句重建索引
3)使用 ALTER INDEX REBUILD 語句重建索引
4)使用 ALTER INDEX REORGANIZE 重新組織索引
重新組織和重新生成索引:摸這里
參考文檔:摸這里
查看填充因子---》索引-右鍵-碎片-頁填充度
填充因子大的時候,插入或修改記錄后重新索引的工作會很大,磁盤IO操作增加,性能必然降低,但其占用空間小.填充因子小的時候,索引文件占用磁盤及內存空間相對要大,但是,系統本身重新索引所需IO操作減少,性能提高,只是多占用一些存儲空間. 孰輕孰重要自已決定。
通常只有當不會對數據進行更改時(例如,在只讀表中)才會使設置100%。另外,只有當在表中根據現有數據創建新索引,并且可以精確預見將來會對這些數據進行哪些更改時,將填充因子選項設置為另一個值才有用。所以填充因子不是很容易設置的。
參考文檔:摸這里
如何設置固定的填充因子(全局性的):摸這里
為索引指定填充因子:摸這里
該示例重新生成現有索引,并在重新生成操作過程中應用指定的填充因子。
Transact-SQL語句:
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 設置一個表中的所有索引的因子:
ALTER INDEX ALL ON dbo.t_GoodsSale REBUILD WITH(FILLFACTOR=90)