powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / first 1 desc или max(id) - как лучше?
25 сообщений из 30, страница 1 из 2
first 1 desc или max(id) - как лучше?
    #40052375
Фотография descent52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток))

Имеем, Firebird 2.5

Умудрённые опытом, подскажите, как лучше и что быстрее в процедуре использовать:

Код: sql
1.
2.
3.
select first 1 mID from table1 where ExtractDate(FieldDate)<='today' order by FieldDate desc into m_ID;
или
select max(mID) from table1 where FieldDate<='today' into m_ID;


поле FieldDate дата со временем.

в IBExpert в анализаторе показывает, что время меньше без ExtractDate.

Спасибо))
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052379
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52,

1. не используй литерал today без явного преобразования через cast
2. не используй UDF, если на то нет веских причин. ExtractDate - это 100% UDF
3. Запросы не эквивалентны по результату
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052380
Фотография descent52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
результат то, как раз, один и тот же))
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052382
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52,

это не более чем везение
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052383
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52
Симонов Денис,
результат то, как раз, один и тот же))
Это случайно. Второй запрос выбирает максимальный айдишник, а первый - айдишник с одной из максимальных дат.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052385
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
descent52,

это не более чем везение
Я бы сказал - невезение. Ведь теперь может пойти в работу неверная логика.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052386
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52,
Хотя бы знать DDL таблицы, индексы и пр.
Для чего вам понадобился это максимальное значение?
- Быстрее всего дергать значение генератора, а если нет - использовать индексы.

Удачи !
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052388
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp
- Быстрее всего дергать значение генератора, а если нет - использовать индексы.
Ещё быстрее - ничего не делать.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052392
Фотография descent52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select first 1 mID from table1 where ExtractDate(FieldDate)<=cast('today' as date) order by FieldDate desc into m_ID;
или
select max(mID) from table1 where FieldDate<=cast('today' as date) into m_ID;



первый вариант выполнения 1мин 3 сек
второй вариант 59 сек
волшебный cast ))))
Спасибо Денис.
счас попробую без today

про разный результат mID - спасибо!!!
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052394
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52,

ещё раз повторяю. Запросы возвращают не эквивалентный результат!!!
То что у вас он оказался эквивалентным просто совпадение. Завтра всё может изменится.
Вы уж решите что именно вам надо получить. Хотя бы задачу опишите и вам подскажут какой запрос использовать
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052395
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52,

Попробуйте поюзать current_date, current_timestamp.


Удачи!
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052397
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp,

а смысл? ТС даже не знает что хочет в результате получить, раз пишет два разных по смыслу запроса и спрашивает какой быстрее
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052398
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

если предположить, что FieldDate неизменяемая дата/время ввода записи, а mID первичный ключ (классический, скажем так), то результат в принципе одинаков. Но я обычно в таких случаях на дату ориентируюсь, она как бы очевидная величина. И опять же первичный ключ особо не изменишь, а дату/время запросто.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052417
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получение одной записи за минуту, без группировок и прочих выкрутасов - это феерический трындец.
Индексы в таблицах курят в сторонке и в работе явно не участвуют.

Завидую автору, у него свехтерпеливые пользователи.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052423
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЗапросы не эквивалентны по результату
вообще, на первый глаз, запросы с точки зрения оптимизатора идентичны. И разница по времени только в том, что гражданин первый запрос выполнял на "сыром кэше". Выполнял бы замеры по второму повтору - было бы одинаково.
Другое дело, что если бы был индекс "by FieldDate desc" (или даже asc), там бы было всё "не так однозначно" из-за udf.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052439
Фотография descent52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оооо, kdv, всех благ)))

выполнил запрос, закрыл соединение. Открыл соединение - выполнил второй запрос.
попробую индекс на desc, отпишусь (пока без него делал)))
а пока что, при прочих равных, select first 1... desc по времени проигрывает select max().

а пока, слушайте Симонова Денис - поменьше юзайте UDF-ки )))
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052448
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52,


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
create table table1 (
  mID int not null,
  FieldDate timestamp not NULL, 
  constraint pk_t1 primary key(mID)
);


set term ^;

execute block
as
  declare i int = 0;
  declare d timestamp;
begin
  d = dateadd(-1000 day to localtimestamp);
  while (i < 10000000) do
  begin
    i = i + 1;
    insert into table1(mID, FieldDate)
    values(:i, :d + :i/10000);
  end
