powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по функции max.
25 сообщений из 30, страница 1 из 2
Вопрос по функции max.
    #39285446
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Базу из FB2.1 перегнали в 3.0. Тестим и оптимизируем запросы. Поэтому вопрос скорее по FB3, хотя в других версиях аналогично.
Есть таблица, есть первичный ключ. Запрос
Код: sql
1.
select max(r.id_rz) from rz r

,
где id_rz - первичный ключ, в IBExpert'е фетчит все записи. Так должно быть? Или это баг/фича IBExpert'а?
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39285447
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

для того чтобы max использовал индекс этот индекс должен быть DESC[ENDING]
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39285458
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIПоэтому вопрос скорее по FB3, хотя в других версиях аналогично.
интересная логика. "скорее по ФБ3" у вас будет вопрос, если в других версиях - не аналогично.
KreatorXXI в IBExpert'е фетчит все записи.
фетч - это выборка записей на клиента. ИБЕ может фетчить, а может не фетчить, смотря какую кнопку нажать. Но в данном случае речь не про фетч, а про перебор записей на сервере.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39285519
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е., я так понял, это нормальный механизм, индекс перебирается в одну сторону. Тогда вот такая реальная проблема. Есть таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE STAGE (
    ID_STG   ID NOT NULL /* ID = INTEGER */,
    ID_SOTR  INTEGER NOT NULL,
    ID_SPR   INTEGER,
    ID_SPEC  INTEGER,
    ID_DOK   INTEGER,
    DATN     DATE,
    RAZR     NUMERIC(1,0),
    DATZ     DATE,
    USER_ID  INTEGER,
    ETYPE    NUMERIC(1,0)
);
CREATE UNIQUE INDEX STAGE_IDX2 ON STAGE (ID_SOTR, ETYPE, DATN);


Выполняю запрос:
Код: sql
1.
2.
3.
    select coalesce(max(t.datn),'1900-01-01')
    from stage t
    where t.id_sotr=5181 and t.etype=3 and t.datn<='2016-06-15'


или
Код: sql
1.
2.
3.
4.
    select first 1 t.id_sotr, t.etype, t.datn
    from stage t
    where t.id_sotr=5181 and t.etype=3 and t.datn<='2016-06-15'
    order by 1, 2, 3 desc


Всё работает, только есть "перепробег", слишком много переборов. Вопрос такой. Можно ли сделать индекс STAGE_IDX2 типа так:
Код: sql
1.
 (ID_SOTR asc, ETYPE asc, DATN desc)

?
Или обойти эту проблему с помощью других механизмов. Именно к запросу не привязан, потому что код из хранимки.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39285549
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

а если попробовать и посмотреть?
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289326
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй, апну тему.
Спецы, ау! Разработчики ФБ, ау!
Поведение функции на индексированных полях неправильное. Не должен сервер перебирать все записи. Подозреваю, что min() работает также. Надо что-то делать. Причём срочно.
Это первое. Второе. Что насчёт составных индексов с разным порядком сортировки полей? Есть надежда увидеть?
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289327
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А недавно две газели
Позвонили и запели:
- Неужели
В самом деле
Все сгорели
Карусели?

- Ах, в уме ли вы, газели?
Не сгорели карусели,
И качели уцелели!

Вы б, газели, не галдели,
А на будущей неделе
Прискакали бы и сели
На качели-карусели!

Но не слушали газели
И по-прежнему галдели:
- Неужели
В самом деле
Все качели
Погорели?
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289328
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,

Лучший ответ!
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289331
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIПоведение функции на индексированных полях неправильное.
товарисч. читай langref на русском языке. можно по 2.5.
KreatorXXIЧто насчёт составных индексов с разным порядком сортировки полей? Есть надежда увидеть?
ахтунг детектед. сортировка индекса возможна либо только по всем полям asc, либо по всем полям desc. Так что, надежды нет, караул.

p.s. что вы там курите?
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289528
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvтоварисч. читай langref на русском языке. можно по 2.5.
А что там написано по этому делу? Это личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход.
kdvахтунг детектед. сортировка индекса возможна либо только по всем полям asc, либо по всем полям desc. Так что, надежды нет, караул.
А можете по-человечески, без стихов, объяснить почему это сделать невозможно. В других серверах возможно, а в FB невозможно.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289572
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIА можете по-человечески, без стихов, объяснить почему это сделать невозможно. В других
серверах возможно, а в FB невозможно.

Без стихов и в подробностях: http://www.ibase.ru/dataaccesspaths/
Осилишь многа букафф?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289645
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Ну, вообще-то, в том документе не указаны принципиальные причины, почему нельзя создать индекс f1 asc, f2 desc. Если бы это был какой-нибудь DBase в котором при создании индекса выражение склеивается в строку и сравнение идет уже по этой строке, то да - нет пути. А в FB есть сегментирование полей индекса, и теоретически можно сделать разные функции сравнения для каждого поля.

И да, тот же оракул может f1 asc, f2 desc.

И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам". Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикату. Да, это будет уже не бинарный поиск, а range scan, но тем не менее, он уменьшит чтение страниц с данными т.к. они будут выполняться только для C = 0.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289659
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_,

читать надо внимательнее. Это статья не простая, одного раза бывает мало
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289695
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIЭто личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход.
ага. вы там "оптимизируете" запросы, и при этом пытаетесь оптимизировать стыдобу типа max. Оптимизация, кстати, если серьезная, включает в себя и переработку метаданных. Для ускорения запросов.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289697
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам". Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикату.
в общем случае из ключа нельзя получить обратно значение. Т.е. из найденных по первым двум предикатам составных ключей нельзя извлечь отдельно C и вычислить третий предикат.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289711
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

