SQL Server 2008 引入了對空間數據和空間索引的支持。“空間索引”是一種擴展索引,允許您對空間列編制索引。空間列是包含空間數據類型(如 geometry 或 geography )數據的表列。本節中的主題介紹了空間索引。

 

SQL Server 2008 及更高版本支持空間數據。這包括對平面空間數據類型 geometry 的支持,該數據類型支持歐幾里得座標系統中的幾何數據(點、線和多邊形)。geography 數據類型表示地球表面某區域上的地理對象,如一片陸地。geography 列的空間索引會將地理數據映射到二維非歐幾里得空間。

空間索引是對包含空間數據的表列(“空間列”)定義的。每個空間索引指向一個有限空間。例如,geometry 列的索引指向平面上用户指定的矩形區域。

 

在 SQL Server 2008 中,空間索引使用 B 樹構建而成,也就是説,這些索引必須按 B 樹的線性順序表示二維空間數據。因此,將數據讀入空間索引之前,SQL Server 2008 先實現對空間的分層均勻分解。索引創建過程會將空間分解成一個四級“網格層次結構”。這些級別指的是“第 1 級”(頂級)、“第 2 級”、“第 3 級”和“第 4 級”。

 

每個後續級別都會進一步分解其上一級,因此上一級別的每個單元都包含下一級別的整個網格。在給定級別上,所有網格沿兩個軸都有相同數目的單元(例如 4x4 或 8x8),並且單元的大小都相同。

下圖顯示了網格層次結構每個級別的右上角單元被分解成 4x4 網格的情況。事實上,所有單元都是以這種方式分解的。因此,以此為例,將一個空間分解成四個級別的 4x4 網格實際上會總共產生 65,536 個第四級單元。

 

xz2 空間索引_數據類型

針對空間索引進行的空間分解與應用程序數據使用的度量單位無關。

 

網格層次結構的單元是利用多種 Hilbert 空間填充曲線以線性方式編號的。然而,出於演示目的,這裏使用的是簡單的按行編號,而不是由 Hilbert 曲線實際產生的編號。在下圖中,幾個表示建築物的多邊形和表示街道的線已經放進了一個 4x4 的 1 級網格中。第 1 級單元的編號為 1 到 16,編號從左上角的單元開始。

xz2 空間索引_xz2 空間索引_02

 

沿網格軸的單元數目確定了網格的“密度”:單元數目越大,網格的密度越大。例如,8x8 網格(產生 64 個單元)的密度就大於 4x4 網格(產生 16 個單元)的密度。網格密度是以每個級別為基礎定義的。

 

網格配置 單元數目

低 4X4 16

中 8X8 64

高 16X16 256

 

默認設置所有級別都為  。

您可以通過指定非默認的網格密度控制分解過程。例如,在不同級別指定不同網格密度對於基於索引空間的大小和空間列中的對象來優化索引可能非常有用。

空間索引的網格密度顯示在 sys.spatial_index_tessellations 目錄視圖的 level_1_grid、level_2_grid、level_3_grid 和 level_4_grid 列中。

 

將索引空間分解成網格層次結構後,空間索引將逐行讀取空間列中的數據。讀取空間對象(或實例)的數據後,空間索引將為該對象執行“分割過程”。分割過程通過將對象與其接觸的網格單元集(“接觸單元”)相關聯使該對象適合網格層次結構。從網格層次結構的第 1 級開始,分割過程以“廣度優先”方式對整個級別進行處理。在可能的情況下,此過程可以連續處理所有四個級別,一次處理一個級別。

 

分隔規則

分割過程的輸出為對象的空間索引中所記錄的接觸單元集。通過引用這些已記錄單元,空間索引可以確定該對象在空間中相對於空間列中也存儲在索引中的其他對象的位置。

 

為了限制為對象記錄的接觸單元數,分割過程採用了幾個分割規則。這些規則確定分割過程的深度以及在索引中記錄哪些接觸單元。