end^

set term ;^

commit;


create descending index IDX_table1_date on table1(FieldDate);



вот попробуй.

Код: sql
1.
select first 1 mID from table1 where FieldDate <= current_date order by FieldDate desc



Без индекса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN (TABLE1 NATURAL)

------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 36s 812ms
Среднее время на получение одной записи = 36 812,00 ms
Current memory = 147 582 160
Max memory = 151 271 824
Memory buffers = 16 384
Reads from disk to cache = 78 171
Writes from cache to disk = 1
Чтений из кэша = 10 312 551

с индексом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN (TABLE1 ORDER IDX_TABLE1_DATE)

------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 0ms
Среднее время на получение одной записи = 0,00 ms
Current memory = 147 632 032
Max memory = 686 567 328
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 13

Но это хорошо работает только в 3.0/4.0. Не уверен что хоть как то поможет в 2.5

З.Ы. Именно в моём сценарии заполнения запросы дают разный результат
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052449
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Но это хорошо работает только в 3.0/4.0. Не уверен что хоть как то поможет в 2.5
Почему? Такой запрос и в 1.0 работал бы мгновенно.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052450
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

потому что в 2.0-2.5 этот запрос даст другой план.

PLAN (TABLE1 ORDER IDX_TABLE1_DATE INDEX (IDX_TABLE1_DATE))

Там было кое что сломано.

В прочем в случае ТС можно сделать вот так

Код: sql
1.
select first 1 mID from table1 where FieldDate+0 <= current_date order by FieldDate desc



фильтр по FieldDate всё равно не селективен
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052457
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
descent52выполнил запрос, закрыл соединение. Открыл соединение - выполнил второй запрос.
я извиняюсь, но это онанизм называется. "закрыл соединение" - вырубил кэш базы, открыл соединение, опять кэш создал.
Запросы надо выполнять ДВА РАЗА подряд, в одном соединении. Чтобы было понятно - первый запрос без кэша, кэш наполняется из БД, второй запрос использует кэш, часть читается из кэша, другая часть (если не влезло в кэш) - с диска.
И в любом случае первый запрос вызывает наполнение файлового кэша ОС, поэтому даже если "коннект-дисконнект" - всё равно для разных запросов это не измерение. Только для одного и того же запроса.

p.s. казалось бы, за прошедшие 20 лет можно было бы выучить специфику операционных систем и кэширования файлов.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052466
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky

Завидую автору, у него свехтерпеливые пользователи.


Сдаётся мне, это была комедия там пользователями пока и не пахнет, это скорее исследование классической темы - кто сильнее, кит или слон. Поскольку результат не важен, а интересует сам процесс.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052467
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
YuRock,

потому что в 2.0-2.5 этот запрос даст другой план.

PLAN (TABLE1 ORDER IDX_TABLE1_DATE INDEX (IDX_TABLE1_DATE))

Там было кое что сломано.

В прочем в случае ТС можно сделать вот так

Код: sql
1.
select first 1 mID from table1 where FieldDate+0 <= current_date order by FieldDate desc




фильтр по FieldDate всё равно не селективен
Странно. На 1.0, 1.5 и 2.1 всегда использовал подобные запросы (без +0), и план всегда был идеальным вроде бы.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052498
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка,

Сам процесс - это конечно да.. Правильно Дима сказал - рукоблудие....
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052503
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
Симонов Денис,
если предположить, что FieldDate неизменяемая дата/время ввода записи, а mID первичный ключ (классический, скажем так), то результат в принципе одинаков.


На прошлой неделе разбирался, откуда у меня в в БД логах записи с датой-временем того периода который я уже выгружал и удалял.
Дата-время заполняется триггером.

В итоге, глядя на ID и порывшись в записях, вспомнил, что на том сервере у нас в позапрошлом году дохла мама, со сбросом часов, вот логгер и брал некое дефолтное время через current_date.
Так что, лучше смотреть одновременно и на date и на ID, в некоторых случаях может помочь диагностировать проблему или разобраться в порядке следования событий, несмотря на поломанную дату.
...
Рейтинг: 0 / 0
first 1 desc или max(id) - как лучше?
    #40052527
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
быстрее будет
Код: sql
1.
select 1 from rdb$database
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / first 1 desc или max(id) - как лучше?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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