我有一個表布拉赫(緯度浮子,浮子經度,CREATE_TIME日期,owner_id INT,.....)用於範圍查詢條件的Oracle綜合指數
和我的代碼執行僅一個單一的查詢
select *
from Blah
where latitude < l1 and latitude > l2
and longitude < ll1 and longitude > ll2
and create_time < t1 and create_time > t2
and owner_id < o1 and owner_id > o2 ;
(當然值L1,L2,... O1,O2是從程序來動態PARAMS)
我的問題是應該建立什麼樣的指標;綜合指數? 如果是複合索引,我應該先放哪一列? 這個指數有多有效?
我想了很久,並且找不到關於oracle索引如何工作的詳細文檔。
我可以找到它使用B-樹實現的文檔,在我們的例子中:B-樹中的每個鍵都是一個4元組(column1,column2,column3,column4),其中這些元組的排序關係是定義爲詞彙順序。
然後上面的查詢,假設我們的訂單(owner_id,CREATE_TIME,經度,緯度),我想 甲骨文將首先需要二進制搜索的點(01,T1,L1,LL1),此操作,該指數確實有用。但是接下來,我們需要找到這個第一個插入點的終點:我們需要找到(o1,t1,l1,ll2),這也可以通過二分搜索來完成。
接下來,我們需要找到滿足條件的下一節,所以我們需要 find(o1,t1,lx,ll1)其中lx是大於l1的下一個值,我們可以通過二分查找太。 但在我們的情況下,很可能在同一緯度上,經度不能超過1,因此這裏的二分查找並不比線性掃描更有效。
遵循這種精神,似乎我們應該首先將一個小範圍的基數列, 在這種情況下,create_time,如果我們的點是在幾天內創建的。 也如果我們從來沒有做範圍條件,但只有等於(=)的條件,那麼哪個列是第一個,沒關係?
,以使其更清晰,這裏是一個簡單的例子:
讓我們說我有2列,X和Y
在db,爲雙方的值[1,2,... .100],所以我們有100×100行
我的查詢是
select * from mytable where X > 34 and X < 78 and Y > 12 and Y < 15;
說我們的指數是(X,Y),所以2個值之間的比較規則是
v1 < v2 <=====> v1.x < v2.x || v1.x == v2.x && v1.y < v2.y
給出了上述排序規則,我們可以看到,在該指數的值是 安排在串行像(值X,Y):
1,1, 1,2 1,3 .... 1,100
2,1 2,2 2,3 ......2,100
.....
100,1 100,2 ....... 100,100
現在
,搜索中的值查詢B樹遍歷需要 定位(78-34-1)間隔,因此(78-34-1)* 2查找(1爲開頭 一個爲結束位置),而不僅僅是2查找。
所以,如果我們有更高的維度,間隔計數成倍增加 與維數,所以索引可能沒有用處了------ 這是我所關注
非常感謝 陽
謝謝,但現在我只關心B樹索引的問題;儘管在實踐中Oracle可能會使用位圖索引,正如您所指出的那樣 –