這些規則如下:

  • 覆蓋規則
    如果一個對象完全蓋住了某個單元,則稱該單元由該對象所“覆蓋”。被覆蓋的單元會參與計數,但不進行分割。此規則應用於網格層次結構的所有級別。覆蓋規則簡化了分割過程,並減少了空間索引記錄的數據量。
  • 每對象單元數規則
    此規則強制執行“每對象單元數限制”,這將確定可以為每個對象計數的最大單元數(第 1 級除外)。在較低級別,每對象單元數規則會控制可以記錄的有關對象的信息量。
  • 最深單元規則
    最深單元規則通過只記錄已為對象分割的最底部單元來生成該對象的最近似對象。父單元不計入每對象單元數,這些單元不記錄在索引中。

這些分割規則依次逐步應用於每個網格級別。此部分的其餘內容更詳細地介紹了這些分割規則

 

 

覆蓋規則

如果一個對象完全蓋住了某個單元,則稱該單元由該對象所“覆蓋”。例如,在下圖中,一個第 2 級單元 15.11 完全由八邊形的中間部分所覆蓋。

xz2 空間索引_層次結構_03

被覆蓋的單元會參與計數並記錄在索引中,但不再進行分割。

每對象單元數規則

每個對象的分割程度主要取決於空間索引的“每對象單元數限制”。此限制確定了對於每個對象分割可以計數的最大單元數 。然而,請注意,每對象單元數規則不對第 1 級強制執行,因此可能超出此限制。如果第 1 級計數達到(或超出)每對象單元數限制,則在較低級別不再進行分割。

只要計數低於每對象單元數限制,分割過程就將繼續。從編號最低的接觸單元(例如上圖中的單元 15.6)開始,此過程將測試每個單元以評估是對其進行計數還是進行分割。如果分割某單元將超出每對象單元數限制,將對該單元進行計數而不進行分割。否 則,將對該單元進行分割,而對由對象接觸的較低級別的單元進行計數。分割過程將以這種方式在整個級別的廣度範圍內繼續進行。此過程對低級別網格的分割單元依次逐步進行重複,直至達到限制或不再有要計數的單元為止。

例如,上圖顯示了一個完全適合第 1 級網格的單元 15 的八邊形。在此圖中,單元 15 已進行分割,將八邊形分成了九個二級單元。此圖假定每對象單元數限制為 9 或更大。然而,如果每對象單元數限制為 8 或更小,則單元 15 將不進行分割,而只為該對象對單元 15 進行計數。

默認情況下,每對象單元數限制為每個對象 16 個單元,這將在大多數空間索引的空間和精度之間提供一個令人滿意的折中方案。然而,CREATE SPATIAL INDEX Transact-SQL 語句支持 CELLS_PER_OBJECT= n 子句,使用該子句可以指定介於 1 和 8192(包含這兩者)之間的每對象單元數限制。

 注意:

空間索引的 cells_per_object 設置顯示在 sys.spatial_index_tessellations 目錄視圖中。

最深單元規則

最深單元規則利用每個較低級別單元屬於其上級單元這一事實:第 4 級單元屬於第 3 級單元,第 3 級單元屬於第 2 級單元,第 2 級單元屬於第 1 級單元。例如,屬於單元 1.1.1.1 的對象也屬於單元 1.1.1、單元 1.1 以及單元 1。這種單元層次結構關係知識已內置於查詢處理器中。因此,只有最深級別的單元需要記錄在索引中,從而最大限度地減少了索引需要存儲的信息。

在下圖中,相對較小的菱形多邊形被分割。索引使用默認的每對象單元數限制 16,此對象較小,未達到該限制。因此,分割一直下至第 4 級。此多邊形駐留在以下的第 1 級到第 3 級的單元中:4、4.4 以及 4.4.10 和 4.4.14。然而,使用最深單元規則,分割將僅對十二個位於第 4 級的單元進行計數:4.4.10.13-15 以及 4.4.14.1-3、4.4.14.5-7 和 4.4.14.9-11。

xz2 空間索引_數據類型_04

xz2 空間索引_空間索引_05 分割方案

空間索引的行為部分取決於“分割方案”。分割方案特定於數據類型。在 SQL Server 2008 中,空間索引支持兩種分割方案:

· “幾何圖形網格分割”,這是適用於 geometry 數據類型的方案。

· 地理網格分割方案,該方案適用於數據類型為 geography 的列。

空間索引的 tessellation_scheme 設置顯示在 sys.spatial_index_tessellations 目錄視圖中。

幾何圖形網格分割方案

