Подавляющее большинство людей поддерживают мое собственное мнение о том, что нет разницы между следующими утверждениями:
SELECT * FROM tableA WHERE EXISTS (SELECT * FROM tableB WHERE tableA.x = tableB.y)
SELECT * FROM tableA WHERE EXISTS (SELECT y FROM tableB WHERE tableA.x = tableB.y)
SELECT * FROM tableA WHERE EXISTS (SELECT 1 FROM tableB WHERE tableA.x = tableB.y)
SELECT * FROM tableA WHERE EXISTS (SELECT NULL FROM tableB WHERE tableA.x = tableB.y)
Тем не менее, сегодня я столкнулся лицом к лицу с противоположным утверждением, когда на нашей внутренней встрече разработчиков было высказано мнение о том, что select 1
- это путь, и select *
выбирает все (ненужные) данные, что снижает производительность.
Кажется, я помню, что была какая-то старая версия Oracle или что-то такое, где это было правдой, но я не могу найти ссылки на это. Итак, мне любопытно - как родилась эта практика? Откуда возник этот миф?
Добавлено: Поскольку некоторые люди настаивают на наличии доказательств того, что это действительно ложное убеждение, здесь - запрос Google , который показывает множество людей, говорящих это так. Если вам лень, проверьте эту прямую ссылку , где один парень даже сравнивает планы выполнения, чтобы найти, что они эквивалентны.