powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
17 сообщений из 17, страница 1 из 1
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043571
Геннадий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, All!

Вопрос к гуру : все-таки, объясните, плз, имеет ли смысл менять EXISTS ( SELECT *... на EXISTS( SELECT TOP 1 *..., и если да, то почему? Смотрел планы, мало чем отличаются, выигрышь буквально копеечный, по крайней мере, там, где видел. Объясняю причину интереса - в базе немеряно триггеров и ХП, часто использутся EXISTS... Мне нужно обоснование для разговора с девелоперами. Буду благодарен за любую информацию.
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043586
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXISTS ( SELECT 1 FROM.....
(без TOP)
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043599
Геннадий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, именно TOP 1. Планы на SELECT * и SELECT 1 вообще ничем не отличаются (это и понятно). Смысл TOP 1, насколько я понимаю, в том, что заставляет сервер прекращать выполнение вложенного селекта сразу, как только встретится первая запись, удовлетворяющая условию (что, по идее, должно происходить и так при наличии EXISTS). Просто в форуме неоднократно говорилось, что с и спользованием TOP 1 быстрее, вот я и пытаюсь разобраться, почему.
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043630
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В документации сказано что для оператора EXISTS оптимизатор прикращает сканирование таблицы после первого найденного значения (а это насколько я понимаю и есть эквивалент TOP 1). Так что если верить написанному, то дальше оптимизировать EXISTS уже некуда
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043683
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне лично не удалось специально написать запрос так, что бы была разница в скорости или в плане выполнения. Но это не значит что такого не может быть
Хотя я не верю - мне кажется что сервер не такой уж и тупой, что бы не мог это проанализоровать сам
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043689
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На MSSQL7.0 имеет смысл в критичных местах писать EXISTS ( SELECT TOP 1 * ..., так как гораздо шустрее выполняется, чем EXISTS ( SELECT * .., из-за кривости оптимизатора.

На MSSQL2000 эти две конструкции выполняются абсолютно одинаково, поэтому без разницы.
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043690
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Геннадий

Менять смысла нет, потому что есть там TOP или его нет, поиск по запросу прекращается как только находится первая запись, удовлетворяющая условию.
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043700
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята .... это уже обсуждалось....
поищите посерверу...
самый быстрый вариант именно
exist(select 1 from .....
просто возмите и протестируте .....
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043706
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MiCe
Может Вы и правы, но что бы чем так безапеляционно утверждать какой-нибудь скритпец бы продемонстрировали что ли, где оно быстрее будет.
Можете даже на своих таблицах, я поверю наслово.
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043718
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
declare @d datetime, @d1 datetime, @d2 datetime,@d3 datetime,@d4 datetime
declare @cnt int
declare @t int
set @t =  1000000 
 ---------------------------------------
 
Set @cnt= 0 
select @d = getdate()
while @cnt<@t
  begin
    if EXISTS (select  1  from dbo.syscolumns)
      begin 
        Set @cnt=@cnt+ 1 
      end
  end
 -------------------------------------
 
Set @cnt= 0 
select @d1 = getdate()
while @cnt<@t
  begin
    if EXISTS (select * from dbo.syscolumns) 
      begin
        Set @cnt=@cnt+ 1 
      end
  end
 -------------------------------------
 
Set @cnt= 0 
select @d2 = getdate()
while @cnt<@t
  begin
    if EXISTS (select top  1   1  from dbo.syscolumns) 
      begin 
        Set @cnt=@cnt+ 1 
      end
  end
 -------------------------------------
 
Set @cnt= 0 
select @d3 = getdate()
while @cnt<@t
  begin
    if EXISTS (select top  1  * from dbo.syscolumns) 
      begin 
        Set @cnt=@cnt+ 1 
      end
  end
 -------------------------------------
 
select @d4 = getdate()

select  datediff(ms, @d, @d1) as '1',
	datediff(ms, @d1, @d2) as '*',
	datediff(ms, @d2, @d3) as 'top 1 1',
	datediff(ms, @d3, @d4) as 'top 1 *'

...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043728
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня при многократном запуске предложенного скрипта любой из 4-х вариантов оказывался чуть-чуть быстрее остальных. Это чуть-чуть не превышало 2%.

SQL2000 SP2, Win2000 AdvServ SP3
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043765
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня первый всегда быстрее....
да - около 2%.... sql2k sp2.... 2xXeon....
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043769
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из своей практики могу сказать, что
пришлось после написания конструкции if exists (SELECT *... менять ее на if (SELECT TOP 1 COUNT(*) .... ) >0
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043779
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то snake
на огромных таблицах? или как?
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043781
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на огромных таблицах? или как?
И на тех, и на тех ...
Это было в DTS пакетах (по одному на каждую таблицу)
Таблиц чуть более ста, самая больщая - под 1.000.000 записей , есть мемо поля.
Выигрыш в производительности был абсолютно очевиден.
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043788
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчёт (SELECT TOP 1 COUNT(*) .... ) >0 это здорово придумано! ;-)
Ничто так не способствует обновлению техники, как её медленная работа!
...
Рейтинг: 0 / 0
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
    #32043793
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот я 4 раза запустил, правда для 100000
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 1            *           top  1   1      top  1  *     
 ----------- ----------- ----------- ----------- 
 
 3653          3453          3643          3436 
 4376          3920          3126          3123 
 3343          3110          3156          3373 
 7783          3343          3296          3406 

Еще я попробовал if (select top 1 count(*) from dbo.syscolumns) > 0, как и ожидал эта конструкция работала еще медленнее, но я не ожидал что настолько(для 10000):
Код: plaintext
1.
2.
3.
4.
5.
 1            *           top  1   1      top  1  *     top  1  count(*) 
 ----------- ----------- ----------- ----------- -------------- 
 
 310           313           516           313           14593 
 390           300           310           330           16280 


В этом примере примитивные запросы, не используются индексы. Я у себя пробовал это усложнить, но на результате не сказалось.

Пока я остаюсь при своём мнении что ускорение при использовании select top 1 1 - это из области психологии.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]