2015-07-22 2 views
-2

Каков оптимальный выбор по вашему желанию?Каков оптимальный выбор по вашему желанию?

select @MailTo=ISNULL((select data from filedata where descid=3104 and DataId=evt04) ,'') 
from event_21 
where [email protected] 

или

select @MailTo=ISNULL(data ,'') 
from event_21 
innerjoin filedata on event_21.evt04=filedata.dataid 
where descid=3104 
and [email protected] 
+0

УКАЗАТЬ ИСКЛЮЧИТЕЛЬНО на обоих и посмотреть, есть ли разница; там наверняка нет. –

+0

'EXPLAIN' не является функцией Sql Server 2008. Вместо этого используйте 'SHOWPLAN' и' STATISTICS'. –

+1

С точки зрения стиля, я всегда предпочитаю объединения. С точки зрения производительности, я почти всегда видел, как соединения выполняются быстрее. – UnhandledExcepSean

ответ

1

Очевидно "присоединиться" быстрее, чем "инлайн выберите запрос". Я проверил с 1000 строк. Вы также можете проверить. здесь приведен пример тестового кода.

CREATE TABLE [dbo].[tableA](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](100) NOT NULL, 
CONSTRAINT [PK_tableA] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[tableB](
    [RowId] [int] IDENTITY(1,1) NOT NULL, 
    [Id] [int] NOT NULL, 
    [Designation] [nvarchar](100) NULL, 
CONSTRAINT [PK_tableB] PRIMARY KEY CLUSTERED 
(
    [RowId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

Declare @Min  Int = 1 
     ,@Max  Int = 1000 

While (@Min <= @Max) 
Begin 
    Insert Into tableA(Name) 
    Select 'Name would be the name of - ' + Cast(@Min As Nvarchar(10)) 

    Insert Into tableB(Id,Designation) 
    Select @Min 
      ,'Desig could be the name of - Name' + Cast(@Min As Nvarchar(10)) 

    Select @Min = @Min + 1 
End 

Первый взгляд @ рядный выберите запрос

-- inline query 
Select a.Id 
     ,a.Name 
     ,(Select Designation From tableB As b Where b.Id = a.Id) As Designation 
From tableA As a With (Nolock) 

выход:

enter image description here

План выполнения:

enter image description here

теперь Регистрация запроса: -

---- join 
Select a.Id 
     ,a.Name 
     ,b.Designation 
From tableA As a With (Nolock) 
     Join tableB As b On a.Id = b.Id 

план выполнения для запроса присоединиться: - enter image description here вы можете увидеть четкую разницу.

Смежные вопросы