Sql Server数据库优化的一些高级方法

欢欢欢欢 发表于 2018-3-22 09:22
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)
进阶(深层次的介绍和示例):摸这里 3:设置数据库最大并行度: 设置方法:右键数据库---》属性-----》高级-----》最大并行度 这是设置同时可以使用的CPU的核数量,防止CPU被某一个请求占用到100%。