Всякий раз, когда я вручную вставляю строку в таблицу в 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, которая вызывает это неправильное упорядочение?
источник
Ответы:
В мире SQL порядок не является неотъемлемым свойством набора данных. Таким образом, вы не получаете никаких гарантий от вашей СУБД, что ваши данные будут возвращаться в определенном порядке - или даже в согласованном порядке - если вы не запросите свои данные с
ORDER BY
оговоркой.От Крейга Фридмана :
Всегда используйте,
ORDER BY
если вы ожидаете четко определенный и последовательный порядок в вашем наборе результатов. Никогда не полагайтесь на то, как ваша база данных может хранить строки на диске (например, с помощью кластерного индекса), чтобы гарантировать определенный порядок данных в ваших запросах.источник
Просто для дополнения других ответов: таблица по определению является неупорядоченным набором строк. Если вы не укажете
ORDER BY
предложение, SQL Server может свободно возвращать строки в любом порядке, который он считает наиболее эффективным. Это часто просто совпадает с порядком вставки, так как большинство таблиц имеют кластеризованный индекс по столбцам идентификаторов, даты и времени или других монотонно увеличивающихся столбцов, но вы должны рассматривать это именно так: совпадение. Он может изменяться с новыми данными, обновлением статистики, флагом трассировки, изменениями в maxdop, подсказками запросов, изменениями в соединениях или предложениях в запросе, изменениями в оптимизаторе из-за пакета обновления / накопительного обновления / исправления / обновления, перемещение базы данных на другой сервер и т. д. и т. д.Другими словами, и я знаю, что вы уже знаете ответ, но он не может быть достаточно сформулирован:
источник
select
статистикуЭто потому, что таблица является таблицей кучи (скорее всего) и не индексируется. Сделать столбец идентификатора
PRIMARY KEY
а такжеIDENTITY
. SQL Server физически хранит данные на основе индексов - например, если id является кластеризованным индексом (таким как первичный ключ), данные будут физически храниться в порядке идентификаторов и будут возвращаться таким образом в запросе даже безORDER BY
пункт. В противном случае, порядок строк вообще не важен для базы данных. Следовательно, наличие приложения зависит от порядка строк в базе данных (а также от расположения столбцов в определенном порядке) не является хорошей практикой. Приложение должно работать с любыми ключами, которые есть в базе данных, чтобы идентифицировать строки.источник
order by
(это унаследованное приложение с большим количеством плохой практики), но мне было интересно, почему именно это произошло.SELECT *
безORDER BY
нее можно было вернуться в «правильном» порядке (но все же не быть гарантированным)?ORDER BY
предложения является гораздо лучшей гарантией (не говоря уже о гораздо менее разрушительном), чем внесение изменений в схему таблицы и надежда на то, что порядок будет таким, как вы ожидаете, навсегда.