如何使用字符串变量进行SQL Server索引提示?

时间:2017-02-16 16:00:47

标签: sql sql-server tsql indexing spatial

我有一个带有几何列的SQL Server 2012数据库表,并且该表上有一个空间索引。

我有一个SQL查询,我运行它来做一些地理空间分析(交叉/包含),并且强制使用空间索引时查询执行的性能差别很大(根据this answer取决于我使用的表的大小)。我的桌子只有1-2K的多边形和1-2K的点数。

因此,我在SQL查询中使用node = svg .selectAll(".node") .data(nodes, function (d) { return d.name; }); var nodeEnter = node .enter() .append("g") .attr("class", "node"); nodeEnter .append("circle") .attr("r", 5); ,其中WITH (INDEX(S7_idx))是我的空间索引的名称。

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

S7_idx

结果:

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语句中使用动态SQL(EXECUTE sp_executesql)。

1 个答案:

答案 0 :(得分:1)

除非您有经验丰富的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' data() { return { headings: ['id','remark'], rows: [ { id: 1, FirstName: 'Jhon', LastName: 'Doe', remark: 0 }, { id: 2, FirstName: 'Foo', LastName: 'Bar', remark: 1 } ] }}