以下几点建议:
1,检查是否遗漏查询表的JOIN;
2,检查是否遗漏查询表的WHERE;
3,检查统计是否自动创建和更新;
4,检查统计是否保持最新;
USE AdventureWorks;
GO
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);
GO
Exec sp_updatestats
UPDATE STATISTICS Person.Address WITH FULLSCAN
5,检查表和索引扫描;
SELECT avg_total_user_cost,avg_user_impact,user_seeks, user_scans,
ID.equality_columns,ID.inequality_columns,ID.included_columns,ID.statement
FROM sys.dm_db_missing_index_group_stats GS
LEFT OUTER JOIN sys.dm_db_missing_index_groups IG On (IG.index_group_handle = GS.group_handle)
LEFT OUTER JOIN sys.dm_db_missing_index_details ID On (ID.index_handle = IG.index_handle)
ORDER BY avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)DESC
6,检查RID LOOKUP;
7,检查排序;
如果排序在执行计划占很高比例,考虑:
增加CLUSTER INDEX在排序列;
使用索引视图;
增加NO CLUSTER INDEX,包括所有返回列。
8,检查是否索引碎片过大;
超过30%,考虑重建或重组索引。
Declare @db SysName;
Set @db = '<DB NAME>';
SELECT CAST(OBJECT_NAME(S.Object_ID, DB_ID(@db)) AS VARCHAR(20)) AS 'Table Name',
CAST(index_type_desc AS VARCHAR(20)) AS 'Index Type',
I.Name As 'Index Name',
avg_fragmentation_in_percent As 'Avg % Fragmentation',
record_count As 'RecordCount',
page_count As 'Pages Allocated',
avg_page_space_used_in_percent As 'Avg % Page Space Used'
FROM sys.dm_db_index_physical_stats (DB_ID(@db),NULL,NULL,NULL,'DETAILED' ) S
LEFT OUTER JOIN sys.indexes I On (I.Object_ID = S.Object_ID and I.Index_ID = S.Index_ID)
AND S.INDEX_ID > 0
ORDER BY avg_fragmentation_in_percent DESC
ALTER INDEX ALL ON <Table Name> REBUILD(OR REORGANIZE);
ALTER INDEX <Index Name> ON <Table Name> REBUILD(OR REORGANIZE);
9,检查是否有表锁;
事物短为好;
考虑并行,使用'Read Committed using row versioning' or 'Snapshot';
明确表暗示,使用“READUNCOMMITED OR READPAST".