TGViewer
SQL Portal | Базы Данных SQL Portal | Базы Данных @sqlportal · 13.8K subscribers
Post #1617 2.05K
Используйте EXISTS вместо COUNT(*) для проверки существования

Если вам нужно проверить, существует ли конкретная запись в данных, не стоит использовать COUNT() с фильтром (WHERE).

COUNT(*) заставляет базу данных посчитать все подходящие строки, прежде чем определить, есть ли вообще хоть одна строка. Из-за этого база делает лишнюю работу, особенно на больших таблицах. Как однажды пошутили: использовать COUNT() для проверки существования, это как проверять, есть ли кто-нибудь дома, по данным переписи населения.

Вот наивный вариант:

SELECT *
FROM Customers c
WHERE (
SELECT COUNT(*)
FROM Orders o
WHERE o.CustomerID = c.CustomerID
) > 0;


База данных должна посчитать все заказы для каждого клиента, прежде чем проверить условие.

Вместо COUNT() правильнее использовать EXISTS. Оператор EXISTS прекращает поиск сразу после того, как находит первую подходящую строку. Это позволяет движку БД сделать short-circuit при поиске, а сам запрос становится эффективнее и лучше масштабируется.

Кроме того, если по столбцу, который участвует в условии, есть индекс, база данных сможет находить подходящие строки ещё быстрее, что дополнительно улучшает производительность. Поэтому EXISTS считается стандартным подходом в случаях, когда нужно ответить только на один вопрос: существует ли хотя бы одна подходящая строка. Пример:

-- Создайте индекс, чтобы ускорить поиск
CREATE INDEX idx_orders_customerid
ON Orders(CustomerID);

-- Используйте EXISTS, чтобы проверить, есть ли хотя бы один заказ
SELECT *
FROM Customers c
WHERE EXISTS (
SELECT 1
FROM Orders o
WHERE o.CustomerID = c.CustomerID
);


Когда индекс уже есть, база данных может быстро найти подходящие строки в таблице Orders и остановить поиск сразу после первого совпадения. Это делает запрос заметно эффективнее, особенно при работе с большими наборами данных.

👉 @SQLPortal
  • 👍 12
More from @sqlportal
  1. Oct 13, 2026SQL помогает получить данные. Статистика — понять, что они означают 20 статистических поня…
  2. Oct 12, 2026Команды SQL проще запомнить по назначению • DDL — создание и изменение структуры БД: CREAT…
  3. Oct 12, 2026Pandas: Python для повседневных задач аналитика 🐼 Загрузить файлы с неаккуратными данными…
  4. Oct 11, 2026Чтобы запросы оставались быстрыми, понятными и справлялись с ростом объёма данных, нужны х…
  5. Oct 11, 2026SQL: порядок написания ≠ порядок обработки Запрос начинается с SELECT, но логически обраба…
  6. Oct 10, 2026Какие навыки нужны дата-инженеру? В вакансиях прослеживается закономерность: на первом мес…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →