Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 1738
Доброе время суток Всем!
MSSQL 2008

В большой таблице необходимо по какому либо условию определять наичие хотя бы одной записи ему удовлетворяющему.

Сначала делал так SELECT TOP 1 count(*) FROM TABLE WHERE ......
но возникли сомнения
может лучше напр так SELECT TOP 1 ID FROM TABLE WHERE ....
и потом проверить что в ID вернуло
Коллега т.же выразил сомнение и сказал что скорее всего TOP 1 в сочетании с COUNT не даст выйгрыша в производительности, и что просто COUNT без TOP 1 будет работать так же по времени.

Что скажете? как лучше?

Спасибо.
29 фев 12, 14:30    [12170536]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
aleks2
Guest
Царский путь
exists(select * FROM Table Where УСЛОВИЕ)
29 фев 12, 14:31    [12170559]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 1738
хотелось бы в SQL стандарте остаться.
29 фев 12, 14:32    [12170571]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Mikhail Tchervonenko
хотелось бы в SQL стандарте остаться.
ВОт именно поэтому нужно писать
exists(select * FROM Table Where УСЛОВИЕ)
29 фев 12, 14:34    [12170596]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
Penner
Member

Откуда:
Сообщений: 340
а как насчет скорости?
29 фев 12, 14:36    [12170615]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 1738
alexeyvg,

большие сомнения насчет скорости такого решения, или оптимизптор правильно его понимает и не производит полную выборку а просто спри выборе первого значения первого поля прерывает дальнейший SELECT ?
29 фев 12, 14:37    [12170646]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
IF EXISTS(SELECT * FROM T WHERE ...)
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
CREATE TABLE T(ID INT IDENTITY, X INT);
INSERT T DEFAULT VALUES;
PRINT '1. Вставили одну запись';
SELECT ISNULL((SELECT 'Есть хотя бы одна чётная запись' FROM T WHERE ID%2=0),'Нет ни одной чётной записи');
INSERT T DEFAULT VALUES;
PRINT '2. Вставили вторую запись';
SELECT ISNULL((SELECT 'Есть хотя бы одна чётная запись' FROM T WHERE ID%2=0),'Нет ни одной чётной записи');
Не надо COUNT()
29 фев 12, 14:40    [12170680]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Mikhail Tchervonenko,

Документацию принципиально не читаем?

When a subquery is introduced with the keyword EXISTS, the subquery functions as an existence test. The WHERE clause of the outer query tests whether the rows that are returned by the subquery exist. The subquery does not actually produce any data; it returns a value of TRUE or FALSE.
29 фев 12, 14:41    [12170702]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 1738
iap,

сорри, забыл добавить, запрос делается на клиенте (delphi)
29 фев 12, 14:42    [12170704]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TOP(1) забыл...
iap
IF EXISTS(SELECT * FROM T WHERE ...)
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
CREATE TABLE T(ID INT IDENTITY, X INT);
INSERT T DEFAULT VALUES;
PRINT '1. Вставили одну запись';
SELECT ISNULL((SELECT TOP(1) 'Есть хотя бы одна чётная запись' FROM T WHERE ID%2=0),'Нет ни одной чётной записи');
INSERT T DEFAULT VALUES;
PRINT '2. Вставили вторую запись';
SELECT ISNULL((SELECT TOP(1) 'Есть хотя бы одна чётная запись' FROM T WHERE ID%2=0),'Нет ни одной чётной записи');
Не надо COUNT()
29 фев 12, 14:42    [12170706]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 1738
pkarklin
Mikhail Tchervonenko,

Документацию принципиально не читаем?

When a subquery is introduced with the keyword EXISTS, the subquery functions as an existence test. The WHERE clause of the outer query tests whether the rows that are returned by the subquery exist. The subquery does not actually produce any data; it returns a value of TRUE or FALSE.


пасиб, этот кусочек пропустил
29 фев 12, 14:43    [12170720]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mikhail Tchervonenko
iap,

сорри, забыл добавить, запрос делается на клиенте (delphi)
Это не важно.
Главное, что он делается для SQL сервера.

TOP(1) - это, конечно, выходит за рамки стандартов.
Но остаться в этих рамках практически невозможно.
Да и смысла никакого нет.
29 фев 12, 14:44    [12170736]     Ответить | Цитировать Сообщить модератору
 Re: TOP 1 и Count, а также необходимость Count для определения наличия хотя бы одной записи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Mikhail Tchervonenko
alexeyvg,

большие сомнения насчет скорости такого решения, или оптимизптор правильно его понимает и не производит полную выборку а просто спри выборе первого значения первого поля прерывает дальнейший SELECT ?
Конечно прерывает.

А для count делается полный подсчёт.
29 фев 12, 16:00    [12171644]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить