我正在优化长时间运行的T-SQL查询。不知何故,我记得SQL Server中有一个功能,它允许检查索引存在时计划的方式。像CREATE VIRTUAL INDEX
之类的东西然后检查计划。但我没有找到如何实现这一点。
SQL Server 2008R2中是否有这样的功能?
答案 0 :(得分:6)
是的,你可以,它们被称为假设索引,而不是虚拟索引。它们通常由数据库调优顾问程序创建,除非您在自动驾驶模式下运行查询,否则查询优化程序将忽略它们。
因此,要做到这一点,您需要执行以下操作:
在桌面上创建假设索引:
CREATE NONCLUSTERED INDEX IX_Hypothetical ON dbo.tableName (columnName)
WITH STATISTICS_ONLY = -1
这会在sys.indexes表中创建一个条目,并将is_hypothetical标志设置为1(即索引实际上不存在,只是统计信息)
然后,您需要找到有关索引的一些信息以提供给自动驾驶仪,您需要数据库ID,表的对象ID和索引的ID号,您可以通过以下查询获得: / p>
SELECT dbid = DB_ID(),
objectid =
object_id,
indid = index_id
FROM sys.indexes
WHERE
object_id =
OBJECT_ID('dbo.tableName')
AND is_hypothetical = 1
就我而言,dbid = 7,objectid = 1237579447和indid = 4
然后,您可以在自动驾驶模式下运行查询,以获得一个执行计划,如果您创建的假设索引实际存在于您的桌子上,则可以生成该计划:
DBCC AUTOPILOT(0, 7, 1237579447, 4)
GO
SET AUTOPILOT ON
GO
SELECT * FROM dbo.tableName
WHERE columnName = 8
GO
SET AUTOPILOT OFF
0是对象的typeid,0是非聚簇索引,我相信6是聚簇索引,如果在运行SET AUTOPILOT ON之前创建了多个索引,可以多次运行DBCC AUTOPILOT,这样就可以了让优化者评估所有这些。
另外请记住,这完全没有被Microsoft记录,因此不建议在开发机器之外使用,并且可以在没有警告的版本之间进行更改,因此不要过分依赖它,就像这样工作。