но вычислить значение ключа по уже найденным "двум первым предикатам" и "c=0" - можно ведь?

и сравнить, то найдено или нет.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289720
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
На протяжении последних 8 лет я читал эту статью около 14 раз. Вдумчиво. Целиком. Возможно я и правду бесконечно туп и не понимаю элементарных вещей.

dimitrAndrey_И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам". Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикату.
в общем случае из ключа нельзя получить обратно значение. Т.е. из найденных по первым двум предикатам составных ключей нельзя извлечь отдельно C и вычислить третий предикат.Это как? Я понимаю в какой-нибудь инмемори-дб в индексе можно хранить не ключ, а ссылку на запись и из нее вычитывать значение. Но в FB, как минимум присутствует "префиксное сжатие ключей", что подразумевает возможность их "разжатия". Да и вы, или hvlad, недавно рассказывали про 5-байтовые сегменты в индексе.
Ну ок, даже если нет возможности выделить предикат C, как минимум ключи в листовых элементах индекса (которые содержат всем предикаты) можно сравнить с искомым значением. А этого достаточно для продолжения скана по предикату C.

Похоже Симонов Денис прав, а я бесконечно туп, но я досихпор не понимаю почему нет.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289734
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_И кстати, из той статьи всегда интересовало почему "предикат (A = 0 and B > 0 and C = 0) приведет к частичному совпадению по двум сегментам"Потому что текущий код этого не умеет.

Andrey_Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикатуЭто далеко не так тривиально, как хотелось бы.
Но - возможно.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289735
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_даже если нет возможности выделить предикат C, как минимум ключи в листовых элементах
индекса (которые содержат всем предикаты) можно сравнить с искомым значением. А этого
достаточно для продолжения скана по предикату C.
Сравнение ключей делается одним вызовом функции memcmp(). Нет такой вещи как сравнение
отдельных сегментов. Частичное сравнение - просто уменьшение третьего параметра этой функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289742
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_Но в FB, как минимум присутствует "префиксное сжатие ключей", что подразумевает возможность их "разжатия".

да ты что. Сколько раз уже говорилось что для всего кроме CHAR/VARCHAR ключ хранится как double

Andrey_Ну ок, даже если нет возможности выделить предикат C, как минимум ключи в листовых элементах индекса (которые содержат всем предикаты) можно сравнить с искомым значением. А этого достаточно для продолжения скана по предикату C.

дык оно и так делается. Будет создана битовая маска по двум сегментам. Значения будут "отфильтрованы", а среди оставшихся будет перебор, но уже не по индексу. Правда уже навигации по индексу не будет. Но при определённых условиях это всё же будет лучше чем вообще без индекса.

З.Ы. до сих пор пишется раздельно
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289761
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvKreatorXXIЭто личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход.
ага. вы там "оптимизируете" запросы, и при этом пытаетесь оптимизировать стыдобу типа max. Оптимизация, кстати, если серьезная, включает в себя и переработку метаданных. Для ускорения запросов.
Ну вот я и прошу подсказать путь, если не судьба поправить радикально. Очень много запросов типа "выдай последнюю дату по этому сотруднику, событию и т.д.", или "выдай то же самое, но для прошлого месяца". Когда всего 5-10 записей на сотрудника, ещё можно закрыть глаза. А когда 5-10 в месяц (не говорю в день), и сотрудников тысячи...
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289767
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladAndrey_Ведь ничего не мешает после нахождения первого ключа по первым двум предикатам продолжить скан индекса по третьему предикатуЭто далеко не так тривиально, как хотелось бы.
Но - возможно.Охотно верю, что не тривиально. Но в FB уже реализованы гораздо более сложные вещи. Ну да ладно, всему свое время. Спасибо.

Симонов Денисдык оно и так делается. Будет создана битовая маска по двум сегментам. Значения будут "отфильтрованы", а среди оставшихся будет перебор, но уже не по индексу. Правда уже навигации по индексу не будет. Но при определённых условиях это всё же будет лучше чем вообще без индекса. Я говорил про возможность index range scan для последнего предиката. И hvlad подтвердил, что это возможно. И оракл возможностью создания индексов f1 asc, f2 desc так же подтверждает, что это возможно.

Симонов ДенисЗ.Ы. до сих пор пишется раздельноСпасибо, учту. Русский мне не родной язык.

Dimitry SibiryakovСравнение ключей делается одним вызовом функции memcmp(). Нет такой вещи как сравнение
отдельных сегментов. Частичное сравнение - просто уменьшение третьего параметра этой функции.А вот не понятно тогда как отличить значение ключа которое AKey > AParam and BKey > BParam от AKey = AParam and BKey > BParam. Или все таки сравнение делается для каждого предиката отдельно...

Ладно, господа, спасибо, но я лучше полезу в сорцы. С ними коммуницировать мне как-то проще.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289768
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIНу вот я и прошу подсказать путь, если не судьба поправить радикальноDESC индекс чем не устраивает ? Есс-но с DESC в ORDER BY:
Код: sql
1.
order by 1 desc, 2 desc, 3 desc
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39289896
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladKreatorXXIНу вот я и прошу подсказать путь, если не судьба поправить радикальноDESC индекс чем не устраивает ? Есс-но с DESC в ORDER BY:
Код: sql
1.
order by 1 desc, 2 desc, 3 desc


Да, так покатило. Спасибо! Видимо, придётся плодить дополнительные индексы.
...
Рейтинг: 0 / 0
Вопрос по функции max.
    #39290040
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

зачем дополнительные ? PK вполне может быть DESC
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по функции max.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]