Marklogic TDE просмотров и присоединиться - PullRequest
1 голос
/ 17 июня 2019

Как представление Marklogic TDE выполняет соединения между двумя представлениями

Я создал два простых шаблона TDE с одним столбцом объединения.Я могу выполнить 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 или полное сканирование таблицы?Каковы будут последствия, если количество документов увеличится до миллионов и миллиардов?

1 Ответ

1 голос
/ 17 июня 2019

Вы можете использовать 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>
...