
你是否遇到过数据库突然变慢,却不知从何优化?SQL Server其实比你想象得更聪明——它一直在默默观察,随时准备告诉你性能问题的答案。今天我们来揭秘它如何精准找出缺失的索引。
如果需要常用的运维脚本,例如查看TOPSQL、收缩日志、查看库表大小等,可以关注公众号“数据库干货铺”联系我获取。
一、数据库的“智能监控系统”
SQL Server内置了一套完善的索引使用情况追踪机制。每当查询执行时,优化器会同时做两件事:
这套机制的核心是三个动态管理视图(DMV),它们像是数据库的“诊断报告单”:
二、“索引推荐算法”公式
以下这个查询,它揭示了SQL Server的推荐逻辑:
SELECT TOP 10
CONVERT(DECIMAL(28,1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) AS improvement_measure,
'CREATE INDEX [missing_index_' + CONVERT(VARCHAR, mig.index_group_handle) + '_' + CONVERT(VARCHAR, mid.index_handle) + '_' + LEFT(PARSENAME(mid.statement, 1), 32) + ']' +
' ON ' + mid.statement + ' (' + 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 create_index_statement
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
WHERE CONVERT (DECIMAL (28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY improvement_measure DESC;
核心计算公式解析:
avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)
这个公式的智慧在于:
三者相乘,得到一个“性价比分数”——高频、高成本、高提升潜力的查询推荐的索引会排在前面。
三、索引建议的“完整配方”
生成的CREATE INDEX语句包含精心设计的所有要素:
四、实战中的智能表现
假设一个用户表查询:
SELECT username, email FROM users WHERE city='北京' AND age>25 ORDER BY create_timeSQL Server可能推荐(建议执行前复核一下,以免推荐的不合理):
CREATE INDEX idx_recommend ON users(city, age) INCLUDE(username, email)为什么这样设计?这是因为city在WHERE中等值匹配,作为首列,age是范围查询,作为第二列,这样符合"最左前缀原则",2个列的索引都能用上;username和email只出现在SELECT中,放入INCLUDE覆盖查询
五、温馨提示:智慧使用索引建议
不要盲目创建:先分析查询模式,避免过度索引
为了及时解决缺少索引引起的性能问题,可以考虑创建定时任务,定期执行这个查询,将结果保存到日志表,长期追踪数据库的索引需求变化,形成自己的“索引优化知识库”。
六、 结语
SQL Server的这个功能就像是给你的数据库配了一位24小时在线的性能顾问。它不会直接告诉你答案,但会给出数据支撑的建议。聪明的DBA懂得既要倾听数据库的“建议”,也要结合业务实际做出最终决策。
记住,最好的索引策略是:基于数据,成于实践,终于效能。下次数据库变慢时,不妨问问SQL Server:“你觉得我缺了什么?” 它的回答可能会让你惊喜。
欢迎关注“数据库干货铺”,获取更多数据库优化秘籍。如果你有特别的数据库疑难杂症,欢迎留言讨论!