Reading Pages

Reading
Дата: 13.02.2013 22:41:34
читаю статью

Reading Pages

написано, что если не указывать order by, то данные могут вернуться в любом порядке, но есть уточнение, что это только в версии SQL Server Enterprise. А в других версиях получается в любом порядке данные не вернуться, а вернуться как они храняться на диске, если не указывать сортировку?
Гавриленко Сергей Алексеевич
Дата: 13.02.2013 22:54:00
Хотите с порядком - указывайте order by в любой версии.
MasterZiv
Дата: 13.02.2013 22:59:10
Reading,

Нет order by -- нет порядка. Есть order by -- есть порядок. В любой версии, в любой СУБД.
Glory
Дата: 13.02.2013 23:01:16
Отсутствие order by не гарантирует вывод данных в каком либо порядке. Это не то же самое, что данные при каждом запосе будут возвращаться в разном порядке. Приведенный пример с Mary goes round механизмом, который реализован в одной из редакций, всего лишь один из примеров.
reading
Дата: 14.02.2013 08:56:18
Glory
Отсутствие order by не гарантирует вывод данных в каком либо порядке. Это не то же самое, что данные при каждом запосе будут возвращаться в разном порядке. Приведенный пример с Mary goes round механизмом, который реализован в одной из редакций, всего лишь один из примеров.


а можно еще кроме "Mary goes round" ссылку или пример, когда еще без order by будет не тот порядок как на диске?
Cygapb-007
Дата: 14.02.2013 09:29:48
Не совсем понял, поясните пожалуйста:
msdn: Структуры кучи
Кучей является таблица без кластеризованного индекса
Получается, если есть кластеризованный индекс, то порядок (без указания order by) определяется им и строго определен?
Ennor Tiegael
Дата: 14.02.2013 09:48:27
Cygapb-007,

Смеетесь, что ли? Сиквел может вывести данные в порядке любого индекса, использовавшегося в запросе. В том числе и некластерного.

Другой вопрос, что вы никогда a priori не угадаете, в порядке какого именно индекса будут выведены данные в каждом конкретном случае.
Cygapb-007
Дата: 14.02.2013 10:01:35
кластерный индекс может быть только один. Если он задан, то без явного указания order by порядок вывода определяется именно кластерным индексом, поскольку таблица в данном случае является не кучей, а сбалансированным деревом.
Организация таблиц и индексов
Именно поэтому вопрос - будет ли порядок вывода жестко привязан к кластерному индексу БЕЗ УКАЗАНИЯ ORDER BY?
Cygapb-007
Дата: 14.02.2013 10:11:34
Уточню вопрос: или даже в случае кластерного индекса порядок вывода не гарантирован в силу действия механизма упреждающего чтения
http://msdn.microsoft.com/ru-ru/library/ms191475%28v=sql.105%29.aspx
Например, допустим, что некая таблица содержит 500 000 страниц. Пользователь UserA выполняет инструкцию Transact-SQL, которая требует просмотра таблицы. По первому запросу просмотрено уже 100 000 страниц, после чего пользователь UserB выполняет еще одну инструкцию Transact-SQL, которая требует просмотра той же таблицы. Для считывания после 100 001-ой страницы компонент Database Engine запланирует всего одну серию запросов и будет возвращать полученные строки обоим планам выполнения. По достижении 200 000-ой страницы пользователь UserC выполняет еще одну инструкцию Transact-SQL, которая требует просмотра той же таблицы. Начиная с 200 001-ой страницы, компонент Database Engine будет передавать строки каждой считываемой страницы всем трем просмотрам. После считывания 500 000-ой строки просмотр для пользователя UserA завершается, а для пользователей UserB и UserC чтение снова начинается с первой страницы. Когда компонент Database Engine доходит до 100 000-ой страницы, просмотр для пользователя UserB завершается. Просмотр для пользователя UserC продолжает выполняться до тех пор, пока не будет достигнута 200 000-ая страница. Только после этого операция просмотра для всех пользователей будет завершена.
Ennor Tiegael
Дата: 14.02.2013 10:13:09
Cygapb-007
кластерный индекс может быть только один. Если он задан, то без явного указания order by порядок вывода определяется именно кластерным индексом, поскольку таблица в данном случае является не кучей, а сбалансированным деревом
Да что вы говорите, молодой человек...
create table dbo.Test (
Id int identity primary key,
Val int not null
);
go
insert into dbo.Test(Val)
select ...
go
create index IX_Test_Val on dbo.Test(Val);
go
select Val from dbo.Test;