Встроенный SQL в производительности RPGLE в обновлении - PullRequest
0 голосов
/ 11 марта 2019

При обновлении полей даты / времени в файле с использованием встроенного SQL в программе RPGLE я могу использовать либо CURRENT_DATE / CURRENT_TIME, либо сохранить текущее значение даты / времени в переменной хоста. И используйте этот хост для назначения.

Теперь мне интересно, какой путь быстрее? Или это не имеет значения?

exec sql
  update testpf
  set t1date = CURRENT_DATE, t1time = CURRENT_TIME
  where t1key = someValue;

или

dcl-s date date;
dcl-s time time;
exec sql
  set :date = CURRENT_DATE;
exec sql
  set :time = CURRENT_TIME;
exec sql
  update testpf
  set t1date = :date, t1time = :time
  where t1key = someValue;

Примечание: это все написано "на лету"! Но я надеюсь, вы понимаете, что я имею в виду

Редактировать: чтобы уточнить, цель состоит не в том, чтобы обновить только одну строку, а в несколько обновлений. Как наличие базы данных с позициями счета и полем состояния. Это поле состояния имеет 3 соседних поля, которые отслеживают изменения пользователем пользователя в какой день и в какое время. И в моем случае может быть несколько сотен позиций, где мне нужно обновить время и дату.

Ответы [ 4 ]

1 голос
/ 13 марта 2019

Лично я бы использовал первый вариант. Код проще, и я не могу представить, что будет существенная разница в производительности.

Единственный раз, когда я выберу второй вариант, это когда иногда может потребоваться, чтобы дата отличалась от системной даты (например, UDATE).

1 голос
/ 12 марта 2019

Мои два цента. Вам известно о столбце отметки времени изменения строки в IBM i? Они описаны в https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/sqlp/rbafysqlprcts.htm?

Они могут сэкономить вам много кода, сохраняя автоматически поддерживаемый столбец отметки времени каждый раз, когда строка вставляется или обновляется. С другой стороны, он поддерживается только для столбцов меток времени, но не для отдельных столбцов даты и времени.

1 голос
/ 12 марта 2019

Я думаю, что на ваш вопрос нет простого ответа, например, если вы ищете информацию о переменной хоста, также IBM не дает быстрого ответа, посмотрите здесь:

Для переменных хоста требуются коэффициенты фильтра по умолчанию. Когда вы связываете статический оператор SQL, который содержит переменные хоста, Db2 использует коэффициент фильтра по умолчанию, чтобы определить наилучший путь доступа для оператора SQL. Db2 часто выбирает путь доступа, который хорошо работает для запроса с несколькими переменными хоста. Однако в новом выпуске или после применения обслуживания Db2 может выбрать новый путь доступа, который не будет работать так же хорошо, как старый путь доступа. Во многих случаях изменение путей доступа связано с коэффициентами фильтра по умолчанию, что может привести к тому, что Db2 оптимизирует запрос другим способом.

1 голос
/ 11 марта 2019

Если вы собираетесь использовать регистры CURRENT_DATE и CURRENT_TIME, я ожидаю, что было бы лучше всего использовать их в выражении SQL, которое нуждается в них.Ваш второй пример включает три запроса к базе данных, в то время как первый пример только один.Поэтому я подозреваю, что первый будет работать лучше, так как все три имеют одинаковые издержки (получить этот регистр), но у второго накладные расходы три раза по сравнению с одним.

Кроме того, первое легче читать (самое важное, ИМО, если это не так).То есть нет необходимости оптимизировать, если вам это не нужно.Конечно, если бы я захотел получить текущую дату и время в RPG, я бы не использовал SQL для этого, но встроенную RPG вроде %date() или %time(); -)

Редактировать: Здесь есть некоторые неэффективные соображения.Если вы хотите, чтобы одна и та же дата / время были во всех строках, во всех обновлениях, вам придется заранее фиксировать дату и время.Если вы хотите, чтобы фактические дата и время обновления, вы захотите использовать регистры.Однако SQL делает одну приятную вещь: если вы используете CURRENT_DATE, CURRENT_TIME или CURRENT_TIMESTAMP или какое-то их сочетание несколько раз в одном операторе SQL, все обновленные строки будут иметь одинаковую дату, время и метку временидля данного исполнения заявления.

...