Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Reading Pages  [new]
Reading
Guest
читаю статью

Reading Pages

написано, что если не указывать order by, то данные могут вернуться в любом порядке, но есть уточнение, что это только в версии SQL Server Enterprise. А в других версиях получается в любом порядке данные не вернуться, а вернуться как они храняться на диске, если не указывать сортировку?
13 фев 13, 22:41    [13923218]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Хотите с порядком - указывайте order by в любой версии.
13 фев 13, 22:54    [13923254]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34696
Reading,

Нет order by -- нет порядка. Есть order by -- есть порядок. В любой версии, в любой СУБД.
13 фев 13, 22:59    [13923268]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Glory
Member

Откуда:
Сообщений: 104751
Отсутствие order by не гарантирует вывод данных в каком либо порядке. Это не то же самое, что данные при каждом запосе будут возвращаться в разном порядке. Приведенный пример с Mary goes round механизмом, который реализован в одной из редакций, всего лишь один из примеров.
13 фев 13, 23:01    [13923277]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
reading
Guest
Glory
Отсутствие order by не гарантирует вывод данных в каком либо порядке. Это не то же самое, что данные при каждом запосе будут возвращаться в разном порядке. Приведенный пример с Mary goes round механизмом, который реализован в одной из редакций, всего лишь один из примеров.


а можно еще кроме "Mary goes round" ссылку или пример, когда еще без order by будет не тот порядок как на диске?
14 фев 13, 08:56    [13924065]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Не совсем понял, поясните пожалуйста:
msdn: Структуры кучи
Кучей является таблица без кластеризованного индекса
Получается, если есть кластеризованный индекс, то порядок (без указания order by) определяется им и строго определен?
14 фев 13, 09:29    [13924142]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3394
Cygapb-007,

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

Другой вопрос, что вы никогда a priori не угадаете, в порядке какого именно индекса будут выведены данные в каждом конкретном случае.
14 фев 13, 09:48    [13924225]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
кластерный индекс может быть только один. Если он задан, то без явного указания order by порядок вывода определяется именно кластерным индексом, поскольку таблица в данном случае является не кучей, а сбалансированным деревом.
Организация таблиц и индексов
Именно поэтому вопрос - будет ли порядок вывода жестко привязан к кластерному индексу БЕЗ УКАЗАНИЯ ORDER BY?
14 фев 13, 10:01    [13924277]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Уточню вопрос: или даже в случае кластерного индекса порядок вывода не гарантирован в силу действия механизма упреждающего чтения
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-ая страница. Только после этого операция просмотра для всех пользователей будет завершена.
14 фев 13, 10:11    [13924331]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3394
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;
14 фев 13, 10:13    [13924338]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Гость333
Member

Откуда:
Сообщений: 3683
[off]
Mary goes round

Сей механизм называется merry-go-round, что в переводе значит "карусель". А не "Мэри пошла по кругу"
[/off]
14 фев 13, 10:15    [13924349]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Согласен, насчет единственности кластеризованного индекса погорячился.

Тем не менее, ответ на вопрос не получен:) - в случае наличия у таблицы единственного кластерного индекса определяется ли им порядок вывода при отсутствии явного указания ORDER BY?
14 фев 13, 10:19    [13924377]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Тем не менее, ответ на вопрос не получен:) - в случае наличия у таблицы единственного
> кластерного индекса определяется ли им порядок вывода при отсутствии явного указания ORDER BY?

https://www.sql.ru/articles/mssql/2007/011203ClusteredIndexScansPart1.shtml
https://www.sql.ru/articles/mssql/2007/011204ClusteredIndexScansPart2.shtml
https://www.sql.ru/articles/mssql/2007/011501ClusteredIndexScansPart3.shtml
14 фев 13, 10:22    [13924395]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
daw, спасибо, почитаю:)
14 фев 13, 10:24    [13924410]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
relief
Member

Откуда:
Сообщений: 1197
автор
наличие у таблицы кластеризованного индекс не гарантирует того, что данные в файле будут упорядочены в соответствии с порядком ключа индекса.


мне тогда непонятно, как это коррелирует с тем, что кластерный индекс хранит данные уже в отсортиванном виде по индексу?
14 фев 13, 11:30    [13924858]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Cygapb-007
в случае наличия у таблицы единственного кластерного индекса определяется ли им порядок вывода при отсутствии явного указания ORDER BY?

Ещё несортированный набор может получаться из-за распараллеливания запроса. То есть оптимизатор может распределять диапазоны кластерного индекса по нескольким процессорам, и в каком порядке процессоры успеют обработать выделенные им диапазоны, в том порядке и будет итоговый результат.

Пример (проверял на MSSQL 2008R2 и 4-ядерном процессоре). Подготовим тестовую таблицу из сотни записей, размазанных по 15 страницам данных:
use tempdb;
set nocount on;
create table dbo.test (id int identity primary key clustered, filler as cast('String ' + cast(id as varchar) as char(1000)) persisted);
begin transaction;
go
insert dbo.test default values;
go 100
commit transaction;

Выполним простенький запрос:
select *
from dbo.test t1 inner loop join dbo.test t2 on t1.id = t2.id;

В плане запроса — Clustered Index Scan по алиасу a1, Clustered Index Seek по алиасу a2. Много-много раз нажимаем F5, записи всегда возвращаются в порядке кластерного индекса: 1, 2, 3, ... , 99, 100.

Теперь применим немного магии и попросим сервер включить параллелизм:
select *
from dbo.test t1 inner loop join dbo.test t2 on t1.id = t2.id
option (maxdop 4, querytraceon 8649);

