Index

DB2 XML 索引和“ORDER BY”子句

  • October 14, 2016

我的表如下所示:

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 索引,但具有不同的數據類型。

引用自:https://dba.stackexchange.com/questions/151591