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

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

для того чтобы max использовал индекс этот индекс должен быть DESC[ENDING]
...
Рейтинг: 0 / 0
03.08.2016, 15:28
    #39285458
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
KreatorXXIПоэтому вопрос скорее по FB3, хотя в других версиях аналогично.
интересная логика. "скорее по ФБ3" у вас будет вопрос, если в других версиях - не аналогично.
KreatorXXI в IBExpert'е фетчит все записи.
фетч - это выборка записей на клиента. ИБЕ может фетчить, а может не фетчить, смотря какую кнопку нажать. Но в данном случае речь не про фетч, а про перебор записей на сервере.
...
Рейтинг: 0 / 0
03.08.2016, 16:02
    #39285519
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
Т.е., я так понял, это нормальный механизм, индекс перебирается в одну сторону. Тогда вот такая реальная проблема. Есть таблица:
Код: 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
03.08.2016, 16:30
    #39285549
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
KreatorXXI,

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

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

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

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

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

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

Без стихов и в подробностях: http://www.ibase.ru/dataaccesspaths/
Осилишь многа букафф?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2016, 13:17
    #39289645
Andrey_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
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
10.08.2016, 13:25
    #39289659
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
Andrey_,

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

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

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

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

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

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

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

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

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

З.Ы. до сих пор пишется раздельно
...
Рейтинг: 0 / 0
10.08.2016, 14:55
    #39289761
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
kdvKreatorXXIЭто личное дело сервака - как обрабатывать функцию. Вот он неправильно обрабатывает. Это не ошибка, нет. Надо просто изменить подход.
ага. вы там "оптимизируете" запросы, и при этом пытаетесь оптимизировать стыдобу типа max. Оптимизация, кстати, если серьезная, включает в себя и переработку метаданных. Для ускорения запросов.
Ну вот я и прошу подсказать путь, если не судьба поправить радикально. Очень много запросов типа "выдай последнюю дату по этому сотруднику, событию и т.д.", или "выдай то же самое, но для прошлого месяца". Когда всего 5-10 записей на сотрудника, ещё можно закрыть глаза. А когда 5-10 в месяц (не говорю в день), и сотрудников тысячи...
...
Рейтинг: 0 / 0
10.08.2016, 14:58
    #39289767
Andrey_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
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
10.08.2016, 14:59
    #39289768
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
KreatorXXIНу вот я и прошу подсказать путь, если не судьба поправить радикальноDESC индекс чем не устраивает ? Есс-но с DESC в ORDER BY:
Код: sql
1.
order by 1 desc, 2 desc, 3 desc
...
Рейтинг: 0 / 0
10.08.2016, 17:25
    #39289896
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по функции max.
hvladKreatorXXIНу вот я и прошу подсказать путь, если не судьба поправить радикальноDESC индекс чем не устраивает ? Есс-но с DESC в ORDER BY:
Код: sql
1.
order by 1 desc, 2 desc, 3 desc


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

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


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