В плане запроса — те же самые Clustered Index Scan по алиасу a1, Clustered Index Seek по алиасу a2, плюс добавился Parallelism (Gather Streams).

Несколько раз жмём F5. Данные возвращаются в самых разных порядках. Вот первые 10 записей для нескольких запусков:
1,  2,  3,  4,  5,  6,  7,  8,  16, 17...
9, 10, 11, 12, 13, 14, 15, 23, 24, 25...
9, 10, 11, 12, 13, 14, 15, 30, 31, 32...
16, 17, 18, 19, 20, 21, 22, 37, 38, 39...
16, 17, 18, 19, 20, 21, 22, 58, 59, 60...

PS. Самое интересное, что даже в самой команде разработки SQL Server, похоже, не все знают, что запрос без ORDER BY не гарантирует порядок вывода записей. Посмотрите на исходник процедуры sp_who2. В финальном селекте обнаружится строка:
      -- (Seems always auto sorted.)   order by spid_sort

То есть там была сортировка, а потом кто-то её убрал! Типа, и без этого результат будет отсортированный. В итоге при запуске "sp_who2 active" можно наблюдать порядок записей типа "34, 67, 1082, 1116, 1117, 149, 160, 207", что в общем-то несколько бесит :-)
14 фев 13, 11:48    [13924965]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Ennor Tiegael
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;
Вы утверждаете, что для одной таблицы можно создать 2 кластерных индекса? Приведите пример. (за "молодой человек" спасибо :))

Что касается статьи, то выводов два...
1. При наличии кластерного индекса механизм SQL при отсутствии ORDER BY всегда выводит записи в порядке кластерного индекса, кроме случаев явного указания with (nolock). КорефаныКорифеи, поправьте меня в моем заблуждении :))
2. В случае указания with (nolock) и достаточно активного обновления данных не гарантируется достоверность (!!!) выводимых данных - повод задуматься любителям совать (nolock) для оптимизации запросов.

2relif: речь идет о физической фрагментации логически упорядоченного индекса и отображении данных в порядке совместного просмотра по физическому расположению данных, что справедливо для кучи, но, как оказалось, не выполняется для сбалансированного дерева...
14 фев 13, 11:50    [13924999]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Гость333
Member

Откуда:
Сообщений: 3683
relief
автор
наличие у таблицы кластеризованного индекс не гарантирует того, что данные в файле будут упорядочены в соответствии с порядком ключа индекса.


мне тогда непонятно, как это коррелирует с тем, что кластерный индекс хранит данные уже в отсортиванном виде по индексу?

Кластерный индекс упорядочивает данные логически. В процитированной вами статье говорится про физическое упорядочивание и доказывается, что при некоторых обстоятельствах его может и не быть вовсе.
14 фев 13, 11:53    [13925020]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Гость333, спасибо за разъяснение :) Я все же предполагал, что порядок не гарантирован, но статья ... смутила :)
14 фев 13, 11:57    [13925046]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Cygapb-007
Что касается статьи, то выводов два...
1. При наличии кластерного индекса механизм SQL при отсутствии ORDER BY всегда выводит записи в порядке кластерного индекса, кроме случаев явного указания with (nolock). КорефаныКорифеи, поправьте меня в моем заблуждении :))

ересь...ещё раз: без явного ORDER BY вы не можете гарантировать порядок не наличием кластерного ни ещё чем-то. ТОЧКА.
14 фев 13, 12:06    [13925136]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Knyazev Alexey
Cygapb-007
Что касается статьи, то выводов два...
1. При наличии кластерного индекса механизм SQL при отсутствии ORDER BY всегда выводит записи в порядке кластерного индекса, кроме случаев явного указания with (nolock). КорефаныКорифеи, поправьте меня в моем заблуждении :))

ересь...ещё раз: без явного ORDER BY вы не можете гарантировать порядок не наличием кластерного ни ещё чем-то. ТОЧКА.
ваше утверждение очень похоже на "Аллилуйя" (см.13924395) , в то время как Гость333 ответил по существу вопроса и вполне однозначно. Но спасибо и вам за внимание к вопросу :)
14 фев 13, 12:16    [13925242]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3394
Cygapb-007
Вы утверждаете, что для одной таблицы можно создать 2 кластерных индекса?
Не припомню такого. Где там у меня два кластерника, ну-ка покажите.
14 фев 13, 12:21    [13925288]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3394
Knyazev Alexey,

Да я все пытаюсь до него это донести, но что-то туго входит.
14 фев 13, 12:22    [13925298]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Ennor Tiegael
Cygapb-007
Вы утверждаете, что для одной таблицы можно создать 2 кластерных индекса?
Не припомню такого. Где там у меня два кластерника, ну-ка покажите.
13924338 :)
14 фев 13, 12:23    [13925315]     Ответить | Цитировать Сообщить модератору
 Re: Reading Pages  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cygapb-007
ваше утверждение очень похоже на "Аллилуйя" (см.13924395) , в то время как Гость333 ответил по существу вопроса и вполне однозначно.

Завтра в патче что-то поменяется в движке и родится очередная urban legend вида "а порядок то есть"
Как например было для "select into #x блокирует все процессы, потому что блокирует все системные таблицы"
Вы можете все знать о внутреннем механизме, но вы не можете использовать его как гарантию нужного порядка результатов.
Так что это не "Аллилуйя", а "Аминь".
14 фев 13, 12:25    [13925331]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить