Index
DB2 XML 索引和“ORDER BY”子句
我的表如下所示:
CREATE TABLE "Content" ( "id" VARCHAR(36) NOT NULL, "xml" XML );
我定義了一個索引
create index "idx_creation_date" on "Content"("xml") generate keys using xmlpattern '/*/dateCreated' as sql timestamp;
該索引在比較中使用時工作正常(XMLEXISTS),但現在我想使用該索引根據創建內容的日期對錶進行排序並選擇前 20 個項目。
可悲的是,這沒有用
SELECT "Content".* FROM "Content" ORDER BY XMLCAST(XMLQUERY('$xml/*/dateCreated' PASSING "xml" as "xml") as TIMESTAMP) DESC FETCH FIRST 20 ROWS ONLY
因為 XMLQUERY 不使用索引。這同樣適用於
xquery let $items := for $i in db2-fn:xmlcolumn("Content.xml") order by $i/*/dateCreated return $i for $i at $count in subsequence($items, 1, 20) return $i
因為 let 和 return 不能使用索引。
任何人都知道如何在 ORDER BY 查詢中使用 dateCreated 上的現有(和工作)索引?
基於 XML 數據的索引(又名“XML 索引”)在幾個方面與關係索引不同。它們用於辨識文件和索引模式中節點的位置。單個 XML 文件中的多個節點可能與該模式匹配。對於關係索引,每行都被索引,對於 XML 索引,每個文件可能有零個、一個或多個匹配項(儲存為關係行的一部分)。可以在關於 Indexing XML Data 的 DB2 文件中找到更多資訊。
根據 SQL 標準,XML 數據類型是一種黑盒。它不允許比較和排序。您要做的是按特定節點對 XML 片段進行排序。該片段已經從儲存的 XML 值/文件中派生出來。在處理時,XML 索引和片段之間可能沒有連接。Matthias Nicola 撰寫了有關 XML 索引及其用法的一個很好的參考資料。
有了這些背景資訊,我們現在可以專注於您的具體問題。DB2 如何知道每行和相關的“內容”都存在時間戳/日期值?排序應該如何組織?由於上面列出的索引條目/文件/行關係,SQL 語句中的排序將不起作用。
對於您的 XQuery,我假設數據是無類型的,不使用模式。DB2 如何知道 dateCreated 是時間戳以及應該使用索引?您是否嘗試過圍繞 dateCreated 進行強制轉換以讓 DB2 知道需要時間戳數據?
順便說一句:您可以為同一模式指定多個 XML 索引,但具有不同的數據類型。