Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Александр Третьяков Member Откуда: Украина, г. Тернополь Сообщений: 549 |
SQL 2012 SP2 не работает сортировка пример кода create table #tmpTable1 (codetvun int) create table #tmpTable2 (codetvun int) insert into #tmpTable2 (codetvun) values (1000) insert into #tmpTable2 (codetvun) values (10) insert into #tmpTable2 (codetvun) values (500) insert into #tmpTable1 (codetvun) select codetvun from #tmpTable2 S order by S.codetvun --order не сработал, зависит от типа базы select * from #tmpTable1 --order сработал select codetvun from #tmpTable2 order by codetvun drop table #tmpTable1 drop table #tmpTable2 результат (3 row(s) affected) codetvun ----------- 1000 10 500 (3 row(s) affected) codetvun ----------- 10 500 1000 (3 row(s) affected) Результат сортировки зависит от типа базы SQL 2012 или SQL 2008 делаем ALTER DATABASE [TestDB] SET COMPATIBILITY_LEVEL = 110 --SQL 2012 не правильная сортировка делаем ALTER DATABASE [TestDB] SET COMPATIBILITY_LEVEL = 100 --SQL 2008 правильная сортировка А почему так? |
26 фев 15, 13:10 [17315129] Ответить | Цитировать Сообщить модератору |
Ruuu Member Откуда: Иркутск Сообщений: 4272 |
Александр Третьяков,
Так где у вас тут ORDER BY? |
||
26 фев 15, 13:13 [17315144] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4392 |
А где вы тут сортировку увидели? |
||
26 фев 15, 13:13 [17315149] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4392 |
Если вы полагаете, что как положили данные так они и лежат, то вы ошибаетесь! Сервер без определения сортировки выдает строки в том порядке, в котором посчитает удобным для себя. |
26 фев 15, 13:16 [17315162] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
четко подмечено - при отсутствии в запросе order by он не срабатывает |
||
26 фев 15, 13:17 [17315179] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Вы удивитесь на таблицах размером до 1 страницы как у вас.. еще не такое можно словить ![]() Да и сортировки в выводе результата как уже ответили у вас - нет |
26 фев 15, 13:19 [17315193] Ответить | Цитировать Сообщить модератору |
Александр Третьяков Member Откуда: Украина, г. Тернополь Сообщений: 549 |
данные ложатся в таблицу tmpTable1 сортированнымиinsert into #tmpTable1 (codetvun) select codetvun from #tmpTable2 S order by S.codetvun команда select * from #tmpTable1 просто достает данные из таблицы в их физическом порядке. То есть , если у нас тип базы данных SQL2012, то сортировка при вставке в таблицу не срабатывает. |
26 фев 15, 13:20 [17315202] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Это вы как определили ?
Это вы сами решили, где-тио прочитали или вам кто-то сказал ? |
||||
26 фев 15, 13:22 [17315216] Ответить | Цитировать Сообщить модератору |
Ruuu Member Откуда: Иркутск Сообщений: 4272 |
|
||||
26 фев 15, 13:24 [17315233] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Азбука. |
||
26 фев 15, 13:25 [17315236] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
Order by при вставке дает только одно - правильную _логическую_ генерацию всяких identity, сиквенсов и прочего. |
26 фев 15, 13:28 [17315260] Ответить | Цитировать Сообщить модератору |
Александр Третьяков Member Откуда: Украина, г. Тернополь Сообщений: 549 |
Советую посмотреть план insert into #tmpTable1 (codetvun) select codetvun from #tmpTable2 S order by S.codetvun и вы увидите Ordered False. А почему так? То есть, в зависимости от COMPATIBILITY_LEVEL базы данных в таблицу данные будут ложится по разному? Вы ошибаетесь. этот код работал еще с SQL2000, SQL2005, SQL2008, SQL2008R2... А при переходе на SQL2012 такой нюанс. Я понимаю, что с точки зрения оптимизатора, если разработчик не создал первичный ключ (кластерный индекс), то это ОЗНАЧАЕТ что разработчику таблицы ПОФИГ на сортировку таблицы. Зачем оптимизатору тратить ресурс на сортировку, если ВАМ это не нужно... Поэтому оптимизатор пропускает сортировку, и простым перемещением создает новую таблицу (это намного быстрее) Если таблица создана с нуля!!!, то данные в нее вносятся последовательно (я в курсе про размер страницы, и т.д.), это 100%. |
26 фев 15, 13:40 [17315336] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
и какое отношение это имеет к физическому порядку данных в куче ?
Даже если это будет 146%, то какое отношение это имеет к выборке из таблицы без order by ? |
||||
26 фев 15, 13:44 [17315365] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
Александр Третьяков, Тот разработчик, что написал код без order by, но с каким-то шаманством вместо него, и после всего этого ожидает упорядоченную выборку, сам себе злобный буратина и должен страдать. Остальное -- неинтересные разговоры в пользу бедных. |
26 фев 15, 13:46 [17315381] Ответить | Цитировать Сообщить модератору |
Александр Третьяков Member Откуда: Украина, г. Тернополь Сообщений: 549 |
Даю планы выполнения запросов. SQL2012 база в режиме SQL2012. Оптимизатор "выкидывает" order by. К сообщению приложен файл. Размер - 84Kb |
26 фев 15, 13:49 [17315399] Ответить | Цитировать Сообщить модератору |
Александр Третьяков Member Откуда: Украина, г. Тернополь Сообщений: 549 |
Даю планы выполнения запросов. SQL2012 база в режиме SQL2008. Оптимизатор уже "использует" order by. Повторюсь код тот же. Планы разные. К сообщению приложен файл. Размер - 25Kb |
26 фев 15, 13:52 [17315413] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
|
||
26 фев 15, 13:52 [17315420] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
В огороде бузина, а в Киеве дядька. Кто "выкинул" order by из запроса select * from #tmpTable1 ? |
||
26 фев 15, 13:53 [17315424] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
|
||
26 фев 15, 13:56 [17315441] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
кто-то пропустил первые лекции о БД...
т.е. без явного ORDER BY порядок вывода строк вашей таблицы (отношения) ничем не детерминирован |
||
26 фев 15, 14:02 [17315489] Ответить | Цитировать Сообщить модератору |
daw Member Откуда: Муром -> Москва Сообщений: 7381 |
Александр Третьяков, > А почему так? в трех соснах вы путаетесь. на самом деле, в том примере, который вы даете есть три действия, где могло бы быть применено упорядочение: 1. выборка из #tmpTable2 select codetvun from #tmpTable2 S order by S.codetvun 2. вставка их в #tmpTable1 insert into #tmpTable1 (codetvun) 3. выборка уже из #tmpTable1 select * from #tmpTable1 для второго и третьего действий никакого упорядочивания никогда не гарантировалось (да, собственно, и не производилось). в первом действии упорядочивание применялось для корректной генерации identity. при этом на простых примерах (небольшие размеры вставляемых данных, отсутствие на #tmpTable1 индексов и т.д. и т.п.) могла возникнуть _видимость_ упорядоченной выборки на третьем этапе. так вот, до 2012 упорядочение при insert into ... select ... order by для правильного порядка генерации identity применялось (для простоты, видимо) всегда - не зависимо от, собственно, наличия identity в таблице, в которую производится вставка. в 2012 сервер стал умнее - теперь оно применяется только если identity действительно надо генерировать, а если нет - опускается (но в скобках можно заметить, что, строго говоря, гарантий этого уже давно нет - просто когда-то было обещано, что identity будет генерироваться в правильном порядке и даже не в bol, а в одной из статей support-а, и для версий <= 2000). |
26 фев 15, 14:46 [17315838] Ответить | Цитировать Сообщить модератору |
Александр Третьяков Member Откуда: Украина, г. Тернополь Сообщений: 549 |
>Потому что он там не нужен. А вот если сделать create table #tmpTable1 (codetvun int, id int identity ), то сортировка появится. А для SQL 2008 был нужен? Для всех кто не внимательно прочитал пример. Проблема не в выборке данных, а в вставке в новую таблицу. |
26 фев 15, 14:49 [17315861] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
|
||
26 фев 15, 14:50 [17315874] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
еще раз - куча вам вообще ничего не гарантирует..вы ето понимаете? Ну серьозно |
||
26 фев 15, 14:52 [17315894] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
Сообщение было отредактировано: 26 фев 15, 15:01 |
||
26 фев 15, 14:52 [17315897] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |