|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Базу из FB2.1 перегнали в 3.0. Тестим и оптимизируем запросы. Поэтому вопрос скорее по FB3, хотя в других версиях аналогично. Есть таблица, есть первичный ключ. Запрос Код: sql 1.
, где id_rz - первичный ключ, в IBExpert'е фетчит все записи. Так должно быть? Или это баг/фича IBExpert'а? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 15:21 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXI, для того чтобы max использовал индекс этот индекс должен быть DESC[ENDING] ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 15:23 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIПоэтому вопрос скорее по FB3, хотя в других версиях аналогично. интересная логика. "скорее по ФБ3" у вас будет вопрос, если в других версиях - не аналогично. KreatorXXI в IBExpert'е фетчит все записи. фетч - это выборка записей на клиента. ИБЕ может фетчить, а может не фетчить, смотря какую кнопку нажать. Но в данном случае речь не про фетч, а про перебор записей на сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 15:28 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Т.е., я так понял, это нормальный механизм, индекс перебирается в одну сторону. Тогда вот такая реальная проблема. Есть таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Выполняю запрос: Код: sql 1. 2. 3.
или Код: sql 1. 2. 3. 4.
Всё работает, только есть "перепробег", слишком много переборов. Вопрос такой. Можно ли сделать индекс STAGE_IDX2 типа так: Код: sql 1.
? Или обойти эту проблему с помощью других механизмов. Именно к запросу не привязан, потому что код из хранимки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 16:02 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXI, а если попробовать и посмотреть? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 16:30 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Пожалуй, апну тему. Спецы, ау! Разработчики ФБ, ау! Поведение функции на индексированных полях неправильное. Не должен сервер перебирать все записи. Подозреваю, что min() работает также. Надо что-то делать. Причём срочно. Это первое. Второе. Что насчёт составных индексов с разным порядком сортировки полей? Есть надежда увидеть? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2016, 23:19 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
А недавно две газели Позвонили и запели: - Неужели В самом деле Все сгорели Карусели? - Ах, в уме ли вы, газели? Не сгорели карусели, И качели уцелели! Вы б, газели, не галдели, А на будущей неделе Прискакали бы и сели На качели-карусели! Но не слушали газели И по-прежнему галдели: - Неужели В самом деле Все качели Погорели? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2016, 23:24 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, Лучший ответ! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2016, 23:29 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIПоведение функции на индексированных полях неправильное. товарисч. читай langref на русском языке. можно по 2.5. KreatorXXIЧто насчёт составных индексов с разным порядком сортировки полей? Есть надежда увидеть? ахтунг детектед. сортировка индекса возможна либо только по всем полям asc, либо по всем полям desc. Так что, надежды нет, караул. p.s. что вы там курите? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 00:00 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
kdvтоварисч. читай langref на русском языке. можно по 2.5. А что там написано по этому делу? Это личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход. kdvахтунг детектед. сортировка индекса возможна либо только по всем полям asc, либо по всем полям desc. Так что, надежды нет, караул. А можете по-человечески, без стихов, объяснить почему это сделать невозможно. В других серверах возможно, а в FB невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 11:42 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIА можете по-человечески, без стихов, объяснить почему это сделать невозможно. В других серверах возможно, а в FB невозможно. Без стихов и в подробностях: http://www.ibase.ru/dataaccesspaths/ Осилишь многа букафф? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 12:27 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Ну, вообще-то, в том документе не указаны принципиальные причины, почему нельзя создать индекс f1 asc, f2 desc. Если бы это был какой-нибудь DBase в котором при создании индекса выражение склеивается в строку и сравнение идет уже по этой строке, то да - нет пути. А в FB есть сегментирование полей индекса, и теоретически можно сделать разные функции сравнения для каждого поля. И да, тот же оракул может f1 asc, f2 desc. И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам". Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикату. Да, это будет уже не бинарный поиск, а range scan, но тем не менее, он уменьшит чтение страниц с данными т.к. они будут выполняться только для C = 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 13:17 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Andrey_, читать надо внимательнее. Это статья не простая, одного раза бывает мало ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 13:25 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIЭто личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход. ага. вы там "оптимизируете" запросы, и при этом пытаетесь оптимизировать стыдобу типа max. Оптимизация, кстати, если серьезная, включает в себя и переработку метаданных. Для ускорения запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 13:52 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Andrey_И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам". Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикату. в общем случае из ключа нельзя получить обратно значение. Т.е. из найденных по первым двум предикатам составных ключей нельзя извлечь отдельно C и вычислить третий предикат. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 13:56 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
dimitr, но вычислить значение ключа по уже найденным "двум первым предикатам" и "c=0" - можно ведь? и сравнить, то найдено или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:08 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Симонов Денис На протяжении последних 8 лет я читал эту статью около 14 раз. Вдумчиво. Целиком. Возможно я и правду бесконечно туп и не понимаю элементарных вещей. dimitrAndrey_И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам". Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикату. в общем случае из ключа нельзя получить обратно значение. Т.е. из найденных по первым двум предикатам составных ключей нельзя извлечь отдельно C и вычислить третий предикат.Это как? Я понимаю в какой-нибудь инмемори-дб в индексе можно хранить не ключ, а ссылку на запись и из нее вычитывать значение. Но в FB, как минимум присутствует "префиксное сжатие ключей", что подразумевает возможность их "разжатия". Да и вы, или hvlad, недавно рассказывали про 5-байтовые сегменты в индексе. Ну ок, даже если нет возможности выделить предикат C, как минимум ключи в листовых элементах индекса (которые содержат всем предикаты) можно сравнить с искомым значением. А этого достаточно для продолжения скана по предикату C. Похоже Симонов Денис прав, а я бесконечно туп, но я досихпор не понимаю почему нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:20 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Andrey_И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам"Потому что текущий код этого не умеет. Andrey_Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикатуЭто далеко не так тривиально, как хотелось бы. Но - возможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:29 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Andrey_даже если нет возможности выделить предикат C, как минимум ключи в листовых элементах индекса (которые содержат всем предикаты) можно сравнить с искомым значением. А этого достаточно для продолжения скана по предикату C. Сравнение ключей делается одним вызовом функции memcmp(). Нет такой вещи как сравнение отдельных сегментов. Частичное сравнение - просто уменьшение третьего параметра этой функции. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:30 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Andrey_Но в FB, как минимум присутствует "префиксное сжатие ключей", что подразумевает возможность их "разжатия". да ты что. Сколько раз уже говорилось что для всего кроме CHAR/VARCHAR ключ хранится как double Andrey_Ну ок, даже если нет возможности выделить предикат C, как минимум ключи в листовых элементах индекса (которые содержат всем предикаты) можно сравнить с искомым значением. А этого достаточно для продолжения скана по предикату C. дык оно и так делается. Будет создана битовая маска по двум сегментам. Значения будут "отфильтрованы", а среди оставшихся будет перебор, но уже не по индексу. Правда уже навигации по индексу не будет. Но при определённых условиях это всё же будет лучше чем вообще без индекса. З.Ы. до сих пор пишется раздельно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:38 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
kdvKreatorXXIЭто личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход. ага. вы там "оптимизируете" запросы, и при этом пытаетесь оптимизировать стыдобу типа max. Оптимизация, кстати, если серьезная, включает в себя и переработку метаданных. Для ускорения запросов. Ну вот я и прошу подсказать путь, если не судьба поправить радикально. Очень много запросов типа "выдай последнюю дату по этому сотруднику, событию и т.д.", или "выдай то же самое, но для прошлого месяца". Когда всего 5-10 записей на сотрудника, ещё можно закрыть глаза. А когда 5-10 в месяц (не говорю в день), и сотрудников тысячи... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:55 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
hvladAndrey_Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикатуЭто далеко не так тривиально, как хотелось бы. Но - возможно.Охотно верю, что не тривиально. Но в FB уже реализованы гораздо более сложные вещи. Ну да ладно, всему свое время. Спасибо. Симонов Денисдык оно и так делается. Будет создана битовая маска по двум сегментам. Значения будут "отфильтрованы", а среди оставшихся будет перебор, но уже не по индексу. Правда уже навигации по индексу не будет. Но при определённых условиях это всё же будет лучше чем вообще без индекса. Я говорил про возможность index range scan для последнего предиката. И hvlad подтвердил, что это возможно. И оракл возможностью создания индексов f1 asc, f2 desc так же подтверждает, что это возможно. Симонов ДенисЗ.Ы. до сих пор пишется раздельноСпасибо, учту. Русский мне не родной язык. Dimitry SibiryakovСравнение ключей делается одним вызовом функции memcmp(). Нет такой вещи как сравнение отдельных сегментов. Частичное сравнение - просто уменьшение третьего параметра этой функции.А вот не понятно тогда как отличить значение ключа которое AKey > AParam and BKey > BParam от AKey = AParam and BKey > BParam. Или все таки сравнение делается для каждого предиката отдельно... Ладно, господа, спасибо, но я лучше полезу в сорцы. С ними коммуницировать мне как-то проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:58 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIНу вот я и прошу подсказать путь, если не судьба поправить радикальноDESC индекс чем не устраивает ? Есс-но с DESC в ORDER BY: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 14:59 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
hvladKreatorXXIНу вот я и прошу подсказать путь, если не судьба поправить радикальноDESC индекс чем не устраивает ? Есс-но с DESC в ORDER BY: Код: sql 1.
Да, так покатило. Спасибо! Видимо, придётся плодить дополнительные индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 17:25 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXI, зачем дополнительные ? PK вполне может быть DESC ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2016, 22:04 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
hvlad, дело не в PK. Первый пример так, для понимания что происходит. Есть составные индексы для поиска по дате, например. Из того, что я выяснил, получается, чтобы найти минимальную дату мне нужен индекс asc, а чтобы найти максимальную дату мне нужен индекс desc. Если используется конструкция between, то можно обойтись одним индексом. Но between не всегда нужен. Но, честно говоря, не очень понятно, почему нельзя "переместиться" в конец "таблицы индекса" и прочитать предыдущую запись, которая, условно говоря, и будет максимальной? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2016, 10:39 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIНо, честно говоря, не очень понятно, почему нельзя "переместиться" в конец "таблицы индекса" и прочитать предыдущую запись, которая, условно говоря, и будет максимальной? http://www.ibase.ru/dataaccesspaths/ ищи в документе слово MAX, оно несколько раз упоминается. Основное - раздел 1.2. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2016, 10:51 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
Видимо, вот это: авторПо сравнению с другими СУБД у индексов в Firebird есть еще одна особенность – сканирование индекса всегда однонаправленное, от меньших ключей к большим. Часто из-за этого индекс называют однонаправленным и говорят, что в его узле есть указатели только на следующий узел и нет указателя на предыдущий. На самом деле, проблема не в этом. Все структуры сервера Firebird спроектированы как свободные от взаимных блокировок (deadlock free), причем гарантируется минимальная возможная гранулярность блокировок, равная одной странице. Помимо этого, действует также правило "аккуратной" записи (careful write) страниц, служащее мгновенному восстановлению после сбоя. Проблема в двунаправленных индексах заключается в том, что они нарушают это правило при расщеплении страницы. На текущий момент неизвестен способ безблокировочной работы с двунаправленными указателями в случае, если одна из страниц должна быть записана строго перед другой. Примечание. На самом деле, варианты обхода этой проблемы существуют и они сейчас обсуждаются разработчиками . Данная особенность приводит к невозможности использования ASC-индекса для DESC-сортировки или вычисления MAX и наоборот, невозможности использования DESC-индекса для ASC-сортировки или вычисления MIN. Разумеется, сканированию индекса с целью поиска однонаправленность никак не мешает. Радует, что: a) Разработчики знают об этой проблеме, б) Разработчики обсуждают варианты обхода проблемы. Будем надеяться на скорый результат. Хорошо бы, конечно, вот такие узкие места отображать в руководстве по языку. Потому что у нас сплошь и рядом такая проблема, а проводить тщательный анализ производительности и потребности не было, да и ресурсов (Вот только когда пользователи поставили жёстко вопрос, мы начали шевелиться). Тем более, что в других СУБД всё по-другому. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2016, 14:36 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXIХорошо бы, конечно, вот такие узкие места отображать в руководстве по языку. Вопросы работы движка в целом и оптимизатора в частности никакого отношения к языку не имеют. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2016, 14:39 |
|
Вопрос по функции max.
|
|||
---|---|---|---|
#18+
KreatorXXI, http://www.ibase.ru/dataaccesspaths/ переносить в LR не имеет ни какого смысла. Тем не менее об однонаправленности индексов там упомянуто. З.Ы. Кстати ждём обещанного обновления статьи. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2016, 14:43 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1562018]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 165ms |
0 / 0 |