2013-02-21 75 views
1

我在具有可爲NULL或NOT NULL(未放置或放置在地圖上)的地理座標列的SQL Server數據庫中有大量照片(〜10百萬)。在空間索引中使用NULL

另外我創建了這個地理信息的空間索引。

現在我試圖選擇某些多邊形內的所有照片。

有存儲哪些不是在地圖上照片的方法有兩種:

  • 如果我分配NULL地緣這不是地圖上的所有照片的位置,這樣的查詢速度太慢的性能(如我覺得不舒服,空間索引根本不適用於NULL列)。

  • 如果我將POINT(0 0)分配給地圖上所有不在地圖上的照片,性能很好,除了這個零點POINT(0 0)。此類請求也會返回錯誤的照片(它們在地圖上不存在)。

我該如何克服這些問題?

我應該添加一個包含NULL或NOT NULL位的列,並從兩列(此列和地理信息)創建索引嗎?

UPDATE我試圖從兩列創建索引,但這是不可能的,因爲空間索引只包含一個包含地理信息的列(MSDN)。

回答

0

據我所知,有我的問題的兩個解決方案:

  • 移動零點POINT(0 0)到遙遠的北方點POINT(0 90)。此解決方案並不理想,但可以工作,不需要更改SQL Server版本。
  • 通過該腳本的執行更改SQL Server版本至110(在這個版本錯誤與NULL被固定): ALTER DATABASE DATABASE_NAME SET COMPATIBILITY_LEVEL = 110
1

您使用的是哪個版本的SQL服務器? 有可空空間列的已知問題在2008年和2008 R2 請看看我的問題在這同一主題:SQL Server 2008 Performance on nullable geography column with spatial index

我具有一個單獨的表來存儲空間數據類型解決了這個問題。 在我的項目中,我有一個地址表,裏面有一個Id列,一個緯度和一個經度列 然後我有一個AddressCoordinate表,它具有地址Id和一個Geography列的外鍵約束。 最後,我有一個腳本可以在較低的基礎上填充缺失的有效AddressCoordinates。

+0

附表不是因爲冗餘的一個很好的解決方案。 – 2013-02-28 09:29:11

+1

我同意這不是一個理想的解決方案,但它確實有好處: 1:沒有插入需要稍後過濾掉的虛擬數據。 2:大小和性能:虛擬數據也會顯着增加索引大小,從而影響執行時間。 3:我只有存儲在該表上的空間數據類型,所以唯一的重複是PK。 這種折衷讓我值得一看,但我知道你對你的情況得出了不同的結論。 – Tomas 2013-02-28 12:54:25