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


9

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

id row 
42 first row 
1 second row 
2 third row 

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

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

  0

Как я видел иногда, это зависит от того, как ПК заказывает, как отображаются строки, если вы выберете одну таблицу. Если вы делаете некоторые объединения, это может измениться в зависимости от других таблиц PK, FK и индексов ... 18 июл. 132013-07-18 22:00:36

  0

Знать [карусель] (http://technet.microsoft.com/en-us/library/ ms191475% 28v = sql.105% 29.aspx). 01 апр. 152015-04-01 03:49:03

17

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

От Craig Freedman:

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

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


0

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

  0

Полезно знать. Я знал, что это подсказка, чтобы изменить приложение, чтобы использовать «порядок» (это унаследованное приложение с большой плохими практиками), но мне было интересно, почему это произошло. 14 сен. 112011-09-14 19:49:38

+4

Измените структуру таблицы так, чтобы 'SELECT *' без 'ORDER BY' *** мог *** вернуться в« правильном »порядке (но все же не гарантированно)? 14 сен. 112011-09-14 20:22:26

  0

На простом SELECT из таблицы с кластеризованным индексом вернется порядок кластеризованного индекса. Было не так ясно, как я должен был быть, что это была иллюстрация того, когда данные упорядочены определенным столбцом физически, но это определенно не то, что в каждом запросе он будет возвращен правильно. Моя вина. 14 сен. 112011-09-14 20:27:39

+4

На самом деле не имеет значения, что такое кластеризованный индекс. SQL Server все равно может вернуть заказ на основе некоторого другого индекса, основанного на множестве факторов. Создание первичного ключа в каком-то столбце *** НЕ гарантирует, что выбор без заказа будет внезапным возвратом, упорядоченным по этому столбцу. Можете ли вы заметить, что большую часть времени? Конечно. Но это не то же самое, что гарантия. Я никогда не видел белого медведя на моей улице, но нет полярного медвежьего силового поля, которое предотвращает его. 14 сен. 112011-09-14 20:41:09

+3

Во всяком случае, моя точка зрения заключалась в том, что добавление предложения ORDER BY намного лучше (не говоря уже о менее разрушительном), чем вносить изменения в таблицу в таблицу и * надеясь, что заказ будет таким, каким вы ожидаете, навсегда. 14 сен. 112011-09-14 20:42:25


10

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

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

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

  0

Я не планировал в зависимости от заказа, но визуально немного раздражает то, что мои последние вставленные предметы внезапно поднимаются вверху. 14 сен. 112011-09-14 20:18:15

  0

Я полагаю, это связано с тем, что вы используете Open Table. В Management Studio 2008 эта команда была разделена на «Редактировать верхние строки» и «Выбрать верхние строки» - когда вы выберете последнее, вы можете отредактировать полученный запрос, например. удалите верхнюю часть и добавьте заказ. 14 сен. 112011-09-14 20:21:07

  0

Это студия управления 2008 года, сервер 2005 года, должен был быть более ясным. Я не знал, что есть команда «открытый стол», я всегда использовал «select' statments 14 сен. 112011-09-14 20:36:30

+4

Хорошо, но все же стоит, я понимаю, это раздражает, что данные возвращаются в том порядке, который вы не ожидаете, но я надеюсь, что теперь понятно, почему SQL Server действительно не заботится о том, какой порядок вы ожидаете * если * вы не скажете, что это вас беспокоит, добавив предложение order by. :-) 14 сен. 112011-09-14 20:37:35