如何将字符串变量用于 SQL 服务器索引提示?

How to use string variable for SQL Server index hint?

我有一个 SQL Server 2012 数据库 table,其中包含几何列,并且此 table 上有一个空间索引。

我有一个 SQL 查询,我 运行 做了一些地理空间分析 (intersect/contains),当强制使用空间索引和不强制使用空间索引时,查询执行的性能有很大不同(根据 this answer 取决于我使用的 table 的大小)。我的 table 只是 1-2K 的多边形和 1-2K 的点。

因此,我在 SQL 查询中使用 WITH (INDEX(S7_idx)),其中 S7_idx 是我的空间索引的名称。

但是,当我将在另一个具有相同 table 的数据库上执行此 SQL 查询时,空间索引可能有另一个名称。所以,我不想硬编码索引名称。我认为如果我可以动态检索索引值会很棒,因为我可以确定 table.

上只有一个空间索引

select name from sys.indexes where object_id = (select object_id from sys.objects where name = 'TableName') AND type_desc = 'SPATIAL'

结果:

name S7_idx

太棒了。现在我想在 WITH 语句中使用这个值而不是硬编码的索引名称。我该怎么做?

我想我不能在我的 WITH (INDEX(...)) 语句中使用动态 SQL(使用 EXECUTE sp_executesql)。

不建议使用 hints,除非您有经验丰富的 DBA 建议。保持 statistics 最新数据将解决很多问题。

如果你确定使用的hint,那么你需要使用动态查询

DECLARE @sql VARCHAR(8000)= ''

SET @sql = 'SELECT *
FROM TableName
WITH (INDEX('
           + (SELECT NAME
              FROM   sys.indexes
              WHERE  object_id = (SELECT object_id
                                  FROM   sys.objects
                                  WHERE  NAME = 'TableName')
                     AND type_desc = 'SPATIAL')
           + '))'

PRINT @sql

EXEC(@sql) 

注意: 以上查询认为在您的 table 中只有一个 indextype_desc = 'SPATIAL'