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

Откуда: ->|<- :адуктО
Сообщений: 21528
Какой вариант запросов оптимальнее с точки зрения быстродействия и прочего?

if exists(select * from MyTable where MyField=1)...

if exists(select ID from MyTable where MyField=1)...

if exists(select 1 from MyTable where MyField=1)...

select Count(*) from MyTable where MyField=1

select Count(ID) from MyTable where MyField=1 --ID не содержит NULL-ов в любом случае

select Count(ALL ID) from MyTable where MyField=1
8 сен 09, 12:52    [7631089]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
надеюсь, речь не идет про использование count в качестве замены exists
8 сен 09, 12:55    [7631115]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21528
Паганель
надеюсь, речь не идет про использование count в качестве замены exists


нет, конечно, это как бы два отдельных вопроса
8 сен 09, 12:57    [7631133]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Glory
Member

Откуда:
Сообщений: 104760
Shocker.Pro
Какой вариант запросов оптимальнее с точки зрения быстродействия и прочего?

План выполнения и статистика чтений не дают вам однозначного ответа ?
8 сен 09, 12:57    [7631135]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
EXISTS (Transact-SQL)
Указывает вложенный запрос для проверки существования строк.
Ключевое слово "строк" как бы подразумевает, что все равно, какие столбцы указаны
Хотя четкое указание о том, что "все равно, какие столбцы..." я что-то в доке найти не могу

(Цитату взято отсюда)
8 сен 09, 13:04    [7631183]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21528
[/quot]
План выполнения и статистика чтений не дают вам однозначного ответа ?[/quot]

Этот вопрос достаточно абстрактный. То есть, в каком стиле писать, ибо такие запросы, как правило, не сложные, имеют простейший план и короткое время выполнения.


Для того, чтобы экспериментально ответить на этот вопрос, надо потратить полдня, а тут, я думаю, есть люди (в частности Вы ) которые и так смогут ответить.
8 сен 09, 13:06    [7631198]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
BOL->Subqueries with EXISTS
...
The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are just testing whether rows that meet the conditions specified in the subquery exist.
...
8 сен 09, 13:07    [7631208]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Shocker.Pro
имеют простейший план и короткое время выполнения.
Shocker.Pro
надо потратить полдня
одно утверждение с другим как-то не согласуется
8 сен 09, 13:08    [7631216]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Shocker.Pro
Для того, чтобы экспериментально ответить на этот вопрос, надо потратить полдня, а тут, я думаю, есть люди (в частности Вы ) которые и так смогут ответить.


ГМ... Полдня на то, чтобы написать двестрочки:

SET STATISTICS TIME ON
SET STATISTICS IO ON
8 сен 09, 13:09    [7631218]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Glory
Member

Откуда:
Сообщений: 104760
Shocker.Pro

План выполнения и статистика чтений не дают вам однозначного ответа ?


Этот вопрос достаточно абстрактный. То есть, в каком стиле писать, ибо такие запросы, как правило, не сложные, имеют простейший план и короткое время выполнения.


Отнюдь. Если нет разницы в планах и количестве чтений, то нет и разницы запросах
8 сен 09, 13:09    [7631219]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8679
pkarklin
BOL->Subqueries with EXISTS
...
The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are just testing whether rows that meet the conditions specified in the subquery exist.
...


Тут, вроде как написано, что "ВАМ ПОФИГ - звёздочка здесь или поле"... (могу ошибаться - я не супер в Английсском).
А коллега интересуется "как это воспринимается СЕРВЕРОМ?"...

извините за то, что встрял ...

PS Я пишу select 1 в exists - запросах. ХЗ почему... Может из Хендерсона, может после ПДК "Оптима"... Может после этого форума...
8 сен 09, 13:14    [7631256]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Glory
Member

Откуда:
Сообщений: 104760
SIMPLicity_
pkarklin
BOL->Subqueries with EXISTS
...
The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are just testing whether rows that meet the conditions specified in the subquery exist.
...


Тут, вроде как написано, что "ВАМ ПОФИГ - звёздочка здесь или поле"... (могу ошибаться - я не супер в Английсском).
А коллега интересуется "как это воспринимается СЕРВЕРОМ?"...

Ну так план выполнения и покажет ему, "как это воспринимается СЕРВЕРОМ"

ЗЫ
А привычка ваша идет от версии 6.5
8 сен 09, 13:16    [7631274]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21528
Паганель
Shocker.Pro
имеют простейший план и короткое время выполнения.
Shocker.Pro
надо потратить полдня
одно утверждение с другим как-то не согласуется


pkarklin
ГМ... Полдня на то, чтобы написать двестрочки:



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