幾何圖形網格分割是適用於 geometry 數據類型的默認分割方案。在 SQL Server 2008 中,它是唯一的此類分割方案。本部分討論了與使用空間索引有關的幾何圖形網格分割的幾個方面:支持的方法和邊界框。

 注意:

您可以使用 CREATE SPATIAL INDEX Transact-SQL 語句的 USING GEOMETRY_GRID 子句顯式指定此分割方案。

支持的幾何圖形方法

空間索引旨在通過充當對象篩選器來減少將面向集合的方法應用於空間列的開銷 。geometry 數據類型提供了一些內置的方法,以構造用於描述幾何對象的 geometry 實例並使用這些實例。在某些條件下,空間索引支持多種面向集合的幾何圖形方法,如 STIntersects() 和 STTouches() 。

有關由空間索引提供的幾何圖形方法支持的詳細信息,請參閲空間索引支持的幾何圖形方法。

邊界框

幾何數據佔有的平面可以是無限的。然而,在 SQL Server 2008 中,空間索引需要有限空間。為了建立有限空間以用於分解,幾何圖形網格分割方案需要矩形“邊界框”。該邊界框由四個座標 ( x-min , y-min ) 和 ( x-max , y-max ) 定義,這些座標存儲為空間索引的屬性。這些座標所表示的意義如下:

· x-min 是邊界框左下角的 x 座標。

· y-min 是左下角的 y 座標。

· x-max 是右上角的 x 座標。

· y-max 是右上角的 y 座標。

 注意:

這些座標通過 CREATE SPATIAL INDEX Transact-SQL 語句的 BOUNDING_BOX 子句指定。

(x-min ,y-min ) 和 (x-max ,y-max ) 座標確定邊界框的位置和尺寸。邊界框的外部空間視作一個編號為 0 的單元。

空間索引將分解邊界框的內部空間。網格層次結構的第 1 級網格將填充邊界框。若要在網格層次結構中放置幾何對象,空間索引會將該對象的座標與邊界框的座標進行比較。

下圖顯示了由邊界框的 ( x-min , y-min ) 和 ( x-max , y-max ) 座標定義的點。網格層次結構的頂級顯示為 4x4 網格。出於演示的目的,這裏省略了較低級別。邊界框的外部空間用零 (0) 指示。請注意,對象“A”部分超出了邊界框,對象“B”完全位於邊界框外部,即單元 0 中。

xz2 空間索引_數據類型_06

邊界框與應用程序空間數據的某些部分相對應。索引的邊界框是完全包含存儲在空間列中的數據還是隻包含其中部分數據取決於應用程序。只有針對完全位於邊界框內部的對象的計算操作才會受益於空間索引。因此,若要獲得 geometry 列的空間索引所能提供的最大優勢,您需要指定一個包含所有或大多數對象的邊界框。

 注意:

空間索引的網格密度顯示在 sys.spatial_index_tessellations 目錄視圖的 bounding_box_xmin、bounding_box_ymin、bounding_box_xmax 和 bounding_box_ymax 列中。

地理網格分割方案

此分割方案僅適用於 geography 列。此部分總結了地理網格分割支持的方法,並討論瞭如何將測量空間投影到平面上,該平面隨後將分解成網格層次結構。

 注意:

您可以使用 CREATE SPATIAL INDEX Transact-SQL 語句的 USING GEOGRAPHY_GRID 子句顯式指定此分割方案。

支持的地理方法

geography 數據類型提供了一些內置的方法,用來構造和操作描述地理對象的 geography “實例”。在某些條件下,空間索引支持以下面向集合的地理方法:STIntersects() 、 STEquals() 和 STDistance() 。geography 數據類型列上的空間索引會篩選對象,並降低將這些方法應用於空間數據的性能和查詢開銷。

有關由空間索引提供的地理方法支持的詳細信息,請參閲空間索引支持的地域方法。

將測量空間投影到平面上

對 geography 實例(對象)的計算將包含對象的空間視作測量橢圓體。若要分解此空間,地理網格分割方案將橢圓體表面分為上半球和下半球,然後執行下列步驟:

1. 將每個半球投影在四邊形稜錐圖面上。

2. 將兩個稜錐圖平展開。

3. 聯接平展的稜錐圖以形成非歐幾里得平面。

