Безопасность SELECT
Что может страшного случиться, если вызвать SELECT? С лимитом, разумеется. Он же только читает данные, ничего не случится?
Через SELECT можно:
- вызвать хранимую процедуру/функцию, в которой может быть что угодно;
- обратиться к вычисляемому полю, которое в свою очередь может дергать функцию;
- выбрать запись для обновления и не отпустить лок;
- просто захватить лок (например, advisory-lock);
- вызвать агрегирующую функцию, которая затрагивает все данные, но возвращает один результат (поэтому лимит не поможет снизить нагрузку, но она может быть не критичной);
- вызвать перезапись данных: при записи большого числа блоков часть из них может быть вытеснена из кэша с необновленным битом статуса транзакции, любое последующее обращение к таким блокам (например, select) вызовет обновление этого бита (чтобы он соответствовал действительности) и, как следствие, вызовет перезапись всего блока;
- тупо “вымыть” данные из кэша;
- стриггерить триггеры (например, аудит).
Вдохновлено кусочком этого доклада, во многом помог Игорян, за что ему большое спасибо!