powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5 запрос MAX с группировкой
25 сообщений из 48, страница 1 из 2
Firebird 2.5 запрос MAX с группировкой
    #39598755
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Использую 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
Firebird 2.5 запрос MAX с группировкой
    #39598758
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr C при выполнении такого запроса просматриваются все записи таблицы.
А что не так? Вы же ищете максимальные значения из всей таблицы.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598760
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кааца, что нужен индекс по убыванию по значениям ID и тайм-штампа
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598762
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
o_v_a,

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

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

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

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

и что? 100 это много?
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598796
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr Cвозможно, вы правы. Но может этот запрос записать как-то по-другому?
не "возможно", а он прав. Если вы перебираете все элементы множества, то самым эффективным будет НЕ использование индекса в данном случае. Потому что если сюда присунуть индекс, чтения из него будут лишними.
Индекс имеет смысл только если выбирается часть записей из таблицы.
Соответственно, этот запрос "по другому" в данном случае переписывать нет никакого смысла.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598810
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Firebird 2.5 запрос MAX с группировкой
    #39598814
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

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

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

Ну, например, select max(timestamp) from tbl выполняется за одно чтение.
Не верите?
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598826
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Firebird 2.5 запрос MAX с группировкой
    #39598836
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr CSQL2008пропущено...

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

Ну, например, select max(timestamp) from tbl выполняется за одно чтение.
Не верите?
Не верю.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598837
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Firebird 2.5 запрос MAX с группировкой
    #39598847
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Firebird 2.5 запрос MAX с группировкой
    #39598902
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисAlexandr C,

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



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

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

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

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

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

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

не сменит
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598959
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 48, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5 запрос MAX с группировкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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