下圖顯示了此三步分解過程的示意圖。在稜錐圖中,虛線表示每個稜錐圖的四個面的邊界。步驟 1 和 2 顯示測量橢圓體,使用一條綠色水平線表示赤道經線,使用一系列綠色垂直線表示若干條緯線。步驟 1 顯示要投影在兩個半球上的稜錐圖。步驟 2 顯示要平展的稜錐圖。步驟 3 顯示平展的稜錐圖,這些稜錐圖已組合起來形成一個平面,顯示出許多投影的經線。請注意,這些投影線伸直後長度不一,具體取決於它們落在稜錐圖上的位置。

xz2 空間索引_空間索引_07

空間投影到平面上之後,此平面將會分解成四級網格層次結構。不同級別可以使用不同的網格密度。下圖顯示了已分解成一個 4x4 的 1 級網格後的平面。出於演示目的,這裏省略了網格層次結構的較低級別。事實上,此平面完全分解成了一個四級網格層次結構。分解過程完成後,將逐行從 geography 列讀取地理數據,併為每個對象依次執行分割過程。

xz2 空間索引_數據類型_08

xz2 空間索引_空間索引_09 空間索引支持

可以僅對空間列創建空間索引。可以對支持空間索引的表的任何空間列創建空間索引,並可以對給定的空間列創建多個空間索引。有關對空間索引的限制的詳細信息,請參閲對空間索引的限制。

 

建立一個空間索引

右鍵單擊“索引” ,再選擇“新建索引” 。

xz2 空間索引_層次結構_10

“索引名稱” 字段中,輸入索引的名稱。

“索引類型” 下拉列表中,選擇“空間” 。

xz2 空間索引_數據類型_11

點擊“添加”按鈕,選擇空間字段

 

xz2 空間索引_數據類型_12

當對 geometry 類型列創建索引時,必須指定邊界框的 ( X-min , Y-min ) 和 ( X-max , Y-max ) 座標。對於 geography 類型列的索引,當您指定“地理網格” 分割方案後,邊界框字段變為只讀狀態,因為地理網格分割不使用邊界框。

您還可以指定任意級別的分割方案的“每個對象的單元格數” 字段和網格密度的非默認值。每個對象的單元格數的默認數字為 16,默認的網格密度為“中” 。

xz2 空間索引_層次結構_13

   

“邊界框”為幾何平面的頂級網格的周界。邊界框參數僅存在於幾何圖形網格分割中。如果“分割方案” 為“地理網格” ,這些參數呈灰色。

面板將顯示邊界框的 X-min  Y-min  和 X-max  Y-max  座標。沒有任何默認座標值。因此,在對 geometry 類型列創建新的空間索引時,必須指定座標值。

X 最小值

邊界框左下角的 X 座標。

Y 最小值

邊界框左下角的 Y 座標。

X 最大值

邊界框右上角的 X 座標。

Y 最大值

邊界框右上角的 Y 座標。

 

“分割方案”

指示索引的分割方案。支持的分割方案包括:

“幾何圖形網格”

指定“幾何圖形網格”分割方案,它適用於 geometry 數據類型的列。

“地理網格”

指定“地理網格”分割方案,它適用於 geography 數據類型的列。

每個對象的單元格數

指示可用於索引中單個空間對象的每個對象的分割單元格數。該數字可以是 1 和 8192 之間(含 1 和 8192)的任何整數。默認值為 16。

在頂層,如果對象包含的單元格多於 n 指定的單元格,則索引操作將根據需要使用盡可能多的單元格來提供完整的頂級分割。在這種情況下,對象收到的單元格數可能會大於指定的單元格數。這種情況下,最大數量即為頂級網格創建的單元格數,這取決於“級別 1” 的密度。

網格

此面板顯示分割方案的每個級別上網格的密度。密度可指定為“低” 、“中” 或“高” 三個級別。默認值為“中” 。“低” 表示 4x4 網格(16 個單元格)、“中” 表示 8x8 網格(64 個單元格)而“高” 表示 16x16 網格(256 個單元格)。

級別 1

第一級(頂級)網格的密度。

級別 2

第二級網格的密度。

級別 3

第三級網格的密度。

級別 4

第四級網格的密度。

 

結果如下圖:

 

xz2 空間索引_xz2 空間索引_14