Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5 запрос MAX с группировкой / 25 сообщений из 48, страница 1 из 2
08.02.2018, 10:33
    #39598755
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Добрый день! Использую Firebird 2.5. Есть таблица (ID, TIMESTAMP, CLIENT_ID). Нужно выбрать максимальные TIMESTAMP с группировкой по CLIENT_ID. Простой запрос:

select client_id, max(timestamp) from tbl group by client_id

Проблема в том, что судя по анализатору, при выполнении такого запроса просматриваются все записи таблицы. Пробовал создавать различные индексы по client_id, timestamp в разных сочетаниях и сортировках. Подскажите, может как-то переделать этот запрос или еще какой способ..?
...
Рейтинг: 0 / 0
08.02.2018, 10:37
    #39598758
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C при выполнении такого запроса просматриваются все записи таблицы.
А что не так? Вы же ищете максимальные значения из всей таблицы.
...
Рейтинг: 0 / 0
08.02.2018, 10:39
    #39598760
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Мне кааца, что нужен индекс по убыванию по значениям ID и тайм-штампа
...
Рейтинг: 0 / 0
08.02.2018, 10:41
    #39598762
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
o_v_a,

пробовал, всё равно извлекает все записи
...
Рейтинг: 0 / 0
08.02.2018, 10:43
    #39598767
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
SQL2008,

если, например, сделать просто select max(timestamp) from tbl, то потребуется чтение одной записи по индексу timestamp. Хотя максимум по всей таблице
...
Рейтинг: 0 / 0
08.02.2018, 10:50
    #39598773
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

Ваши претензии не понятны. У Вас же нет фильтра. Значит все записи просматриваются. И индексы не причём.
...
Рейтинг: 0 / 0
08.02.2018, 11:01
    #39598783
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
KreatorXXI,

возможно, вы правы. Но может этот запрос записать как-то по-другому?
Вот если я пишу select max(timestamp) from tbl where client_id=1, то он отрабатывает за одно чтение.
Если у меня сто клиентов, то,теоретически, требуется сто чтений.
...
Рейтинг: 0 / 0
08.02.2018, 11:05
    #39598788
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

и что? 100 это много?
...
Рейтинг: 0 / 0
08.02.2018, 11:11
    #39598796
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr Cвозможно, вы правы. Но может этот запрос записать как-то по-другому?
не "возможно", а он прав. Если вы перебираете все элементы множества, то самым эффективным будет НЕ использование индекса в данном случае. Потому что если сюда присунуть индекс, чтения из него будут лишними.
Индекс имеет смысл только если выбирается часть записей из таблицы.
Соответственно, этот запрос "по другому" в данном случае переписывать нет никакого смысла.
...
Рейтинг: 0 / 0
08.02.2018, 11:25
    #39598810
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C Вот если я пишу select max(timestamp) from tbl where client_id=1, то он отрабатывает за одно чтение.
Если у меня сто клиентов, то,теоретически, требуется сто чтений.
Я понял чего вам хочется :)
Мы можете так сделать, но только в случае когда вам точно известно ваше максимальное значение timestamp!
Поставьте на это поле индекс и будет вам счастье.

В вашем примере вы точно знаете какой client_id вам нужен. От этого он и читает только одну запись.
А вот если сделаете
Код: sql
1.
select max(client_id) from tbl


то получите тот же самый full scan table
...
Рейтинг: 0 / 0
08.02.2018, 11:27
    #39598814
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
kdv,

Хорошо. Согласен. Забудем про этот запрос. Подскажите, как извлечь максимумы timestamp по каждому клиенту? Делать по одному запросу на каждого клиента? Это работает, при этом будет число чтений, соответствующих числу клиентов, что очень даже быстро. Но неужели нельзя сделать эту выборку одним запросом?
...
Рейтинг: 0 / 0
08.02.2018, 11:34
    #39598821
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C Подскажите, как извлечь максимумы timestamp по каждому клиенту?
Если без перебора всех значений, то только научив БД экстрасенсорным способностям.
Не верите?
Попробуйте вытащить из мешка картошки самую тяжелую картофелину без перебора всех остальных.
...
Рейтинг: 0 / 0
08.02.2018, 11:37
    #39598823
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

какую-то вы фигню пишите про чтения. Давай сюда реальную статистику и план для запроса
Код: sql
1.
select client_id, max(timestamp) from tbl group by client_id
...
Рейтинг: 0 / 0
08.02.2018, 11:38
    #39598825
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
SQL2008Alexandr C Подскажите, как извлечь максимумы timestamp по каждому клиенту?
Если без перебора всех значений, то только научив БД экстрасенсорным способностям.
Не верите?
Попробуйте вытащить из мешка картошки самую тяжелую картофелину без перебора всех остальных.

