Переменные индикатора Oracle pro*c и NVL при выполнении запроса
oracle-pro-c
рекомендовал использовать переменные индикатора как "NULL flags"
прикреплен к переменным хоста. Согласно документации, мы можем связать каждую переменную хоста с необязательной индикаторной переменной (короткий тип). Например:
short indicator_var;
EXEC SQL SELECT xyz INTO :host_var:indicator_var
FROM ...;
В качестве альтернативы мы также можем использовать NVL, как описано в https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm, например:
EXEC SQL SELECT NVL(TO_CHAR(xyz), '') INTO :host_var
FROM ...;
Какой из них лучше с точки зрения производительности?
1 ответ
Ах, Pro*C. Прошло уже более 20 лет, но я думаю, что моя память здесь хорошо мне помогает.
Использование индикаторных переменных будет лучше с точки зрения производительности по двум причинам:
- SQL проще, поэтому меньше разбора и меньше байтов будет передано по сети на сервер базы данных.
- В целом, в Oracle значение "Null" кодируется в 0 байтов. Пустая строка содержит длину (N байт) и память (0 байт). Таким образом, значение NULL кодируется более эффективно в возвращаемом наборе результатов.
Теперь на практике вы не заметите разницу. Но вы спросили:-)
По моему опыту NVL
был намного медленнее, чем индикаторные переменные, особенно если они вложены (да, вы можете вкладывать их) для INSERT или UPDATE полей. это было давно, и я точно не помню обстоятельств, но помню, что прирост производительности был реальным. При выборе это было не так очевидно, но использование индикаторных переменных позволяет также обнаруживать случаи, когда происходит усечение.
Если вы используете VARCHAR
или UVARCHAR
столбцы есть третий вариант для обнаружения NULL
/ Пустые строки в Oracle. Поле len будет установлено в 0, и это означает, что значение пусто. Поскольку Oracle не различаетNULL
и длины 0 строк это более или менее одинаково.