Re: Глупый вопрос о сортировке

2008-01-22 Пенетрантность Dmitry Yemanov


Dmitry Voroshin wrote:


Насчёт уникальности. А если это уникальный индекс? Тогда получается 
сортировка бесмыссленна?


Только если это PK-индекс. Иначе вмешаются нуллы.


--
Дмитрий Еманов



Re: Глупый вопрос о сортировке

2008-01-21 Пенетрантность Dmitry Voroshin



"Dmitry Yemanov" <[EMAIL PROTECTED]> 
сообщил/сообщила в новостях следующее: news:[EMAIL PROTECTED]


sasha wrote:



Потому что это бессмысленно.


Объясни пожалуйста.


Исключение одно -- если индекс по первым полям хорошо кластеризован, но у 
нас нет соответствующей статистики. Зато если индексированные поля сильно 
неуникальны, то твой вариант "уйдет в себя" на века.


Насчёт уникальности. А если это уникальный индекс? Тогда получается 
сортировка бесмыссленна? 





Re: Глупый вопрос о сортировке

2008-01-19 Пенетрантность sasha



P.S. Провёл эксперимент - все данные в кэше :-):-):-):-)


У нас на реальном сервере обычно так и есть.



Re: Глупый вопрос о сортировке

2008-01-19 Пенетрантность sasha



С полным фетчем?


Вот дома эксперимент провёл:

CREATE TABLE "Test" (
"Id"INTEGER NOT NULL,
"Name"  VARCHAR(1000) NOT NULL
);

ALTER TABLE "Test" ADD CONSTRAINT "PK_Test" PRIMARY KEY ("Id");

CREATE INDEX "Test_IDX1" ON "Test" COMPUTED BY (CAST(SUBSTRING("Name" 
FROM 1 FOR 50) AS VARCHAR(50)));


20 тысяч записей:



SELECT * FROM "Test"
ORDER BY CAST(SUBSTRING("Name" FROM 1 FOR 50) AS VARCHAR(50))

PLAN (Test ORDER Test_IDX1)

-- Performance info --
Prepare time = 0ms
Execute time = 704ms
Avg fetch time = 0,04 ms
Current memory = 34 645 576
Max memory = 95 473 164
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 60 102




SELECT * FROM "Test"
ORDER BY SUBSTRING("Name" FROM 1 FOR 50)

PLAN SORT ((Test NATURAL))

-- Performance info --
Prepare time = 0ms
Execute time = 4s 812ms
Avg fetch time = 0,24 ms
Current memory = 34 645 532
Max memory = 95 473 164
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 41 534




SELECT * FROM "Test"
ORDER BY "Name"

-- Performance info --
Prepare time = 0ms
Execute time = 2s 766ms
Avg fetch time = 0,14 ms
Current memory = 34 644 548
Max memory = 95 473 164
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 41 534



Re: Глупый вопрос о сортировке

2008-01-19 Пенетрантность sasha


Спасибо за объяснение. Хоть буду знать...



Re: Глупый вопрос о сортировке

2008-01-19 Пенетрантность sasha



С полным фетчем?


Я просто этот запрос собственноручно не запускал, но товарищ, который 
запускал, вроде всё время двойную стрелочку в эксперте нажимал. Так что 
99% что с полным фетчем. Там чуть больше 10 тыс записей всего (много 
текстовых полей).




Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Dmitry Yemanov


sasha wrote:


Это меня вобще в тупик загнало. Почему плохо? У меня ведь запрос по 
индексу сортирует почти в 5 раз быстрее...


С полным фетчем?


--
Дмитрий Еманов



Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Dmitry Yemanov


sasha wrote:



Потому что это бессмысленно.


Объясни пожалуйста.


Потому что только индексом воспользоваться не удастся. Придется сочетать 
чтение на основе индекса с буферной сортировкой для каждой группы. Т.е. 
удваивать кол-во операций по сравнению с любым из ORDER/SORT отдельно. 
Ключевая идея, стоящая за SORT -- что записи читаются в порядке 
физического расположения и, след-но, экономия на этом (по сравнению со 
случайным I/O в случае ORDER) позволит компенсировать собственно сортировку.


Твоя идея хороша только для одного: быстро загрузить первые N записей в 
грид при сортировке по полям, непокрытым индексом. На полном же фетче 
этот вариант должен проиграть SORT'у. Исключение одно -- если индекс по 
первым полям хорошо кластеризован, но у нас нет соответствующей 
статистики. Зато если индексированные поля сильно неуникальны, то твой 
вариант "уйдет в себя" на века.



--
Дмитрий Еманов



Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность sasha



   Я уже сказал - индекс для сортировки это плохо


Это меня вобще в тупик загнало. Почему плохо? У меня ведь запрос по 
индексу сортирует почти в 5 раз быстрее...





Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность sasha



Потому что это бессмысленно.


