Могут ли объединения эффективно игнорировать полевые индексы, если они являются константой? - PullRequest
0 голосов
/ 14 февраля 2020

Гораздо проще объяснить это на примере.

В таблице A включен PK (сохранить, строка).
В таблице B включен PK (id, store, line).
[id] - это int, [store] - это nvarchar (100), а [line] - int в обоих случаях.

Если я запущу:

select * 
from A inner join B 
on A.store=B.store and A.line=B.line
where B.id=0

будет двигатель сможет быстро (я думаю, слияние) присоединиться? Или будет полезно добавить фиктивный столбец id со значением 0 в A?

1 Ответ

2 голосов
/ 14 февраля 2020

Ваше утверждение будет работать, но если вы сделаете это так, оптимизатор будет более эффективным:

select * 
from A inner
join B on A.store=B.store and A.line=B.line and B.id=0

Здесь можно исключить элементы, в которых b.id не равен нулю, прежде чем выполнить слияние. , В зависимости от топологии размера таблицы et c это может быть весьма значительным.

Например, рассмотрим случай, когда у вас есть 50 миллионов строк, совместно используемых на 5 узлах таблицы b и 1 узле для таблицы a - в вашем коде все Записи должны быть перемещены на узел с таблицей, в то время как с кодом выше должны быть перемещены только записи с идентификатором = 0.

Это может быть очень не интуитивно понятно, когда a является маленьким таблица (которая часто только на одном узле.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...