Marklogic TDE视图如何在两个视图之间执行连接
我已经创建了两个简单的TDE模板,其中包含一个join列。我可以使用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
select效果很好。
我的问题是在引擎盖下面发生了什么。它执行的是等同于HashJoin的扫描还是全表扫描?如果文档数量上升到数百万和数十亿,意味着什么?
发布于 2019-06-17 16:11:38
您可以使用xdmp:sql-plan更好地理解查询是如何执行的。
在我的机器上与您的查询类似的查询显示使用了bloom-join。根据您的查询,这可能会在您的计算机上有所不同。但是您应该能够找出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>https://stackoverflow.com/questions/56622968
复制相似问题