【问题标题】:create virtual index - just for the plan创建虚拟索引 - 仅用于计划
【发布时间】:2014-02-11 08:09:22
【问题描述】:

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

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

【问题讨论】:

  • 从未听说过VIRTUAL INDEX 我知道INDEXED VIEWS。通常,如果我想测试使用特定索引如何执行某些操作。我实际上创建了它,运行我的查询,如果我不需要它,则在事后删除它。
  • 我认为您可能需要 Sql Server Tuning Advisor 之类的东西,它会查看您的查询并建议您哪些索引可以帮助提高查询的性能。它不会创建任何虚拟索引,但它只会为您提供有关哪些索引可以提高查询性能以及提高多少的建议。看看这里technet.microsoft.com/en-us/library/ms173494(v=sql.105).aspx
  • 在您看到调整顾问的建议之后,您必须根据您的个人需求决定是否创建该索引。
  • 当您查看您的ACTUAL EXECUTION PLAN 时,是否建议添加索引?您不能依赖它,但 SQL Server 应该建议新的索引以及它将如何改进您的查询。
  • 你可能在想hypothetical indexes。没有记录在案的方法可以自己使用它们。

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


【解决方案1】:

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

因此,要做到这一点,您需要执行以下操作:

在你的桌子上创建你的假设索引:

CREATE NONCLUSTERED INDEX IX_Hypothetical ON dbo.tableName (columnName) 
WITH STATISTICS_ONLY = -1

这会在 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

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

【讨论】:

  • 这似乎是我记得的!但这比我想象的要复杂一些。无论如何,它回答了我的问题。
  • 不敢相信我从来没有听说过这个!
猜你喜欢
  • 2017-01-06
  • 1970-01-01
  • 2015-12-05
  • 2019-04-03
  • 1970-01-01
  • 2017-01-06
  • 2017-12-10
  • 2013-10-05
  • 2015-10-11
相关资源
最近更新 更多