稀疏索引範例

本主題顯示稀疏索引比對演算法如何運作的範例。

在範例 S1中,查詢選擇是稀疏索引選擇的子集,因此會使用稀疏索引上的索引掃描。 其餘查詢選項 (COL3=30) 會在索引掃描之後執行。

範例 S1
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 and COL2=20
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 and COL2=20 and COL3=30

在範例 S2中,查詢選擇不是稀疏索引選擇的子集,因此無法使用稀疏索引。

範例 S2
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 and COL2=20 and COL3=30
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 and COL2=20

在範例 S3中,查詢選擇完全符合稀疏索引選擇,並且可以使用稀疏索引上的索引掃描。

範例 S3
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 and COL2=20 and COL3=30
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 and COL2=20 and COL3=30

在範例 S4中,查詢選擇是稀疏索引選擇的子集,可以使用稀疏索引上的索引掃描。 其餘查詢選項 (COL3=30) 會在索引掃描之後執行。

範例 S4
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 and COL2=20
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 and COL2=20 and COL3=30

在範例 S5中,查詢選擇不是稀疏索引選擇的子集,因此無法使用稀疏索引。

範例 S5
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 and COL2=20 and COL3=30
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 and COL2=20

在範例 S6中,查詢選擇完全符合稀疏索引選擇,並且可以使用稀疏索引上的索引掃描。 在索引掃描之後執行查詢選擇,以從稀疏索引中刪除多餘記錄。

範例 S6
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 or COL2=20 or COL3=30
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 or COL2=20 or COL3=30

在範例 S7中,查詢選擇是稀疏索引選擇的子集,可以使用稀疏索引上的索引掃描。 在索引掃描之後執行查詢選擇,以從稀疏索引中刪除多餘記錄。

範例 S7
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 or COL2=20 or COL3=30
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 or COL2=20 

在範例 S8中,查詢選擇不是稀疏索引選擇的子集,因此無法使用稀疏索引。

範例 S8
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 or COL2=20
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 or COL2=20 or COL3=30

在下一個範例 S9中,常數 'MN' 已取代為查詢選擇的參數標記。 稀疏索引在建立時套用了 COL1='MN' 的本端選項。 稀疏索引比對演算法會將參數記號與查詢述詞 COL1 =? 中的常數 'MN' 進行比對。 它會驗證參數記號的值是否與稀疏索引中的常數相同; 因此可以使用稀疏索引。

範例 S9
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1='MN' or COL2='TWINS'
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
Where Col3='WIN' and (Col1=? or Col2='TWINS')

在下一個範例 S10中,稀疏索引的索引鍵符合查詢中的排序方式欄位。 為了使稀疏索引滿足指定的排序,最佳化工具必須驗證查詢選擇是稀疏索引選擇的子集。 在此範例中,可以使用稀疏索引。

範例 S10
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL1, COL3)
WHERE  COL1='MN' or COL2='TWINS'
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
Where Col3='WIN' and (Col1='MN' or Col2='TWINS')
ORDER  BY COL1, COL3

在下一個範例 S11中,稀疏索引的索引鍵不符合查詢中的排序方式欄位。 但稀疏索引 T2 中的選擇是查詢選擇的超集。 視大小而定,最佳化工具可能會選擇索引掃描而不是稀疏索引 T2 ,然後使用排序來滿足指定的排序。

範例 S11
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL2, COL4)
WHERE  COL1='MN' or COL2='TWINS'
SELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
Where Col3='WIN' and (Col1='MN' or Col2='TWINS')
ORDER  BY COL1, COL3

下一個範例 S12 代表典型最佳化工具決策: 是最好使用索引 IX1 來執行索引探測,還是最好使用稀疏索引 SPR1來執行索引掃描? 這兩個索引會擷取相同的索引項目數,且從該點開始具有相同的成本。 例如,根據擷取的項目/索引鍵,這兩個索引從資料空間中擷取所選取記錄的成本相同。

擷取索引項目的成本是決定準則。 一般而言,如果索引 IX1 較大,則透過稀疏索引 SPR1 進行索引掃描會降低擷取索引項目的成本。 如果索引 IX1 相當小,則針對索引 IX1 的索引探測會降低擷取索引項目的成本。 另一個成本決策是重複使用性。 使用稀疏索引 SPR1 的計劃無法像使用索引 IX1 的計劃一樣可重複使用,因為稀疏選擇內建靜態選擇。

範例 S12
CREATE INDEX MYLIB/IX1 on MYLIB/T1 (COL1, COL2, COL3)
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE  COL1=10 and COL2=20 and COL3=30
CSELECT COL1, COL2, COL3, COL4
FROM   MYLIB/T1
WHERE  COL1=10 and COL2=20 and COL3=30