简体   繁体   English

Marklogic TDE 查看和加入

[英]Marklogic TDE views and join

How do Marklogic TDE view perform joins between two views Marklogic TDE 视图如何执行两个视图之间的连接

I have created two simple TDE Templates with one join column.我创建了两个带有一个连接列的简单 TDE 模板。 I can perform a select query with join and it works fine.我可以使用 join 执行select查询,它工作正常。 My question is what kind of join is actually being done in the MarkLogic database?我的问题是 MarkLogic 数据库中实际进行了什么样的连接? Is it doing full document scans that will become bottleneck once volume of data grows?一旦数据量增加,是否进行全文档扫描会成为瓶颈?

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)
)  

Then然后

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

The select works great.选择效果很好。

My question is what's happening under the hoods.我的问题是幕后发生了什么。 Is it doing equivalent of a HashJoin or full table scan?它是否相当于 HashJoin 或全表扫描? What are implications if number of documents go up to millions and billions?如果文档数量达到数百万和数十亿,会有什么影响?

You can use xdmp:sql-plan to better understand how your query gets executed.您可以使用xdmp:sql-plan来更好地了解您的查询是如何执行的。

A similar query to yours on my machine reveals that a bloom-join is used.在我的机器上与您类似的查询显示使用了bloom-join This might differ on your machine depending on your query.根据您的查询,这在您的机器上可能会有所不同。 But you should be able to find out what is going on having the sql plan.但是您应该能够找出 sql 计划发生了什么。

<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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM