【问题标题】:Marklogic TDE views and joinMarklogic TDE 查看和加入
【发布时间】:2019-06-16 22:08:57
【问题描述】:

Marklogic TDE 视图如何在两个视图之间执行连接

我创建了两个带有一个连接列的简单 TDE 模板。我可以使用 join 执行select 查询,它工作正常。我的问题是在 MarkLogic 数据库中实际执行了什么样的连接?一旦数据量增加,它是否会进行全文档扫描,这将成为瓶颈?

xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde"  at "/MarkLogic/tde.xqy";

let $emp1 := <employee><id>100</id><name>john</name><dept>10</dept></employee>
let $emp2 := <employee><id>200</id><name>mary</name><dept>10</dept></employee>
let $dept1 := <dept><id>10</id><name>accounting</name></dept>
let $dept2 := <dept><id>20</id><name>hr</name></dept>
let $emp-table := <template xmlns="http://marklogic.com/xdmp/tde">
  <context>/employee</context>
  <rows>
    <row>
      <schema-name>models</schema-name>
      <view-name>employees</view-name>
      <columns>
        <column>
          <name>id</name>
          <scalar-type>string</scalar-type>
          <val>id</val>
        </column>
        <column>
          <name>name</name>
          <scalar-type>string</scalar-type>
          <val>name</val>
        </column>
        <column>
          <name>dept</name>
          <scalar-type>string</scalar-type>
          <val>dept</val>
        </column>
      </columns>
    </row>
  </rows>
</template>      
let $dept-table := <template xmlns="http://marklogic.com/xdmp/tde">
  <context>/dept</context>
  <rows>
    <row>
      <schema-name>models</schema-name>
      <view-name>depts</view-name>
      <columns>
        <column>
          <name>id</name>
          <scalar-type>string</scalar-type>
          <val>id</val>
        </column>
        <column>
          <name>name</name>
          <scalar-type>string</scalar-type>
          <val>name</val>
        </column>
      </columns>
    </row>
  </rows>
</template>              
return (
  xdmp:document-insert('/employees/100.xml', $emp1),
  xdmp:document-insert('/employees/200.xml', $emp2),
  xdmp:document-insert('/depts/10.xml', $dept1),
  xdmp:document-insert('/depts/20.xml', $dept2),
  tde:template-insert('/templates/emp.xml', $emp-table),
  tde:template-insert('/templates/dept.xml', $dept-table)
)  

然后

select employees.name, depts.name from employees, depts where employees.dept = depts.id

选择效果很好。

我的问题是幕后发生了什么。它是否相当于 HashJoin 或全表扫描?如果文档数量达到数百万和数十亿,会有什么影响?

【问题讨论】:

    标签: sql marklogic marklogic-9


    【解决方案1】:

    您可以使用xdmp:sql-plan 更好地了解您的查询是如何执行的。

    在我的机器上与您的类似查询显示使用了bloom-join。根据您的查询,这在您的机器上可能会有所不同。但是你应该能够找出 sql plan 发生了什么。

    <plan:plan xmlns:plan="http://marklogic.com/plan">
      <plan:select>
        <plan:project order="">
          <plan:vars>...</plan:vars>
          <plan:expr>
            <plan:join join-type="bloom-join" order="40[NULLS_IRRELEVANT]">
              <plan:join-info>
                <plan:hash left="4" right="1" operator="="></plan:hash>
                <plan:filters>...</plan:filters>
              </plan:join-info>
              <plan:elems>...</plan:elems>
              <plan:filters>..</plan:filters>
            </plan:join>
          </plan:expr>
        </plan:project>
      </plan:select>
    </plan:plan>
    

    【讨论】:

    • 这个明智答案的一个脚注:连接、词典和三重访问器总是读取索引,从不扫描文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多