Ubuntu下SQL Server索引优化策略
选择合适的索引类型
OrderDate),每个表只能有一个。其本质是将数据按索引顺序存储,大幅减少范围查询的磁盘I/O。CustomerID),一个表可创建多个。但需注意,非聚集索引查询需回表(访问聚集索引)才能获取完整数据,会增加开销。INCLUDE子句将查询所需的所有列包含在索引中(如CREATE NONCLUSTERED INDEX idx_Orders_Covering ON Orders (CustomerID) INCLUDE (OrderDate, TotalAmount)),避免回表操作,显著提升查询性能,尤其适合频繁执行的大查询。CREATE NONCLUSTERED INDEX idx_Orders_Filtered ON Orders (OrderDate) WHERE OrderDate >= '2023-01-01'),减少索引大小和维护成本,适用于经常查询特定范围数据的场景。复合索引设计黄金法则
CustomerID,值分布广)放在复合索引前面,低选择性列(如Gender,值分布集中)放在后面,提高索引过滤效率。WHERE子句顺序一致(如查询常以CustomerID和OrderDate为条件,则索引应为(CustomerID, OrderDate))。INCLUDE子句包含查询中需要的非索引列(如TotalAmount),使查询可直接从索引中获取数据,无需回表。定期维护索引碎片
sys.dm_db_index_physical_stats动态管理视图查看索引碎片率(如avg_fragmentation_in_percent字段)。ALTER INDEX ... REORGANIZE重组索引(在线操作,对业务影响小);当碎片率超过30%时,使用ALTER INDEX ... REBUILD重建索引(离线操作,性能提升更明显,但需停机)。更新统计信息
UPDATE STATISTICS命令定期更新索引统计信息(如UPDATE STATISTICS Orders),确保优化器能准确评估查询成本,避免因统计信息过时导致的次优执行计划。监控与清理未使用索引
sys.dm_db_index_usage_stats动态管理视图监控索引使用情况(如user_seeks、user_scans、user_updates字段),识别长期未被使用(如user_seeks=0且user_scans=0)的索引。删除未使用的索引,减少插入、更新、删除操作的开销(每个索引都会增加写操作的成本)。基于执行计划优化
SET SHOWPLAN_ALL ON;命令)分析查询,识别表扫描、键查找(Bookmark Lookup)等昂贵操作。若执行计划显示“缺失索引”,需结合业务需求人工审核后创建(SQL Server的缺失索引建议仅供参考)。优化查询语句
SELECT *:只查询需要的列,减少数据传输量和回表操作。LIKE:尽量避免前导通配符(如LIKE '%value%'),此类查询会导致索引失效。优先使用前缀匹配(如LIKE 'value%'),仍可利用索引。OR条件:OR条件会导致索引失效,尽量用UNION ALL替代(如SELECT * FROM Orders WHERE CustomerID=1 UNION ALL SELECT * FROM Orders WHERE CustomerID=2)。EXISTS替代IN:对于子查询,EXISTS通常比IN更高效(EXISTS在找到第一条匹配记录后即停止搜索,而IN需遍历整个子查询结果集)。索引视图
SUM、COUNT、GROUP BY)的性能。但需注意,索引视图会增加写操作的成本(需维护视图数据),适用于读多写少的场景。列存储索引
SELECT SUM(TotalAmount) FROM Orders GROUP BY CustomerID)。其通过列式存储和压缩技术,大幅减少I/O开销和查询时间,但不适合OLTP高频小事务(如频繁的插入、更新)。