2011-02-23 59 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)])) 

很不幸,這也產生了不想要的警告。

祝你好運。