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

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

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

Менять смысла нет, потому что есть там TOP или его нет, поиск по запросу прекращается как только находится первая запись, удовлетворяющая условию.
...
Рейтинг: 0 / 0
15.08.2002, 18:47:33
    #32043700
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
ребята .... это уже обсуждалось....
поищите посерверу...
самый быстрый вариант именно
exist(select 1 from .....
просто возмите и протестируте .....
...
Рейтинг: 0 / 0
15.08.2002, 18:58:04
    #32043706
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
2 MiCe
Может Вы и правы, но что бы чем так безапеляционно утверждать какой-нибудь скритпец бы продемонстрировали что ли, где оно быстрее будет.
Можете даже на своих таблицах, я поверю наслово.
...
Рейтинг: 0 / 0
15.08.2002, 21:04:47
    #32043718
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
Код: 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
15.08.2002, 22:06:32
    #32043728
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
У меня при многократном запуске предложенного скрипта любой из 4-х вариантов оказывался чуть-чуть быстрее остальных. Это чуть-чуть не превышало 2%.

SQL2000 SP2, Win2000 AdvServ SP3
...
Рейтинг: 0 / 0
16.08.2002, 09:05:25
    #32043765
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
у меня первый всегда быстрее....
да - около 2%.... sql2k sp2.... 2xXeon....
...
Рейтинг: 0 / 0
16.08.2002, 09:20:49
    #32043769
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
Из своей практики могу сказать, что
пришлось после написания конструкции if exists (SELECT *... менять ее на if (SELECT TOP 1 COUNT(*) .... ) >0
...
Рейтинг: 0 / 0
16.08.2002, 09:59:34
    #32043779
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
то snake
на огромных таблицах? или как?
...
Рейтинг: 0 / 0
16.08.2002, 10:11:31
    #32043781
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
на огромных таблицах? или как?
И на тех, и на тех ...
Это было в DTS пакетах (по одному на каждую таблицу)
Таблиц чуть более ста, самая больщая - под 1.000.000 записей , есть мемо поля.
Выигрыш в производительности был абсолютно очевиден.
...
Рейтинг: 0 / 0
16.08.2002, 10:27:49
    #32043788
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
Насчёт (SELECT TOP 1 COUNT(*) .... ) >0 это здорово придумано! ;-)
Ничто так не способствует обновлению техники, как её медленная работа!
...
Рейтинг: 0 / 0
16.08.2002, 10:34:32
    #32043793
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
Ну вот я 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ... / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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