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

Fra*_*kPl 4 sql-server indexing sql-server-2008-r2 sql-execution-plan

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

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

ste*_*ary 7

是的,你可以,它们被称为假设索引,而不是虚拟索引.它们通常由数据库调优顾问程序创建,除非您在自动驾驶模式下运行查询,否则查询优化程序将忽略它们.

因此,要执行此操作,您需要执行以下操作:

在桌面上创建假设索引:

CREATE NONCLUSTERED INDEX IX_Hypothetical ON dbo.tableName (columnName) 
WITH STATISTICS_ONLY = -1
Run Code Online (Sandbox Code Playgroud)

这会在sys.indexes表中创建一个条目,并将is_hypothetical标志设置为1(即索引实际上不存在,只是统计信息)

然后,您需要找到有关索引的一些信息以提供给自动驾驶仪,您需要数据库ID,表的对象ID和索引的ID号,您可以使用以下查询获得:

SELECT dbid = DB_ID(),
       objectid = 
object_id,
       indid = index_id
  FROM sys.indexes
 WHERE 
object_id = 
OBJECT_ID('dbo.tableName')
   AND is_hypothetical = 1
Run Code Online (Sandbox Code Playgroud)

在我的例子中,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
Run Code Online (Sandbox Code Playgroud)

0是对象的typeid,0是非聚簇索引,我相信6是聚簇索引,如果在运行SET AUTOPILOT ON之前创建了多个索引,则可以使用不同的索引多次运行DBCC AUTOPILOT,这样就可以获得优化器评估所有这些.

另外请记住,这完全没有被Microsoft记录,所以不建议在开发机器之外使用,并且可以在没有警告的版本之间进行更改,因此不要过分依赖它像这样工作.