Упорядочивает ли DB2 данные по первичному ключу

8

Недавно я обсуждал с коллегой, который настаивал на удалении предложений по предложениям из производственного запроса, потому что порядок по столбцам был таким же, как у первичного ключа .

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

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

Итак, мой вопрос: как DB2 упорядочивает запрос, если нет порядка по предложению? Использует ли он первичный ключ?
Как вы можете гарантировать, что данные поступают в параллельной системе правильно, без оговорок?

Reaces
источник

Ответы:

18

Нет, твой коллега не прав.

Все продукты SQL - СУБД, которые ведут себя в соответствии со стандартами SQL - не дают никаких гарантий того, что результат вывода запроса будет упорядочен каким-либо образом, если ORDER BYв запросе нет пункта .

Как упоминается в документации IBM DB2 :

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

ypercubeᵀᴹ
источник
«Если они ведут себя по стандартам SQL» - это большое, если ... IBM документирует FTW.
WernerCD
@WernerCD Ни одна СУБД не соответствует на 100% стандарту (и существует множество его версий). Но они утверждают, что соответствуют многим частям. Я ожидаю, по крайней мере, иметь, где они отличаются, документированы.
ypercubeᵀᴹ
Да, именно поэтому я получил +1 для документов IBM за "Стандарты". «Ожидаемый» против «Фактического» может, и, безусловно, будет, кусать вас в кейстере.
WernerCD
11

Как было указано в ответе ypercube, при отсутствии ORDER BYпредложения не существует определенного порядка .

Я хотел бы добавить, что важно понимать, что SQL является в значительной степени абстракцией, он не определяет шаг за шагом, что должна делать СУБД, а скорее определяет ваши требования к конечному результату.

Это подразумевает, что если данные уже проверены таким образом, который обеспечивает правильный порядок, это так, потому что СУБД определила такую ​​стратегию, и тогда она уже будет знать, что никакая дополнительная работа по сортировке не требуется для удовлетворения требований ORDER BYпункта ,

С другой стороны, если вы не укажете, что порядок важен для вас (даже если это действительно так?), СУБД примет это во внимание, и если она найдет другую стратегию, более эффективную для поиска нужных данных в В каком-то другом заказе он воспользуется тем, что вам, видимо, плевать на заказ. (Выбранная стратегия также может со временем измениться, в зависимости от увеличения количества данных в соответствующих таблицах, исправлений программного обеспечения и т. Д.)

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

Хокан Линдквист
источник
1
Причина, которую он привел в своем листе развертывания, заключается в том, что «Упорядочение по требует ресурсов ЦП, в то время как порядок уже подразумевается первичным ключом». Что звучит очень неправильно для меня (как доказано ответами до сих пор)
Reaces
@Reaces DB2 использует по умолчанию таблицы «кучи» или это больше похоже на SQL Server с кластерными индексами? Это не меняет ответ, но это может облегчить доказательство :)
Джек говорит, что попробуйте topanswers.xyz
@ Джек Дуглас, кластеризация в SQL Server и DB2 - это разные понятия. Я многое узнал о кластеризации на SQL-сервере в этой теме: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Если вы знакомы с SQL-сервером, но не знакомы с DB2, возможно, вы захотите взглянуть.
Леннарт
Таблицы @Reaces в DB2 обычно по умолчанию «кластеризованы» на первичном ключе, если не указан индекс кластеризации.
Крис Олдрич
1
@ChrisAldrich - это утверждение верно только для DB2 в z / OS.
Мустаччо