2011-02-23 74 views
3

我刚刚使用Sql Server 2008数据库项目将数据库导入到Visual Studio项目。在解决了Visual Studio突出强调的许多问题后,我现在只剩下两个与提示索引有关的问题。 2个警告(与引起语句)是数据库模式暧昧索引提示问题

SELECT a.FI, a.GD 
FROM [RME].[dbo].[BP_RN] a with(index(idx_GD)) 
WHERE GD.STWithin(@Geometry) = 1 

SQL04151:步骤:[DBO] [sp_TNFRME] 包含未解决的引用的 对象。或者该对象不存在 或参考是不明确的 ,因为它可以指任何 下列对象: [DBO] [BP_RN] [idx_GD]或 [DBO] [idx_GD]。

SELECT a.I 
FROM [dbo].[N] a with(index(idx_G)) 
WHERE a.G.STIntersects(@Geometry) = 1 

SQL04151:步骤:[DBO] [sp_DIOQE] 包含未解决的引用的 对象。或者对象不存在 或者参考不明确 ,因为它可能引用以下对象中的任意一个 :[dbo]。[idx_G]或 [dbo]。[N]。[idx_G]。

我之所以列出两个独立的原因是因为第一个是查询一个单独的数据库,我不知道这是否意味着它需要以不同的方式解决。

无论如何,我的问题是我如何解决这个错误或完全限定提示,所以它不再含糊不清?

感谢

+0

我有同样的问题,除了删除提示,找不到解决方案。如果在开发过程中的某个时候,指数对于被测试的数据的选择性不够,即太多的行与选择标准相匹配,那么似乎有用或必要。我要测试是否有更真实的空间数据,有任何理由不删除提示。 – 2013-01-03 09:31:57

+0

没关系。只是意识到数据库引擎不会跟踪空间索引的统计信息,因此可能几乎总是需要使用提示。这篇文章并在查询计划中亲眼看到它帮助我得到:-) http://www.bostongis.com/PrinterFriendly.aspx?content_name=sql2008_tut03 – 2013-01-03 10:38:46

回答

1

有在Visual Studio 2010最终摆脱警告没有摆脱暗示的黑客,但你必须改变,而不是使用索引的名字index_id的提示。

这与一个包含3个空间数据列和每个索引的示例表一起使用。

在导航到表的索引文件夹之后,右键单击索引文件夹并选择添加空间索引,在模式视图中,VS2010 Ultimate中的数据库项目中创建了空间索引。

每个空间索引的index_id取决于为同一个表创建空间索引的顺序 - 而不是创建任何其他索引的顺序。

空间索引之间的索引创建顺序取决于它们在模式视图索引文件夹中出现的从上到下的顺序,因此基本上是字母数字字典顺序。

空间索引的index_id值始终始于384000,并且按照创建顺序为每个额外创建的索引增加1。

对于具有3个空间索引的例子中,我创建的名称,如:

  1. TABLEPREFIX_SPATIAL384000_COLUMNNAME1
  2. TABLEPREFIX_SPATIAL384001_COLUMNNAME2
  3. TABLEPREFIX_SPATIAL384002_COLUMNNAME3

删除并重新创建索引也产生相同的index_id的用于每个索引。

所以,后来我换成:

WITH(INDEX(TABLEPREFIX_SPATIAL384000_COLUMNNAME1)) 

有:

WITH(INDEX(384000)) 

的Visual Studio毫无怨言编译,并查询运行为使用正确的索引提示意图。

CAVEAT:如果您必须升级现有数据库,则必须删除/创建,而不是重命名,而且必须按照正确的顺序执行。这不是一个很好的解决办法,但它会摆脱警告

的我使用的SQL命令变量一样尝试了稍显好看的方法:

WITH(INDEX([$(my_geographic_index_name)])) 

很不幸,这也产生了不想要的警告。

祝你好运。