2017-02-16 38 views
0

我有一个带有几何列的SQL Server 2012数据库表,并且此表上有一个空间索引。如何为SQL Server索引提示使用字符串变量?

我有一个SQL查询,我运行一些地理空间分析(intersect/contains),查询执行的性能差异很大,强制使用空间索引而不是(根据this answer取决于大小我使用的表格)。我的桌子只有1-2K的多边形和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)。

回答

1

使用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) 

注:上面的查询考虑在你的餐桌上只有一个indextype_desc = 'SPATIAL'

+0

谢谢,只是我需要什么。有没有其他方法可以做到这一点?我有一个相当毛茸茸的查询是存储过程的一部分,我讨厌用SQL代码连接一堆字符串...... –

相关问题