В отчёте для проверки качества данных вы используете SELECT user_id FROM users LIMIT 100 и замечаете, что набор пользователей меняется между запусками. Почему это ожидаемо?
AПотому что
LIMIT делает равномерную случайную выборку.BПотому что без
ORDER BY база всегда возвращает пользователей с минимальным user_id.CПотому что
SELECT без WHERE обязан возвращать строки в порядке вставки.DПотому что без
ORDER BY порядок строк не гарантирован, и результат с LIMIT может меняться при изменении плана, индексов или данных.Правильный ответ.
LIMIT без ORDER BY не даёт стабильного набора строк.Разбор
SQL по умолчанию не гарантирует порядок строк, если вы явно не указали ORDER BY. Поэтому LIMIT просто обрезает «как получилось» — порядок может зависеть от плана (Seq Scan или Index Scan), физического расположения строк и других факторов. Если нужен воспроизводимый сэмпл, добавьте детерминирующий ORDER BY (часто по ключу).
Проверь себя · 1/3разбор после ответа
В выводе
EXPLAIN вы видите узел Seq Scan on orders. Что это обычно означает?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что дает запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает?
- В плане `EXPLAIN` для запроса по пользователю вы видите `Index Scan using orders_user_id_idx on orders`. Какой вывод наиболее корректен?
- На большой таблице `events` запрос `SELECT * FROM events ORDER BY created_at DESC LIMIT 100` неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по `created_at`?
- Есть индекс по `orders.created_at`, но `EXPLAIN` для фильтра `WHERE date(created_at) = current_date` показывает `Seq Scan`. Почему это часто происходит?
- Все вопросы по «EXPLAIN и оптимизация» →