什么是缺失索引?
在MSSQL数据库中,索引可以加速查询的速度,降低查询的成本,提高数据库的性能。索引分为聚集索引和非聚集索引,聚集索引是按照索引的键值对予以排序的方式重新组织表格,而非聚集索引则是创建一张引用表格,引用索引并不影响原有表格的存储结构。查询时,使用索引可以减少全表扫描,提高查询效率。而缺失索引,也就是在需要查询时,找不到可以使用的索引,这会导致查询性能下降。
缺失索引对数据库性能的影响?
查询效率的降低
缺失索引会导致数据库查询的效率降低,原因在于查询时需要扫描整个数据表来寻找匹配项,而若表中有数百万行记录,会导致查询时间变得很慢。缺失索引的影响可以通过执行计划来查看。
系统资源消耗过大
因为查询效率陡然下降,导致系统资源耗费过多。这会增加CPU的使用率,同时还会占用系统的内存,因为查询需要从磁盘加载的数据更多。
如何查询缺失索引?
通过查询MSSQL数据库的系统视图,可以找到缺失索引的情况。
SELECT
DB_NAME(database_id) as DatabaseName,
OBJECT_SCHEMA_NAME(object_id,database_id) as [Schema],
OBJECT_NAME(object_id,database_id) as [ObjectName],
'CREATE NONCLUSTERED INDEX IX_' + OBJECT_NAME(object_id,database_id) +
'_' + REPLACE(REPLACE(REPLACE (ISNULL(mid.equality_columns,'') + ISNULL(mid.inequality_columns,''),',','_'),'[',''),']','') +
' ON ' + QUOTENAME(ISNULL(mid.statement,'') + ISNULL(migs.statement,'') + QUOTENAME(OBJECT_SCHEMA_NAME(object_id,database_id)) + '.' +
QUOTENAME(OBJECT_NAME(object_id,database_id))) +
'(' + ISNULL(mid.equality_columns,'') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns
IS NOT NULL THEN ',' ELSE '' END + ISNULL(mid.inequality_columns, '') + ')' +
ISNULL(' INCLUDE (' + mid.included_columns + ')', '') AS hypothetical_index
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact DESC OPTION (RECOMPILE);
执行此脚本可以查找查询成本最高的索引,并且此处的查询成本代表的是查询执行计划中用于整个查询的成本。此脚本也可以在查询执行计划中查找缺失的索引。
如何创建缺失索引?
找到缺失索引之后,根据输出的'CREATE NONCLUSTERED INDEX'语句,可以在数据库中创建缺失的索引。但需要注意的是,不应该创建所有的缺失索引,而是应该通过权衡数据库性能和索引成本来决定哪些索引应该被创建。过度使用索引将会占用大量系统资源,降低数据库的性能。
因此,应该优先创建那些成本低,但是查询次数高的索引。
使用SQL Server Management Studio创建索引
可以使用SQL Server Management Studio轻松地在MSSQL数据库中创建索引。
首先,在MSSQL Management Studio中选择要创建索引的表格。
然后在右键选项中选中'Design',打开表格的设计视图。
找到需要创建索引的字段,右键并选择'Indexes/Keys'。
在Indexes/Keys窗口中,点击'Add'按钮创建新增索引。
选择索引类型并指定索引名称。
在'Column'中选择需要包含的索引字段,并且可以指定索引的排序方式。
点击保存完成索引的创建。
使用SQL命令行创建索引
可以使用以下SQL代码在MSSQL数据库中创建索引。
CREATE INDEX [IX__columnname] ON [dbo].[tablename]([columnname] ASC)
生成索引时,需要遵循SQL Server的列表中的语法规则,并且也需要明确索引的类型。
结论
通过查询缺失索引,可以大幅提高MSSQL数据库的性能。但是,过度的索引使用也会降低数据库的性能。因此,需要权衡索引成本和数据库性能,并且在实际生产环境下遵循最佳实践。