Вы меня не поняли, я не пытаюсь отладить и оптимизировать конкретные запросы, а просто осознать, как лучше писать в тех случаях, когда оптимизация не требуется. Потому что все равно, написать * или 1, а тестировать все места, где это встретилось бессмысленно.

SIMPLicity_
Тут, вроде как написано, что "ВАМ ПОФИГ - звёздочка здесь или поле"... (могу ошибаться - я не супер в Английсском).
А коллега интересуется "как это воспринимается СЕРВЕРОМ?"...


Верно, я тоже так понял эту фразу.
8 сен 09, 13:17    [7631280]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
залётный
Guest
SIMPLicity_
Может после этого форума...

После этого форума вы скорее всего писали бы так:
select top 1 1
Были тут и такие веяния :)
8 сен 09, 13:19    [7631295]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Надо взять достаточно репрезентативную выборку достаточно разнообразных таблиц и проверить в разных условиях, при разном количестве записей и т.п.


Это может только повлиять на метод доступа (INDEX\CLUSTERED SEEK\SCAN или TABLE SCAN), но никак на саму физику процесса поиска записи.
8 сен 09, 13:21    [7631320]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
iljy
Member

Откуда:
Сообщений: 8711
План вам покажет все интересующие моменты, не нужно это проверять на десятках таблиц. Если коротко -
Shocker.Pro
Какой вариант запросов оптимальнее с точки зрения быстродействия и прочего?

if exists(select * from MyTable where MyField=1)...

if exists(select ID from MyTable where MyField=1)...

if exists(select 1 from MyTable where MyField=1)...

эти варианты эквивалентны. Причем 2005 (на 2000 не проверял) позволяет указать * даже если в запросе используется группировка.
Shocker.Pro

select Count(*) from MyTable where MyField=1

select Count(ID) from MyTable where MyField=1 --ID не содержит NULL-ов в любом случае

select Count(ALL ID) from MyTable where MyField=1


count(ID) и count(ALL ID) эквивалентны (см. БОЛ-> count). Для поля NOT NULL эквивалентно и count(*) и count(ID) - где-то мелькало сравнение планов таких запросов, для обоих вариантов выбирается самый узкий индекс, неважно - содержит он ID или нет. Если поле nullable - тогда обязательно индекс, это поле включающий.
8 сен 09, 13:33    [7631430]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
Добрый Э - Эх
Guest
SIMPLicity_
pkarklin
BOL->Subqueries with EXISTS
...
The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are just testing whether rows that meet the conditions specified in the subquery exist.
...


Тут, вроде как написано, что "ВАМ ПОФИГ - звёздочка здесь или поле"... (могу ошибаться - я не супер в Английсском).
А коллега интересуется "как это воспринимается СЕРВЕРОМ?"...

извините за то, что встрял ...

PS Я пишу select 1 в exists - запросах. ХЗ почему... Может из Хендерсона, может после ПДК "Оптима"... Может после этого форума...


Серверу тоже пофиг, чего ты там указал в селект-листе [NOT] EXISTS-подзапроса.
Вот такое отработает на ура.
with
  t0 (t0_id) as
    (
      select 1 union all
      select 2 union all
      select 3
    ),
  t1 (t1_id) as
    (
      select 3 union all
      select 4
    )
select *
  from t0
 where not exists 
         (select 1/0 
            from t1 
           where t1_id = t0_id
         )

И никакое
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

Сообщение 8134, уровень 16, состояние 1, строка 1
Divide by zero error encountered.
в этом случае не вернется...
8 сен 09, 13:39    [7631486]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Добрый Э - Эх
Серверу тоже пофиг, чего ты там указал в селект-листе [NOT] EXISTS-подзапроса.
Вот такое отработает на ура.
with
  t0 (t0_id) as
    (
      select 1 union all
      select 2 union all
      select 3
    ),
  t1 (t1_id) as
    (
      select 3 union all
      select 4
    )
select *
  from t0
 where not exists 
         (select 1/0 
            from t1 
           where t1_id = t0_id
         )

И никакое
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

Сообщение 8134, уровень 16, состояние 1, строка 1
Divide by zero error encountered.
в этом случае не вернется...
Зато если написать
IF EXISTS(SELECT ID FROM [Table] WHERE ...) ...
, а в [Table] поля ID нет, то вернётся сообщение об ошибке!
Так что серверу не всё "пофиг"!
8 сен 09, 13:48    [7631548]     Ответить | Цитировать Сообщить модератору
 Re: exists/count со звездочкой  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
залётный
SIMPLicity_
Может после этого форума...

После этого форума вы скорее всего писали бы так:
select top 1 1
Были тут и такие веяния :)

Это workaround от старого бага.
8 сен 09, 15:17    [7632223]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить