Почему SSMS вставляет новые строки вверху таблицы, а не внизу?

14

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

id  row
42 first row
1 second row
2 third row

Когда строки выбираются и не упорядочены явно. Это приводит к другому виду, когда строки выбираются для веб-приложения, и изменяет то, что TOP 1возвращает запрос.

Я знаю, что могу order byих, но почему это происходит? Большая часть моих данных вставляется через веб-приложение, все вставки из этого приложения приводят к упорядочению «первым пришел - первым обслужен», например, последняя вставка находится внизу, поэтому все идентификаторы расположены подряд. Есть ли какая-либо настройка на сервере или в Management Studio, которая вызывает это неправильное упорядочение?

Бен Брока
источник
Как я иногда видел, это зависит от порядка расположения строк на ПК, если вы выбираете одну таблицу. Если вы сделаете несколько объединений, это может измениться в зависимости от других таблиц PK, FK и индексов ...
Гильермо Гутьеррес
Имейте в виду и карикатуры.
Майкл Грин

Ответы:

21

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

От Крейга Фридмана :

Объединение TOP с ORDER BY добавляет детерминизм к множеству возвращаемых строк. Без ORDER BY набор возвращаемых строк зависит от плана запроса и может даже варьироваться от выполнения к выполнению.

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

Ник Чаммас
источник
13

Просто для дополнения других ответов: таблица по определению является неупорядоченным набором строк. Если вы не укажете ORDER BYпредложение, SQL Server может свободно возвращать строки в любом порядке, который он считает наиболее эффективным. Это часто просто совпадает с порядком вставки, так как большинство таблиц имеют кластеризованный индекс по столбцам идентификаторов, даты и времени или других монотонно увеличивающихся столбцов, но вы должны рассматривать это именно так: совпадение. Он может изменяться с новыми данными, обновлением статистики, флагом трассировки, изменениями в maxdop, подсказками запросов, изменениями в соединениях или предложениях в запросе, изменениями в оптимизаторе из-за пакета обновления / накопительного обновления / исправления / обновления, перемещение базы данных на другой сервер и т. д. и т. д.

Другими словами, и я знаю, что вы уже знаете ответ, но он не может быть достаточно сформулирован:

Если вы хотите полагаться на порядок запроса, ВСЕГДА добавляйте ORDER BY .

Аарон Бертран
источник
Я не планировал зависеть от заказа, но визуально немного раздражает, что мои последние вставленные элементы внезапно оказываются наверху.
Бен Брокка,
Я полагаю, это потому, что вы используете Open Table. В Management Studio 2008 эта команда была разделена на «Редактировать верхние n строк» ​​и «Выбрать верхние N строк» ​​- когда вы выбираете последний, вы можете редактировать результирующий запрос, например, удалять верхний и добавлять заказ с помощью.
Аарон Бертран
Это Management studio 2008, сервер 2005 года, должно было быть понятнее. Я не знал, что была команда «открыть стол», я всегда использовал selectстатистику
Бен Брока
4
Хорошо, точка зрения остается в силе, я понимаю, что раздражает, что данные возвращаются в порядке, который вы не ожидаете, но я надеюсь, что теперь понятно, почему SQL Server на самом деле не волнует, какой порядок вы ожидаете, если вы не скажете, что вам это нужно добавив заказ по предложению. :-)
Аарон Бертран
1

Это потому, что таблица является таблицей кучи (скорее всего) и не индексируется. Сделать столбец идентификатора PRIMARY KEYа также IDENTITY. SQL Server физически хранит данные на основе индексов - например, если id является кластеризованным индексом (таким как первичный ключ), данные будут физически храниться в порядке идентификаторов и будут возвращаться таким образом в запросе даже без ORDER BYпункт. В противном случае, порядок строк вообще не важен для базы данных. Следовательно, наличие приложения зависит от порядка строк в базе данных (а также от расположения столбцов в определенном порядке) не является хорошей практикой. Приложение должно работать с любыми ключами, которые есть в базе данных, чтобы идентифицировать строки.

Wil
источник
Хорошо знать. Я знал, что это подсказка для изменения используемого приложения order by(это унаследованное приложение с большим количеством плохой практики), но мне было интересно, почему именно это произошло.
Бен Брокка,
5
Измените структуру таблицы просто так, чтобы SELECT *без ORDER BY нее можно было вернуться в «правильном» порядке (но все же не быть гарантированным)?
Аарон Бертран
На простой SELECT из таблицы с кластеризованным индексом вернется в порядке кластеризованного индекса. Не так ясно, как следовало бы предположить, что это была иллюстрация того, когда данные физически упорядочены по определенному столбцу, но определенно не дано, чтобы в каждом запросе они возвращались правильно. Моя вина.
Wil
5
Неважно, что такое кластерный индекс. SQL Server может по-прежнему возвращать порядок, основанный на некотором другом индексе, основанном на множестве факторов. Создание первичного ключа в некотором столбце НЕ гарантирует, что выборки без упорядочения по внезапно всегда возвращаются упорядоченными по этому столбцу. Можете ли вы наблюдать это большую часть времени? Конечно. Но это не то же самое, что гарантия. Я никогда не видел белого медведя на своей улице, но нет силового поля белого медведя, которое бы препятствовало этому.
Аарон Бертран
4
В любом случае, моя точка зрения заключалась в том, что добавление ORDER BYпредложения является гораздо лучшей гарантией (не говоря уже о гораздо менее разрушительном), чем внесение изменений в схему таблицы и надежда на то, что порядок будет таким, как вы ожидаете, навсегда.
Аарон Бертран