порядок выражения или предикатов делают ли какое-либо различие в состоянии присоединиться к внешним соединениям в стандарте SQL?

голоса
2

Так что у меня немного расстраивает день. Я был уволен из контракта я работал в последние несколько недель, потому что я не сделал «сетки с командой.» были приведены два примера:

1) Вчера меня попросили удалить все данные из базы данных SQL Server для некоторых базовых данных системы , за исключением. Проситель (не мой босс) был около восьми сценариев она использовала для решения этой задачи несколько месяцев назад. По- видимому , никто никогда не думал , чтобы скрипт из модели данных или данных системы.

Этот человек был создан образец чрезмерно усложнять вещи, так что я пытался понять причины для выполнения этой задачи и конечной цели. Я также пытался понять, почему она всегда есть все виды неясных ошибок, которые требуют всех этих дополнительных сценариев для «удалить и заново добавить ограничения».

Я был готов сделать что-нибудь нужно, и мы говорили в течение нескольких минут об этом. По понятным причинам я думал, что пытаясь понять, почему была хорошая вещь. Внезапно она решила, что это будет просто быстрее сделать это самим, а не тратить время на объяснения мне все это, и я вернулся к себе другой работе, не думая об этом.

Так или иначе это было интерпретировано отрицательно.

2) Несколько недель назад во время моей первой недели меня попросили работать на слияние некоторых данных из другой системы. Я получил сценарий 600+ строк фрагментов SQL , что все , казалось важными наряду с устной тирадой жалоб недостоверных данных и оригинальными программистами. Естественно , потребовалось немного времени , чтобы пробраться через близко , но через несколько дней мой окончательный результат возник как простой Объединить примерно 25 строк.

Я пишу SQL более десяти лет, и я считаю себя, чтобы иметь некоторый опыт в этой области. Мои сотрудники получали немного нетерпеливы, как я отслаиваю слои ненужной сложности, и я остался поздний, чтобы закончить задачу, как обещал.

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

На следующее утро я сказал (такой же человек, как # 1), что все это было неправильно, но это материал, который я не мог ожидать, чтобы узнать, как новый парень. Она объяснила, что она должна была сдерживать себя от переписывания все. Один из ее пунктов было чем-то второстепенным о данных, которые я уже намерен просить ее о себе. Другой был чисто SQL.

(Вопрос начинается здесь.)

Возьмем типичный левое внешнее соединение сценария. Мы все знаем , что порядок таблиц весьма значителен, например, Q1 и Q2 не эквивалентны:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON A.id = B.id -- (Q1)
SELECT A.x, B.y FROM B LEFT OUTER JOIN A ON B.id = A.id -- (Q2)

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

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)

Поэтому я считаю , что меня обучал о том , как порядок вопросов таблиц в внешнее соединение. Я думал , что это испытание моего интеллекта уже сделано во время собеседования. Моя путаница превратилась в ступор , когда я понял , что она была сосредоточена только на сравнении равенства. К ее Q3 был неправ , и Q1 был вариант мне нужно вместо этого.

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

Я полагаю, что не сразу проглотить свою гордость показала, что я не был «Coachable.»


Что же касается только стиля, я соответствовать любому стандарту работодатель отдает предпочтение, хотя их SQL часто неаккуратно другими способами. Я признать, что со старым стилем синтаксис внешнего соединения это было неважно. Кроме того, я никогда не слышал, чтобы кто делает этот случай. Пожалуйста, ответьте на этот вопрос и искупить свою репутацию.

порядок выражения или предикатов делают ли какое-либо различие в состоянии присоединиться к внешним соединениям в стандарте SQL?

Задан 07/07/2012 в 01:54
пользователем
На других языках...                            


4 ответов

голоса
2

Порядок сравнения равенства не имеет никакого значения для результатов объединения. Но это могло бы для непостижимых причины влияют на эффективность, с которой результат вычисляется. SQL оптимизаторы пресловутая за то, что зависит от, казалось бы, незначительными деталями, как это.

