SQL Server 2008 空間資料庫 --- 空間索引概念及建立(取自幫助)

weixin_34304013發表於2009-05-27

SQL Server 2008 引入了對空間資料和空間索引的支援。“空間索引”是一種擴充套件索引,允許您對空間列編制索引。空間列是包含空間資料型別(如 geometrygeography)資料的表列。本節中的主題介紹了空間索引。

 

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 個第四級單元。

 

untitled

針對空間索引進行的空間分解與應用程式資料使用的度量單位無關。

 

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

untitle22d

 

沿網格軸的單元數目確定了網格的“密度”:單元數目越大,網格的密度越大。例如,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 完全由八邊形的中間部分所覆蓋。

clip_image001

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

每物件單元數規則

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

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

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

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

clip_image002注意:

空間索引的 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。

WinFS Art Template2

clip_image004分割方案

空間索引的行為部分取決於“分割方案”。分割方案特定於資料型別。在 SQL Server 2008 中,空間索引支援兩種分割方案:

· “幾何圖形網格分割”,這是適用於 geometry 資料型別的方案。

· 地理網格分割方案,該方案適用於資料型別為 geography 的列。

clip_image002[1]注意:

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

幾何圖形網格分割方案

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

clip_image002[2]注意:

您可以使用 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 座標。

clip_image002[3]注意:

這些座標通過 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 中。

clip_image005

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

clip_image002[4]注意:

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

地理網格分割方案

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

clip_image002[5]注意:

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

支援的地理方法

geography 資料型別提供了一些內建的方法,用來構造和操作描述地理物件的 geography“例項”。在某些條件下,空間索引支援以下面向集合的地理方法:STIntersects() STEquals()STDistance()geography 資料型別列上的空間索引會篩選物件,並降低將這些方法應用於空間資料的效能和查詢開銷。

有關由空間索引提供的地理方法支援的詳細資訊,請參閱空間索引支援的地域方法。

將測量空間投影到平面上

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

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

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

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

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

clip_image006

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

clip_image007

clip_image004[1]空間索引支援

可以僅對空間列建立空間索引。可以對支援空間索引的表的任何空間列建立空間索引,並可以對給定的空間列建立多個空間索引。有關對空間索引的限制的詳細資訊,請參閱對空間索引的限制。

 

建立一個空間索引

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

2009-05-26_161115

“索引名稱”欄位中,輸入索引的名稱。

“索引型別”下拉選單中,選擇“空間”

2009-05-26_161343

點選“新增”按鈕,選擇空間欄位

 2009-05-26_161409

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

您還可以指定任意級別的分割方案的“每個物件的單元格數”欄位和網格密度的非預設值。每個物件的單元格數的預設數字為 16,預設的網格密度為“中”

2009-05-26_162137  

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

皮膚將顯示邊界框的X-minY-minX-maxY-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

第四級網格的密度。

 

結果如下圖:

 

2009-05-26_180039

相關文章