|
Вопрос по функции 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 |
|
|
start [/forum/topic.php?fid=40&msg=39289734&tid=1562018]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 165ms |
0 / 0 |