簡體   English   中英

XQuery性能

[英]XQuery performance

我使用手寫筆工作室(帶有DATA DIRECT)/ xQuery將兩個xmls文件合並為一個(文件先從CSV轉換為xml,然后再合並)。 首先讀取客戶(標頭)數據,然后為每個客戶讀取匹配的交易數據。 (使用循環)交易數據也按交易日期(年)分組。 這是通過使用不同的功能來完成的。 交易數據文件很大,處理起來很慢。 我正在尋找提高性能的方法。 任何幫助。 的建議很感激。 下面是使用的代碼。 謝謝。

(:options:)
declare option ddtek:xml-streaming "yes";
declare option ddtek:serialize "encoding=UTF-8, 
               omit-xml-declaration=no, indent=yes";

(:external variables:)
declare variable $esa-h-converter as xs:string external;
declare variable $esa-t-converter as xs:string external;
declare variable $input-h-data-path as xs:string external;
declare variable $input-t-data-path as xs:string external;


(:main:)
<ROOT_NODE>
  {
    let $heads := doc(fn:concat(
                        "converter:", 
                        $esa-h-converter, 
                        "?file:///", 
                        $input-h-data-path))
                  /DATA_ROOT/CUSTOMER 

    for $record at $primaryKey in $heads

    return
      <TEMPLATE>
        <CUSTOMER>
          <RECORD_COUNT>{ $primaryKey }</RECORD_COUNT>
          <HD_REGION>{ $record/HD_REGION/text() }</HD_REGION>
          <HD_CONT>{ $record/HD_CONT/text() }</HD_CONT>
          <HD_FRDATE>{ $record/HD_FRDATE/text() }</HD_FRDATE>
          <HD_TODATE>{ $record/HD_TODATE/text() }</HD_TODATE>
          <HD_CUSNAME>{ $record/HD_CUSNAME/text() }</HD_CUSNAME>
          <HD_ADDR1>{ $record/HD_ADDR1/text() }</HD_ADDR1>
          <HD_ADDR2>{ $record/HD_ADDR2/text() }</HD_ADDR2>
          <HD_ADDR3>{ $record/HD_ADDR3/text() }</HD_ADDR3>
          <HD_ADDR4>{ $record/HD_ADDR4/text() }</HD_ADDR4>
          <HD_STATE>{ $record/HD_STATE/text() }</HD_STATE>
          <HD_SUBTOWN>{ $record/HD_SUBTOWN/text() }</HD_SUBTOWN>
          <HD_PCODE>{ $record/HD_PCODE/text() }</HD_PCODE>
          {

            let $my-transactions := 
                doc(fn:concat("converter:", 
                              $esa-t-converter, 
                              "?file:///", 
                              $input-t-data-path)) 
                              /DATA_ROOT
                              /TRANSACTION
                             [TR_CONT eq $record/HD_CONT 
                              and TR_REGION eq $record/HD_REGION]
            let $years := fn:distinct-values(
                           $my-transactions
                           /fn:substring(TR_DATE/text(), 1, 4))
            for $period in $years
            return
              <PERIOD>
                <RECORD_COUNT>{ $primaryKey }</RECORD_COUNT>
                <YEAR>{ $period }</YEAR>
                {
                  $my-transactions 
                  [fn:substring(TR_DATE/text(), 1, 4) = $period]
                }              
              </PERIOD>
          }
        </CUSTOMER>
      </TEMPLATE>
  }
</ROOT_NODE> 

性能通常在很大程度上取決於單個產品和特定數據,因此,在獲得建議之前,請先花點力氣,並在相信之前自己進行測試。 我希望比我更熟悉Data Direct處理器的人能夠解決您的問題。 但話雖如此,我想到了幾件值得嘗試的事情:

  • 您可以先嘗試按客戶對交易文件進行排序,然后再執行合並。 如果事務文件很長,排序將不會很快。

  • 您可以(根據客戶組織的交易文件)訪問交易文件中的每個客戶並執行合並,而不是訪問主文件中的每個記錄並為其查找交易。

  • 您內部的FLWOR表達式在整個事務文件中進行了兩項選擇,涉及到查看fn:substring(TR_DATE/text(), 1, 4) -這似乎很可能使幾乎所有XQuery引擎的優化器失敗。 如果引擎已建立日期索引,則查看子字符串可確保查詢處理器無法對值進行簡單的索引查找,但必須掃描索引中的所有值(或文檔中可能的所有值) )進行匹配。

    既然您說您正在為兩個文件創建XML,所以我想您可以提取年份子字符串並將其(冗余地)放在單獨的元素或屬性中。 原則上,這將使XQuery引擎可以建立索引並使用索引查找而不是掃描來執行選擇的那部分。 (我不知道這是否對您的特定處理器有所幫助。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM