Patrice T
Даже если я не практикую SQL, у меня достаточно опыта, чтобы увидеть очень плохой дизайн, чего следует избегать любой ценой.
- Потому что ты пользуешься current_datetime()
2 раза вы можете быть несчастливы и иметь их в другую минуту, час или День, которые молча сделают запрос на другой промежуток времени, чем ожидалось.
- Если компилятор SQL не может понять, что вы хотите, чтобы 2 границы были постоянными (что не указано) в запросе, он выдаст 2 current_datetime()
за запись, потому что current_datetime()
это изменчиво. И не очень хорошо.
- Если компилятор SQL не может удалить DateTime()
от DateTime(A.Timestamp)
, сервер не сможет использовать индекс.
Правильный способ сделать это таков:
-- declare the 2 variables with same datatype as A.Timestamp
declare @start datetime;
declare @End datetime;
declare @DT datetime = current_datetime(); -- read current_datetime() once
-- set start and End values
set @Start = @DT - ... ; -- cancel seconds, minutes and hours as needed
set @End = @Start + ... ; -- add offset as needed
Select A.ID, A.Timestamp, B.Package_quantity,
safe_add(A.Package_quantity, B.Package_quantity) as defect,
from
`tbl_ER020` A
INNER JOIN `tbl_ER220` B
ON A.ID = B.ID
where @Start <= A.Timestamp And A.Timestamp < @End
ORDER BY A.Timestamp ASC;
Зачем делать запрос таким образом?
Время выполнения запроса зависит от количества записей datatable.
Время выполнения моего запроса зависит от количества записей выбранного результата.
На огромной базе данных это имеет большое значение.
[Обновление]
Читать там:
PostgreSQL: Документация: 9.1: Категории Волатильности Функций[
^]
Цитата:
Изменчивая функция может делать все, что угодно, включая изменение базы данных. Он может возвращать различные результаты при последовательных вызовах с одними и теми же аргументами. Оптимизатор не делает никаких предположений о поведении таких функций. Запрос, использующий изменчивую функцию, будет повторно оценивать функцию в каждой строке, где требуется ее значение.
ZurdoDev
"2 current_datetime() на запись" - я не думаю, что эта часть правильна. Sql обрабатывает операторы как набор и поэтому все записи в наборе будут получать одно и то же время даже при использовании current_datetime()
ZurdoDev
Это для postgre sql. Я имел в виду Ms Sql. Я не мог сказать от ОП, какая это была версия. И я все еще не уверен, что это означает то, что ты думаешь. Хотя, может быть.
Например,
Выберите t.*, current_datetime()
От anytable t
Меняется ли последняя колонка? Или все записи в результирующем наборе имеют одинаковую отметку времени?
Patrice T
Много SQL-серверов, много возможностей.
Вам просто нужно запустить запрос в большой базе данных, чтобы получить ответ.
Просто убедитесь, что запрос выполняется в течение нескольких секунд.