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)