创建虚拟索引 - 仅适用于计划

时间:2014-01-21 16:00:18

标签: sql-server sql-server-2008-r2 indexing sql-execution-plan

我正在优化长时间运行的T-SQL查询。不知何故,我记得SQL Server中有一个功能,它允许检查索引存在时计划的方式。像CREATE VIRTUAL INDEX之类的东西然后检查计划。但我没有找到如何实现这一点。

SQL Server 2008R2中是否有这样的功能?

1 个答案:

答案 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记录,因此不建议在开发机器之外使用,并且可以在没有警告的版本之间进行更改,因此不要过分依赖它,就像这样工作。