Ну, например, select max(timestamp) from tbl выполняется за одно чтение.
Не верите?
...
Рейтинг: 0 / 0
08.02.2018, 11:39
    #39598826
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

Попробуйте через вторую таблицу "Клиентов", типа:
Код: sql
1.
2.
3.
4.
5.
6.
select a.id,
         ( select max(timestamp)
           from tbl b
           where b.client_id=a.id
         )
from clients a


Назвать поле "timestamp" тоже сильный ход.
...
Рейтинг: 0 / 0
08.02.2018, 11:47
    #39598836
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr CSQL2008пропущено...

Если без перебора всех значений, то только научив БД экстрасенсорным способностям.
Не верите?
Попробуйте вытащить из мешка картошки самую тяжелую картофелину без перебора всех остальных.

Ну, например, select max(timestamp) from tbl выполняется за одно чтение.
Не верите?
Не верю.
...
Рейтинг: 0 / 0
08.02.2018, 11:47
    #39598837
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
KreatorXXIAlexandr C,

Попробуйте через вторую таблицу "Клиентов", типа:
Код: sql
1.
2.
3.
4.
5.
6.
select a.id,
         ( select max(timestamp)
           from tbl b
           where b.client_id=a.id
         )
from clients a


Назвать поле "timestamp" тоже сильный ход.

timestamp - это не реальное имя столбца. Просто чтобы понимали, о чем речь.
Спасибо. Сейчас попробую.
...
Рейтинг: 0 / 0
08.02.2018, 12:02
    #39598847
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
KreatorXXIAlexandr C,

Попробуйте через вторую таблицу "Клиентов", типа:
Код: sql
1.
2.
3.
4.
5.
6.
select a.id,
         ( select max(timestamp)
           from tbl b
           where b.client_id=a.id
         )
from clients a


Назвать поле "timestamp" тоже сильный ход.

Огромное Вам спасибо! Это то, что нужно!
...
Рейтинг: 0 / 0
08.02.2018, 12:59
    #39598902
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Симонов ДенисAlexandr C,

какую-то вы фигню пишите про чтения. Давай сюда реальную статистику и план для запроса
Код: sql
1.
select client_id, max(timestamp) from tbl group by client_id



Прилагаю скриншот. Посмотрите. Может можно с этим что-нибудь сделать.
...
Рейтинг: 0 / 0
08.02.2018, 13:04
    #39598909
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

а текст скопировать никак? Обязательно надо скриншотами бомбардировать?
...
Рейтинг: 0 / 0
08.02.2018, 13:13
    #39598916
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Симонов ДенисAlexandr C,

а текст скопировать никак? Обязательно надо скриншотами бомбардировать?

Извините, я не знал что именно копировать. А исправлять свои сообщения можно? Я бы переделал.
...
Рейтинг: 0 / 0
08.02.2018, 13:14
    #39598918
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

Если есть время, можно поэкспериментировать так. Поставить явное условие "where", а в нём какую-нибудь фигню типа "client_id=client_id+0". Или всякую другую фигню. Типа планировщик при каком-то условии сменит план. Только принимать мои слова на веру не рекомендую.
...
Рейтинг: 0 / 0
08.02.2018, 13:22
    #39598930
Alexandr C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
KreatorXXI,

попробовал. всё тоже.
...
Рейтинг: 0 / 0
08.02.2018, 13:24
    #39598934
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
KreatorXXI,

не сменит
...
Рейтинг: 0 / 0
08.02.2018, 13:45
    #39598959
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5 запрос MAX с группировкой
Alexandr C,

а что не нравится-то? Запрос
select max(tstamp) from tbl group by client_id
имеет план, как видим
PLAN (TBL ORDER TBL_IDX3)

Это значит, что оптимизатор решает встать на индекс TBL_IDX3, ехать по ключам, перебирая все записи (раз условия фильтрации нет), и выдавая клиенту только max(tstamp) значения.
Эффект от плана TABLE ORDER INDEX известен - первые записи выдаются достаточно быстро, а дальше будут прыжки по страницам записей в поисках записей в соответствии с порядком ключей в индексе.
Так что, в том гриде надо бы еще нажать ctrl-end (или FetchAll) для получения верной картины.
Быстрее было бы прибить индекс TBL_IDX3, или написать group by client_id+0, чтобы было PLAN SORT...

http://www.ibase.ru/dataaccesspaths/
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5 запрос MAX с группировкой / 25 сообщений из 48, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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