Объясни пожалуйста.



Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Dmitry Yemanov


sasha wrote:


Подскажите пожалуйста почему сервер не может использовать индекс для 
сортировки если сортировка идёт по нескольким полям и то поле, по 
которому есть индекс, указано в списке ORDER BY первым?


Потому что это бессмысленно.


--
Дмитрий Еманов



Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Khorsun Vlad


"sasha" ...



   Вопрос был об эффективности сортировки по ID + Name и по Name


Я вобще изначально спрашивал как заюзать индекс если сортировка по нескольким 
полям.


   Не надо его юзать


   Ты уверен, что тебе нужен ORDER через INDEX, а не ORDER через SORT ???


Мне безразлично как - лишь-бы быстрее...


   Я уже сказал - индекс для сортировки это плохо

--
Хорсун Влад 





Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность sasha



   Вопрос был об эффективности сортировки по ID + Name и по Name


Я вобще изначально спрашивал как заюзать индекс если сортировка по 
нескольким полям.



   Ты уверен, что тебе нужен ORDER через INDEX, а не ORDER через SORT ???


Мне безразлично как - лишь-бы быстрее...



Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность sasha



   А в "кое что ещё" небось опять куча варчаров, раздувающих сортировку
на сотни мег ?


Да дело не в том что там после, а в том что индекс не используется.

И к стати у нас вместо Name индекс по выражению на самом деле, так что 
составный индекс не прокатывает.



SELECT *
FROM "Users"
ORDER BY CAST(SUBSTRING(UPPER("Name") FROM 1 FOR 50) AS VARCHAR(50)))
  --, UPPER("AccountName")



Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Khorsun Vlad


"sasha" ...



   А в "кое что ещё" небось опять куча варчаров, раздувающих сортировку
на сотни мег ?


Да дело не в том что там после, а в том что индекс не используется.


   Вопрос был об эффективности сортировки по ID + Name и по Name


И к стати у нас вместо Name индекс по выражению на самом деле, так что 
составный индекс не прокатывает.


   Ты уверен, что тебе нужен ORDER через INDEX, а не ORDER через SORT ???

--
Хорсун Влад 





Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность sasha



   А почему ты решил, что сортировка по ID + Name будет хуже, чем
сортировка по Name ? ORDER BY INDEX хорош только для выбора первых
нескольких записей, для большого объёма выборки это очень плохо.


У нас реальный запрос с сортировкой только по Name работает ~2.3 
секунды, а запрос с сортировкой по Name + кое что ещё почти 12 секунд.


И к стати у нас вместо Name индекс по выражению на самом деле, так что 
составный индекс не прокатывает.




Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Khorsun Vlad


"sasha" ...



   А почему ты решил, что сортировка по ID + Name будет хуже, чем
сортировка по Name ? ORDER BY INDEX хорош только для выбора первых
нескольких записей, для большого объёма выборки это очень плохо.


У нас реальный запрос с сортировкой только по Name работает ~2.3 секунды, а запрос с сортировкой по Name + кое что ещё почти 12 
секунд.


   А в "кое что ещё" небось опять куча варчаров, раздувающих сортировку
на сотни мег ?


И к стати у нас вместо Name индекс по выражению на самом деле, так что 
составный индекс не прокатывает.


   Ни асилил.

--
Хорсун Влад 





Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Boulitchev Aleksey


надо как-то объяснить серверу, за какую щеку он должен положить записи, 
отфетченные по ID, чтобы потом посортировать их по NAME


Ясное дело, но как?


берешь армянского коньяку и глинтвейна, садишься перед сервером и начинаешь 
уговаривать

не поможет - скажи, что будешь пинать ногами.

--
Булычев Алексей
http://www.stella-npf.ru




Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Khorsun Vlad


"sasha" ...



надо как-то объяснить серверу, за какую щеку он должен положить записи, 
отфетченные по ID, чтобы потом посортировать их по NAME


Ясное дело, но как?


   Никак.

   А почему ты решил, что сортировка по ID + Name будет хуже, чем
сортировка по Name ? ORDER BY INDEX хорош только для выбора первых
нескольких записей, для большого объёма выборки это очень плохо.

--
Хорсун Влад 





Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность sasha


надо как-то объяснить серверу, за какую щеку он должен положить записи, 
отфетченные по ID, чтобы потом посортировать их по NAME


Ясное дело, но как?




Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Boulitchev Aleksey



SELECT *
FROM "Test"
PLAN ("Test" ORDER "PK_Test")
ORDER BY "Id", "Name"

Как бы это сделать?


надо как-то объяснить серверу, за какую щеку он должен положить записи, 
отфетченные по ID, чтобы потом посортировать их по NAME


--
Булычев Алексей
http://www.stella-npf.ru




Re: Глупый вопрос о сортировке

2008-01-18 Пенетрантность Ded


sasha wrote:


Привет!


  Сабж: и вправду.

--
Regards. Ded.