DISCARD
Вычисляет SELECT, но не возвращает результат ни в клиент, ни в таблицу.
Полезно использовать в сочетании с Ensure для проверки выполнения пользовательских условий на финальный результат вычислений.
Запрос с DISCARD выполняется полностью — со всеми фильтрами, агрегациями и проверками Ensure, — но результирующий набор (result set) не возвращается клиенту. Данные при этом не пересылаются по сети: клиент получает только статус выполнения запроса. На больших выборках это заметно экономит трафик и память.
В запросе из нескольких операторов DISCARD действует на отдельный оператор:
SELECT 1; -- вернётся
DISCARD SELECT 2; -- выполнится, но в ответ не попадёт
SELECT 3; -- вернётся
Клиент получит два результирующих набора — от первого и третьего оператора.
DISCARD применяется только к оператору целиком, использовать его внутри выражений нельзя. В частности, недопустимо:
- в подзапросах —
SELECT * FROM (DISCARD SELECT 1); - в
WHERE ... IN (...)—SELECT * FROM my_table WHERE Key IN (DISCARD SELECT 1); - в операндах
UNION ALL—SELECT 1 UNION ALL DISCARD SELECT 2.
Примечание
DISCARD поддерживается при выполнении запросов через сервис исполнения запросов (Query Service) начиная с версии YDB 26.2. При выполнении через устаревшие интерфейсы (Table Service, скан-запросы) DISCARD игнорируется, и результат возвращается клиенту — поведение сохранено для обратной совместимости.
Примеры
DISCARD SELECT 1;
DISCARD SELECT Ensure(
Data,
Data < 1000000,
"Value too big"
) FROM `result_table`;
Если условие Ensure нарушено, запрос завершится ошибкой. Если всё в порядке — запрос отработает успешно, а клиент не получит результирующий набор, который иначе пришлось бы выкачивать целиком.