Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Bug или фича? Order by не работает.  [new]
Александр Третьяков
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]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Александр Третьяков,

автор
--order не сработал, зависит от типа базы
select * from #tmpTable1 

Так где у вас тут ORDER BY?
26 фев 15, 13:13    [17315144]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
Александр Третьяков
--order не сработал, зависит от типа базы
select * from #tmpTable1

А где вы тут сортировку увидели?
26 фев 15, 13:13    [17315149]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4392
Если вы полагаете, что как положили данные так они и лежат, то вы ошибаетесь!
Сервер без определения сортировки выдает строки в том порядке, в котором посчитает удобным для себя.
26 фев 15, 13:16    [17315162]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Александр Третьяков
--order не сработал, зависит от типа базы
select * from #tmpTable1 

--order  сработал
select codetvun
from #tmpTable2
order by codetvun

четко подмечено - при отсутствии в запросе order by он не срабатывает
26 фев 15, 13:17    [17315179]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Вы удивитесь на таблицах размером до 1 страницы как у вас.. еще не такое можно словить
Да и сортировки в выводе результата как уже ответили у вас - нет
26 фев 15, 13:19    [17315193]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Александр Третьяков
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]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Александр Третьяков
данные ложатся в таблицу tmpTable1 сортированными

insert into #tmpTable1 (codetvun)
select codetvun
from #tmpTable2 S
order by S.codetvun 

Это вы как определили ?

Александр Третьяков
команда
select * from #tmpTable1


просто достает данные из таблицы в их физическом порядке.

Это вы сами решили, где-тио прочитали или вам кто-то сказал ?
26 фев 15, 13:22    [17315216]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Александр Третьяков
данные ложатся в таблицу tmpTable1 сортированными

insert into #tmpTable1 (codetvun)
select codetvun
from #tmpTable2 S
order by S.codetvun 
Это, если бы у вас был кластерный индекс.


Александр Третьяков
select * from #tmpTable1


просто достает данные из таблицы в их физическом порядке.
Нет никакого "физического порядка".
26 фев 15, 13:24    [17315233]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Александр Третьяков
Bug или фича?
Вообще-то, это основы.
Азбука.
26 фев 15, 13:25    [17315236]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Order by при вставке дает только одно - правильную _логическую_ генерацию всяких identity, сиквенсов и прочего.
26 фев 15, 13:28    [17315260]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Александр Третьяков
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]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Александр Третьяков
и вы увидите Ordered False.

и какое отношение это имеет к физическому порядку данных в куче ?

Александр Третьяков
Если таблица создана с нуля!!!, то данные в нее вносятся последовательно (я в курсе про размер страницы, и т.д.), это 100%.

Даже если это будет 146%, то какое отношение это имеет к выборке из таблицы без order by ?
26 фев 15, 13:44    [17315365]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Александр Третьяков,

Тот разработчик, что написал код без order by, но с каким-то шаманством вместо него, и после всего этого ожидает упорядоченную выборку, сам себе злобный буратина и должен страдать.

Остальное -- неинтересные разговоры в пользу бедных.
26 фев 15, 13:46    [17315381]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Александр Третьяков
Member

Откуда: Украина, г. Тернополь
Сообщений: 549
Даю планы выполнения запросов.
SQL2012 база в режиме SQL2012.
Оптимизатор "выкидывает" order by.

К сообщению приложен файл. Размер - 84Kb
26 фев 15, 13:49    [17315399]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Александр Третьяков
Member

Откуда: Украина, г. Тернополь
Сообщений: 549
Даю планы выполнения запросов.
SQL2012 база в режиме SQL2008.
Оптимизатор уже "использует" order by.

Повторюсь код тот же.

Планы разные.

К сообщению приложен файл. Размер - 25Kb
26 фев 15, 13:52    [17315413]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Александр Третьяков
Даю планы выполнения запросов.
SQL2012 база в режиме SQL2012.
Оптимизатор "выкидывает" order by.
Потому что он там не нужен. А вот если сделать create table #tmpTable1 (codetvun int, id int identity ), то сортировка появится.
26 фев 15, 13:52    [17315420]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Александр Третьяков
Оптимизатор "выкидывает" order by.

В огороде бузина, а в Киеве дядька.
Кто "выкинул" order by из запроса select * from #tmpTable1 ?
26 фев 15, 13:53    [17315424]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Александр Третьяков
Повторюсь код тот же.
Один и тот же кривой код. Только не при вставке, а при выборке. Осталось сделать над собой усилие, и понять простой факт, что нет ничего в MSSQL, что может гарантировать како-то порядок выборки без order by, особенно между большими релизами.
26 фев 15, 13:56    [17315441]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
кто-то пропустил первые лекции о БД...
реляционная модель, основные свойства отношения:
-Порядок кортежей в отношении не определён.
-Порядок атрибутов в заголовке отношения не определён.


т.е. без явного ORDER BY порядок вывода строк вашей таблицы (отношения) ничем не детерминирован
26 фев 15, 14:02    [17315489]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Александр Третьяков
Member

Откуда: Украина, г. Тернополь
Сообщений: 549
>Потому что он там не нужен. А вот если сделать create table #tmpTable1 (codetvun int, id int identity ), то сортировка появится.
А для SQL 2008 был нужен?


Для всех кто не внимательно прочитал пример.
Проблема не в выборке данных, а в вставке в новую таблицу.
26 фев 15, 14:49    [17315861]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
daw
гарантий этого уже давно нет - просто когда-то было обещано, что identity будет генерироваться в правильном порядке и даже не в bol, а в одной из статей support-а, и для версий <= 2000).
Непонятно, почему до сих пор этого нет в BOL. В блогах разработчиков, например, есть: http://blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx
26 фев 15, 14:50    [17315874]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Александр Третьяков
Для всех кто не внимательно прочитал пример.
Проблема не в выборке данных, а в вставке в новую таблицу

еще раз - куча вам вообще ничего не гарантирует..вы ето понимаете? Ну серьозно
26 фев 15, 14:52    [17315894]     Ответить | Цитировать Сообщить модератору
 Re: Bug или фича? Order by не работает.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Александр Третьяков
>Потому что он там не нужен. А вот если сделать create table #tmpTable1 (codetvun int, id int identity ), то сортировка появится.
А для SQL 2008 был нужен?


Для всех кто не внимательно прочитал пример.
Проблема не в выборке данных, а в вставке в новую таблицу.
Это вы невнимательно читаете ответы. Проблема только у вас в голове. Что касается оптимизатора, то в 2012 он просто стал умнее и убирает лишнюю ненужную опирацию сортировки, если нет ни одной причины ее делать. Ваше желание когда-то потом выбирать вставленные записи без order by причиной для него не считается.

Сообщение было отредактировано: 26 фев 15, 15:01
26 фев 15, 14:52    [17315897]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить