我有一个带有几何列的SQL Server 2012数据库表,并且该表上有一个空间索引。
我有一个SQL查询,我经营该查询来进行一些地理空间分析(相交/包含)和查询执行的性能在强迫使用空间索引而不是(根据此答案取决于此答案的大小)时有很大不同我使用的桌子)。我的桌子只是1-2k的polys和1-2k的点。
所以,我在SQL查询中使用WITH (INDEX(S7_idx))
,其中S7_idx
是我的空间索引的名称。
但是,当我在具有相同表的另一个数据库上执行此SQL查询时,空间索引可能具有另一个名称。因此,我不想硬编码索引名称。我认为如果我可以动态地检索索引值,那将是很棒的,因为我可以确定表上只有一个空间索引。
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)
注意:在您表中查询中的查询考虑,index
只有一个type_desc = 'SPATIAL'