Чому 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їх, але чому це відбувається? Більшість моїх даних вставляється через веб-додаток, усі вставки з цього додатка призводять до замовлення First In First Out, напр., Остання вставка знаходиться внизу, тому ідентифікатори - всі підряд. Чи є якесь налаштування на сервері чи студії управління, яке спричиняє це неправильне замовлення?


Як я бачив іноді, від вибору рядків, якщо ви вибираєте одну таблицю, залежить від впорядкування ПК. Якщо ви зробите кілька приєднань, це може змінитися залежно від інших таблиць ПК, ФК та ​​індексів ...
Гільєрмо Гутьеррес

Будьте в курсі карусель сканування теж.
Майкл Грін

Відповіді:


21

У світі SQL порядок не є притаманною властивістю набору даних. Таким чином, ви не отримуєте жодних гарантій від RDBMS, що ваші дані повернуться в певному порядку - або навіть у послідовному порядку - якщо ви не запитаєте свої дані із ORDER BYзастереженням.

Від Крейга Фрідмана :

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

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


13

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

Іншими словами, і я знаю, що ви вже знаєте відповідь, але її не можна констатувати досить:

Якщо ви хочете покластися на порядок запиту, ЗАВЖДИ додайте ORDER BY .


Я не планував залежно від замовлення, але візуально трохи дратує, що останні мої вставлені елементи раптом знаходяться вгорі.
Ben Brocka

Я думаю, це тому, що ви використовуєте Open Table. У програмі Management Studio 2008 ця команда була перенесена на "Редагувати верхні n рядки" та "Вибрати вершини N рядків" - коли ви вибираєте останній, ви можете редагувати отриманий запит, наприклад, видалити верхній і додати замовлення.
Аарон Бертран

Це студія управління 2008 року, сервер 2005 року, повинна була бути зрозумілішою. Я не знав, що є команда "Відкритий стіл", я завжди використовував selectстатути
Бен Брока

4
Гаразд, справа все ще стоїть, я розумію, що це дратує, що дані повертаються в тому порядку, якого ви не очікуєте, але я сподіваюся, що зараз зрозуміло, чому SQL Server насправді не цікавить, який порядок ви очікуєте, якщо ви не скажете, що вам все одно шляхом додавання наказу застереженням. :-)
Аарон Бертран

1

Це тому, що таблиця є купою таблиці (швидше за все) і не індексується. Зробіть ідентифікаційний стовпчик a PRIMARY KEY, а також IDENTITY. SQL Server фізично зберігає дані на основі індексів - наприклад, якщо id - це кластерний індекс (наприклад, первинний ключ), дані фізично зберігатимуться в порядку ідентифікаторів і будуть повернені таким чином у запиті навіть без ORDER BYпункт. В іншому випадку впорядкування рядків зовсім не важливо для бази даних. Отже, наявність програми залежить від порядку рядків у базі даних (а також залежно від того, що стовпці знаходяться в певному порядку) не є хорошою практикою. Додаток повинен працювати з будь-якими ключами в базі даних, щоб ідентифікувати рядки.


Добре знати. Я знав, що це натяк на зміну програми для використання order by(це успадкований додаток із великою кількістю поганої практики), але мені було цікаво, чому саме так сталося.
Ben Brocka

5
Зміна структури таблиці, щоб переконатися, що SELECT *НЕ ORDER BY може повернутися в «правильному» порядку (але все ж таки не може бути гарантовано)?
Аарон Бертран

На простому SELECT з таблиці з кластерним індексом повернеться в порядку кластерного індексу. Не було так зрозуміло, як я мав би бути, що це було ілюстрацією того, коли дані впорядковуються певним стовпцем фізично, але це точно не дано, що в кожному запиті вони будуть повернені правильно. Mea culpa.
Віл

5
Насправді не важливо, що таке кластерний індекс. SQL Server все ще може повернути замовлення на основі якогось іншого індексу на основі широкого спектру факторів. Створення первинного ключа в якомусь стовпчику НЕ гарантує, що вибір без доручення несподівано повернеться впорядкованим цим стовпцем завжди. Чи можете ви це спостерігати більшу частину часу? Звичайно. Але це не те саме, що гарантія. Я ніколи не бачив білого ведмедя на своїй вулиці, але немає силового поля білого ведмедя, який би перешкоджав цьому.
Аарон Бертран

4
У будь-якому разі, моя думка полягала в тому, що додавання ORDER BYпропозиції є набагато кращою гарантією (не майте на увазі набагато менш руйнівної), ніж внесення змін у схему до таблиці та сподівання, що замовлення буде таким, як ви очікуєте, назавжди.
Аарон Бертран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.