Ответил 07/07/2012 в 02:04
источник пользователем

голоса
4

Нет, это не имеет никакого значения.

Лично я предпочитаю стиль , который вы показываете в Q3, некоторые из моих напарников предпочитают стиль в Q1. Я не знаю никого , кто бы мог рассмотреть любого из них , чтобы быть неправильными .

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

Я проверил (в SQL Server 2005), план выполнения двух запросов с предикатных операндов в другом порядке, и, как ожидается, они идентичны.

Ответил 07/07/2012 в 02:21
источник пользователем

голоса
2

Я предпочитаю Q3 слишком РЕГИСТРИРУЙТЕСЬ свое состояние заказ:

... ON B.id = A.id -- (Q3)

Как непосредственно отражает, что B.id является более варьируя один, вы можете думать о A.id как постоянное существо испытанного против, например,

B.id = 1984

В том же ключе, что я не хочу видеть это в коде ...

1984 = B.id

..., как ты, я не хочу видеть это в запросе:

A.id = B.id

Однако, как и большинство вещей в жизни, есть люди, которые любят прямой порядок байт, и есть те, кто любит тупоконечник. Независимо ментальная модель может служить их предпочтениям, которую они выбрали, они должны быть по крайней мере в состоянии объяснить вам обоснование, почему они хотелиA.id = B.id

Я думаю, я должен переключить предпочтение, хотя, мой (и ваши) предпочитает порядок условие не работает в некоторых ОРМ, Linq в частности. Я до сих пор понять, почему они навязывают, что условие должно быть в порядке Q1 в:

from x in A
join y in B on x.id equals y.id

И реверсирование условия (такой же, как Q3, хотя в SQL запросе это не ошибка) приводит порядка к синтаксической ошибке, это не будет принято Linq:

from x in A
join y in B on y.id equals x.id

Теперь я должен найти объяснение, почему Microsoft Linq конструкторы предпочтительного приказание условия Q1 в. И попытаться оценить его, если это имеет смысл, и просто принять даже это (пока) не имеет смысла.


Что касается:

порядок выражения или предикатов делают ли какое-либо различие в состоянии присоединиться к внешним соединениям в стандарте SQL?

Результаты мудрый, NO . С точки зрения производительности, я до сих пор увидеть запрос , где присоединиться закажем условие делает запрос быстрее. Даже в форумах я не видел , чтобы кто одобряет реверсирования условия , чтобы сделать запрос быстрее.

Если они не могут объяснить вам обоснование или ментальную модель того , их предпочтительных условиях предлагается, возможно , они просто делают Cargo Cult программирования или , что еще хуже, Bikeshedding

Ответил 07/07/2012 в 02:48
источник пользователем

голоса
1

Я предпочитаю ваш Q1, однако это не делает абсолютно никакой разницы в производительности и не имеет абсолютно никакого влияния на оптимизатор запросов.

Для меня, поставив предыдущую таблицу первой дает мне необходимую информацию рано в моем процессе сканирования. Я могу читать join table B on A ...и уже знать , какие две таблицы соединены вместе. Когда я читаю , join table B on B.blasdjasdid = ...я должен сканировать гораздо дальше , и до сих пор не знаю , наиболее важная информация, которую таблица соединяемых к (который является своего рода имен, домен , под которым имя столбца будет понятно). Кроме того, если столбцы названы одинаковые в обеих таблицах (идиоматической в любом дизайне базы данных I), я могу избежать сканирования до конца полностью, только чтение join table B on A.SomethingId ...и уже зная , что это = B.SomethingId.

Пройдя немного глубже, я хотел бы призвать вас спросить об этом происшествии на workplace.stackexchange.com , потому что я подозреваю , что причины , ваши услуги были прекращены , не соответствуют тому , что они сказали вам; некоторые запросы в это могут быть продуктивными. Я не утверждаю , что это ваша вина, но , что причина, скорее всего , был повод.

Ответил 29/12/2015 в 19:14
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more