如何将字符串变量用于 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 中只有一个 index
和 type_desc = 'SPATIAL'
我有一个 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 中只有一个 index
和 type_desc = 'SPATIAL'