Re: Глупый вопрос о сортировке
Dmitry Voroshin wrote: Насчёт уникальности. А если это уникальный индекс? Тогда получается сортировка бесмыссленна? Только если это PK-индекс. Иначе вмешаются нуллы. -- Дмитрий Еманов
Re: Глупый вопрос о сортировке
"Dmitry Yemanov" <[EMAIL PROTECTED]> сообщил/сообщила в новостях следующее: news:[EMAIL PROTECTED] sasha wrote: Потому что это бессмысленно. Объясни пожалуйста. Исключение одно -- если индекс по первым полям хорошо кластеризован, но у нас нет соответствующей статистики. Зато если индексированные поля сильно неуникальны, то твой вариант "уйдет в себя" на века. Насчёт уникальности. А если это уникальный индекс? Тогда получается сортировка бесмыссленна?
Re: Глупый вопрос о сортировке
P.S. Провёл эксперимент - все данные в кэше :-):-):-):-) У нас на реальном сервере обычно так и есть.
Re: Глупый вопрос о сортировке
С полным фетчем? Вот дома эксперимент провёл: 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: Глупый вопрос о сортировке
Спасибо за объяснение. Хоть буду знать...
Re: Глупый вопрос о сортировке
С полным фетчем? Я просто этот запрос собственноручно не запускал, но товарищ, который запускал, вроде всё время двойную стрелочку в эксперте нажимал. Так что 99% что с полным фетчем. Там чуть больше 10 тыс записей всего (много текстовых полей).
Re: Глупый вопрос о сортировке
sasha wrote: Это меня вобще в тупик загнало. Почему плохо? У меня ведь запрос по индексу сортирует почти в 5 раз быстрее... С полным фетчем? -- Дмитрий Еманов
Re: Глупый вопрос о сортировке
sasha wrote: Потому что это бессмысленно. Объясни пожалуйста. Потому что только индексом воспользоваться не удастся. Придется сочетать чтение на основе индекса с буферной сортировкой для каждой группы. Т.е. удваивать кол-во операций по сравнению с любым из ORDER/SORT отдельно. Ключевая идея, стоящая за SORT -- что записи читаются в порядке физического расположения и, след-но, экономия на этом (по сравнению со случайным I/O в случае ORDER) позволит компенсировать собственно сортировку. Твоя идея хороша только для одного: быстро загрузить первые N записей в грид при сортировке по полям, непокрытым индексом. На полном же фетче этот вариант должен проиграть SORT'у. Исключение одно -- если индекс по первым полям хорошо кластеризован, но у нас нет соответствующей статистики. Зато если индексированные поля сильно неуникальны, то твой вариант "уйдет в себя" на века. -- Дмитрий Еманов
Re: Глупый вопрос о сортировке
Я уже сказал - индекс для сортировки это плохо Это меня вобще в тупик загнало. Почему плохо? У меня ведь запрос по индексу сортирует почти в 5 раз быстрее...
Re: Глупый вопрос о сортировке
Потому что это бессмысленно. Объясни пожалуйста.
Re: Глупый вопрос о сортировке
sasha wrote: Подскажите пожалуйста почему сервер не может использовать индекс для сортировки если сортировка идёт по нескольким полям и то поле, по которому есть индекс, указано в списке ORDER BY первым? Потому что это бессмысленно. -- Дмитрий Еманов
Re: Глупый вопрос о сортировке
"sasha" ... Вопрос был об эффективности сортировки по ID + Name и по Name Я вобще изначально спрашивал как заюзать индекс если сортировка по нескольким полям. Не надо его юзать Ты уверен, что тебе нужен ORDER через INDEX, а не ORDER через SORT ??? Мне безразлично как - лишь-бы быстрее... Я уже сказал - индекс для сортировки это плохо -- Хорсун Влад
Re: Глупый вопрос о сортировке
Вопрос был об эффективности сортировки по ID + Name и по Name Я вобще изначально спрашивал как заюзать индекс если сортировка по нескольким полям. Ты уверен, что тебе нужен ORDER через INDEX, а не ORDER через SORT ??? Мне безразлично как - лишь-бы быстрее...
Re: Глупый вопрос о сортировке
А в "кое что ещё" небось опять куча варчаров, раздувающих сортировку на сотни мег ? Да дело не в том что там после, а в том что индекс не используется. И к стати у нас вместо Name индекс по выражению на самом деле, так что составный индекс не прокатывает. SELECT * FROM "Users" ORDER BY CAST(SUBSTRING(UPPER("Name") FROM 1 FOR 50) AS VARCHAR(50))) --, UPPER("AccountName")
Re: Глупый вопрос о сортировке
"sasha" ... А в "кое что ещё" небось опять куча варчаров, раздувающих сортировку на сотни мег ? Да дело не в том что там после, а в том что индекс не используется. Вопрос был об эффективности сортировки по ID + Name и по Name И к стати у нас вместо Name индекс по выражению на самом деле, так что составный индекс не прокатывает. Ты уверен, что тебе нужен ORDER через INDEX, а не ORDER через SORT ??? -- Хорсун Влад
Re: Глупый вопрос о сортировке
А почему ты решил, что сортировка по ID + Name будет хуже, чем сортировка по Name ? ORDER BY INDEX хорош только для выбора первых нескольких записей, для большого объёма выборки это очень плохо. У нас реальный запрос с сортировкой только по Name работает ~2.3 секунды, а запрос с сортировкой по Name + кое что ещё почти 12 секунд. И к стати у нас вместо Name индекс по выражению на самом деле, так что составный индекс не прокатывает.
Re: Глупый вопрос о сортировке
"sasha" ... А почему ты решил, что сортировка по ID + Name будет хуже, чем сортировка по Name ? ORDER BY INDEX хорош только для выбора первых нескольких записей, для большого объёма выборки это очень плохо. У нас реальный запрос с сортировкой только по Name работает ~2.3 секунды, а запрос с сортировкой по Name + кое что ещё почти 12 секунд. А в "кое что ещё" небось опять куча варчаров, раздувающих сортировку на сотни мег ? И к стати у нас вместо Name индекс по выражению на самом деле, так что составный индекс не прокатывает. Ни асилил. -- Хорсун Влад
Re: Глупый вопрос о сортировке
надо как-то объяснить серверу, за какую щеку он должен положить записи, отфетченные по ID, чтобы потом посортировать их по NAME Ясное дело, но как? берешь армянского коньяку и глинтвейна, садишься перед сервером и начинаешь уговаривать не поможет - скажи, что будешь пинать ногами. -- Булычев Алексей http://www.stella-npf.ru
Re: Глупый вопрос о сортировке
"sasha" ... надо как-то объяснить серверу, за какую щеку он должен положить записи, отфетченные по ID, чтобы потом посортировать их по NAME Ясное дело, но как? Никак. А почему ты решил, что сортировка по ID + Name будет хуже, чем сортировка по Name ? ORDER BY INDEX хорош только для выбора первых нескольких записей, для большого объёма выборки это очень плохо. -- Хорсун Влад
Re: Глупый вопрос о сортировке
надо как-то объяснить серверу, за какую щеку он должен положить записи, отфетченные по ID, чтобы потом посортировать их по NAME Ясное дело, но как?
Re: Глупый вопрос о сортировке
SELECT * FROM "Test" PLAN ("Test" ORDER "PK_Test") ORDER BY "Id", "Name" Как бы это сделать? надо как-то объяснить серверу, за какую щеку он должен положить записи, отфетченные по ID, чтобы потом посортировать их по NAME -- Булычев Алексей http://www.stella-npf.ru
Re: Глупый вопрос о сортировке
sasha wrote: Привет! Сабж: и вправду. -- Regards. Ded.