1

В SQL Server я создаю представление, которое ссылается на несколько таблиц, которые должно иметь одинаковые подсчеты строк и первичные ключи, хотя разные данные столбцов между ними (отсюда и необходимость собрать их все вместе для этого конкретного вида). Я не всегда уверен, что они это делают.Разница между внутренним соединением и левым соединением, если таблицы имеют совпадающие строки строк и первичные ключи

Я знаю, что единственный способ убедиться, что у меня есть количество строк, в которых я нуждаюсь, - использовать левые соединения (или внешние соединения), но я не уверен, есть ли значительная производительность при этом, и если да, то как это сделать.

К сожалению, изменение таблиц - это то, что я не могу сделать, потому что приложение полагается на их структуру, как они есть, поэтому я использую Views, чтобы вытащить данные вместе, и мне нужно, чтобы я делал это наиболее эффективный способ.

+0

Я удалил свой ответ, так как его главный пункт был плохим. Сожалею. –

+0

Поскольку вы говорите, что они должны «иметь одинаковые подсчеты строк и первичные ключи; вы не можете «принудить» это, добавив отношения внешнего ключа из одной таблицы в другую? Таким образом, вы ЗНАЕТЕ (и, следовательно, Оптимизатор запросов тоже!), Что для каждой записи в одной таблице также будет соответствующая запись в другой таблице. Таким образом, вам не нужно добавлять «встроенные механизмы безопасности» в свой код для обработки/грязных данных /. И я предполагаю, что если оптимизатор найдет OUTER-запрос отношения, в котором есть FK, он будет использовать алгоритм, наиболее подходящий из инструментария OUTER & INNER JOIN, как ему заблагорассудится. – deroby

+0

Это, безусловно, будет хорошим способом справиться с этим, но, к сожалению, это потребует перепрограммирования приложения (с которым я не связан) для обработки исключений из ограничения или обеспечения того, чтобы такое возникновение не произошло в первую очередь , –

ответ

1

Да, существует разница в производительности между внутренним и внешним соединениями. Это разные операции, поэтому они имеют разные базовые алгоритмы. Ответы на этот вопрос в значительной степени объясняют this.

Имеет ли значение разница в производительности другой вопрос. С данными, которые всегда соответствуют (так что результаты одинаковы), я ожидаю, что производительность левого внешнего соединения будет очень похожа на внутреннее соединение, особенно если структуры данных оптимизированы для запроса. Однако мои ожидания не являются гарантией. Если вам это действительно интересно, вы должны проверить две разные версии вашего запроса на свои данные в своей среде.

Результаты такого испытания не дают гарантии результаты во всех случаях. Они делают все, чтобы принять обоснованное решение о стоимости использования left join, а не inner join.

+0

Спасибо за это. Кажется, что производительность похожа на более мелкие запросы, которые я собрал, и в плане запроса предполагается, что Merge Join используется, использую ли я внутреннее соединение или внешнее соединение. Думаю, как вы говорите, мне просто нужно проверить разницу в гигантском запросе, который мне нужен для этого конкретного вида. –

+0

@IanJoyce. , , В «левом соединении» план запроса собирается (имеет тенденцию) сканировать первую таблицу. Если план запроса для 'inner join' делает то же самое, то производительность должна быть одинаковой. –

+0

Спасибо за ваш ответ Гордон! –

Смежные вопросы