|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Добрый день! Использую Firebird 2.5. Есть таблица (ID, TIMESTAMP, CLIENT_ID). Нужно выбрать максимальные TIMESTAMP с группировкой по CLIENT_ID. Простой запрос: select client_id, max(timestamp) from tbl group by client_id Проблема в том, что судя по анализатору, при выполнении такого запроса просматриваются все записи таблицы. Пробовал создавать различные индексы по client_id, timestamp в разных сочетаниях и сортировках. Подскажите, может как-то переделать этот запрос или еще какой способ..? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 10:33 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C при выполнении такого запроса просматриваются все записи таблицы. А что не так? Вы же ищете максимальные значения из всей таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 10:37 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Мне кааца, что нужен индекс по убыванию по значениям ID и тайм-штампа ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 10:39 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
o_v_a, пробовал, всё равно извлекает все записи ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 10:41 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
SQL2008, если, например, сделать просто select max(timestamp) from tbl, то потребуется чтение одной записи по индексу timestamp. Хотя максимум по всей таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 10:43 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C, Ваши претензии не понятны. У Вас же нет фильтра. Значит все записи просматриваются. И индексы не причём. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 10:50 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
KreatorXXI, возможно, вы правы. Но может этот запрос записать как-то по-другому? Вот если я пишу select max(timestamp) from tbl where client_id=1, то он отрабатывает за одно чтение. Если у меня сто клиентов, то,теоретически, требуется сто чтений. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:01 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C, и что? 100 это много? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:05 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr Cвозможно, вы правы. Но может этот запрос записать как-то по-другому? не "возможно", а он прав. Если вы перебираете все элементы множества, то самым эффективным будет НЕ использование индекса в данном случае. Потому что если сюда присунуть индекс, чтения из него будут лишними. Индекс имеет смысл только если выбирается часть записей из таблицы. Соответственно, этот запрос "по другому" в данном случае переписывать нет никакого смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:11 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C Вот если я пишу select max(timestamp) from tbl where client_id=1, то он отрабатывает за одно чтение. Если у меня сто клиентов, то,теоретически, требуется сто чтений. Я понял чего вам хочется :) Мы можете так сделать, но только в случае когда вам точно известно ваше максимальное значение timestamp! Поставьте на это поле индекс и будет вам счастье. В вашем примере вы точно знаете какой client_id вам нужен. От этого он и читает только одну запись. А вот если сделаете Код: sql 1.
то получите тот же самый full scan table ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:25 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
kdv, Хорошо. Согласен. Забудем про этот запрос. Подскажите, как извлечь максимумы timestamp по каждому клиенту? Делать по одному запросу на каждого клиента? Это работает, при этом будет число чтений, соответствующих числу клиентов, что очень даже быстро. Но неужели нельзя сделать эту выборку одним запросом? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:27 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C Подскажите, как извлечь максимумы timestamp по каждому клиенту? Если без перебора всех значений, то только научив БД экстрасенсорным способностям. Не верите? Попробуйте вытащить из мешка картошки самую тяжелую картофелину без перебора всех остальных. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:34 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C, какую-то вы фигню пишите про чтения. Давай сюда реальную статистику и план для запроса Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:37 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
SQL2008Alexandr C Подскажите, как извлечь максимумы timestamp по каждому клиенту? Если без перебора всех значений, то только научив БД экстрасенсорным способностям. Не верите? Попробуйте вытащить из мешка картошки самую тяжелую картофелину без перебора всех остальных. Ну, например, select max(timestamp) from tbl выполняется за одно чтение. Не верите? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:38 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C, Попробуйте через вторую таблицу "Клиентов", типа: Код: sql 1. 2. 3. 4. 5. 6.
Назвать поле "timestamp" тоже сильный ход. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:39 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr CSQL2008пропущено... Если без перебора всех значений, то только научив БД экстрасенсорным способностям. Не верите? Попробуйте вытащить из мешка картошки самую тяжелую картофелину без перебора всех остальных. Ну, например, select max(timestamp) from tbl выполняется за одно чтение. Не верите? Не верю. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:47 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
KreatorXXIAlexandr C, Попробуйте через вторую таблицу "Клиентов", типа: Код: sql 1. 2. 3. 4. 5. 6.
Назвать поле "timestamp" тоже сильный ход. timestamp - это не реальное имя столбца. Просто чтобы понимали, о чем речь. Спасибо. Сейчас попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 11:47 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
KreatorXXIAlexandr C, Попробуйте через вторую таблицу "Клиентов", типа: Код: sql 1. 2. 3. 4. 5. 6.
Назвать поле "timestamp" тоже сильный ход. Огромное Вам спасибо! Это то, что нужно! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 12:02 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Симонов ДенисAlexandr C, какую-то вы фигню пишите про чтения. Давай сюда реальную статистику и план для запроса Код: sql 1.
Прилагаю скриншот. Посмотрите. Может можно с этим что-нибудь сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 12:59 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C, а текст скопировать никак? Обязательно надо скриншотами бомбардировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 13:04 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Симонов ДенисAlexandr C, а текст скопировать никак? Обязательно надо скриншотами бомбардировать? Извините, я не знал что именно копировать. А исправлять свои сообщения можно? Я бы переделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 13:13 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
Alexandr C, Если есть время, можно поэкспериментировать так. Поставить явное условие "where", а в нём какую-нибудь фигню типа "client_id=client_id+0". Или всякую другую фигню. Типа планировщик при каком-то условии сменит план. Только принимать мои слова на веру не рекомендую. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 13:14 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
KreatorXXI, попробовал. всё тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 13:22 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
KreatorXXI, не сменит ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 13:24 |
|
Firebird 2.5 запрос MAX с группировкой
|
|||
---|---|---|---|
#18+
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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 13:45 |
|
|
start [/forum/topic.php?fid=40&fpage=37&tid=1561245]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 9ms |
total: | 148ms |
0 / 0 |