1

Я пытаюсь ускорить свою хранимую процедуру, поэтому я проверить свою хранимую процедуру в двух форматах с использованием статистики Ио, как показано нижевнутреннее соединение против, где положение подзапрос SQL Server

Метод 1: с помощью присоединиться

set statistics io on 

select top 2000 
    p.Vehicleno, 
    dbo.GetVehicleStatusIcon1(p.Direction, StatusCode, 0) as 'Status', 
    location, 
    Convert(varchar(13), p.TrackTime, 102) + ' ' + Convert(varchar(13), p.TrackTime, 108) AS 'TrackTime', 
    p.Speed, p.Ignition 
from 
    pollingdata p 
inner join 
    assignvehicletouser asn on asn.vehicleno = p.vehicleno 
where 
    asn.empid = 1 

я получаю результат как статистика

Table 'Worktable'. Scan count 943, logical reads 7671, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'PollingData'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Способ 2: с помощью ИНЕКЕ суб-запроса

set statistics io on 

select top 2000 
    Vehicleno, 
    dbo.GetVehicleStatusIcon1(Direction,StatusCode, 0) as 'Status', 
    location, 
    Convert(varchar(13), TrackTime, 102) + ' ' + Convert(varchar(13), TrackTime, 108) AS 'TrackTime', 
    Speed, Ignition 
from 
    pollingdata 
where 
    vehicleno in (select vehicleno 
        from assignvehicletouser 
        where empid = 1) 

я получаю результат как статистика

Table 'PollingData'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Необходимо знать, какой из них лучше использовать?

Нужно объяснять, как работает логическое чтение?

+1

Всегда рекомендуется использовать Joins вместо IN. SO первым методом будет лучше. –

+0

не могли бы вы объяснить мне логические чтения –

+1

@SridharDD Это было «всегда рекомендуется» десять лет назад. Просто придерживайтесь значения операции - это логическое соединение или нет? – Luaan

ответ

0

Обычно joins will work faster than inner queries, но в reality it will depend on the execution plan generated by SQL Server.

Независимо от того, как вы пишете свой запрос, SQL Server всегда будет преобразовывать его в план выполнения.

Если это «умный» достаточно, чтобы сгенерировать один и тот же план из обоих запросов, вы получите тот же результат.

Вы можете прочитать Subquery or Join и here

7

Если вы ничего не нужно от assignvehicletouser стола, я бы предпочел EXISTS (Это, вероятно, работает точно так же, как IN)

SELECT TOP (2000) p.Vehicleno 
    , dbo.GetVehicleStatusIcon1(p.Direction, StatusCode, 0) AS 'Status' 
    , location 
    , CONVERT(VARCHAR(13), p.TrackTime, 102) + ' ' + CONVERT(VARCHAR(13), p.TrackTime, 108) AS 'TrackTime' 
    , p.Speed 
    , p.Ignition 
FROM pollingdata p 
WHERE EXISTS (
     SELECT 1 
     FROM assignvehicletouser asn 
     WHERE asn.vehicleno = p.vehicleno 
      AND asn.empid = 1 
     ); 
+1

[Нет, 'существует' - это не то же самое, что' in' в SQL Server] (http://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance) – potashin

+1

Я стою исправлено. –

1

Основываясь на статистике результаты, полученные во втором, кажутся лучше, поскольку первый из них имеет дополнительный tempdb «worktable», который используется для проведения временных/промежуточных операций/результатов, таких как операции SORTING

Logical Read: Логическое чтение происходит каждый раз, когда страница считывается из кеша буфера SQL-сервера, что хорошо.

Физическое чтение: Это происходит, когда страница с требуемыми данными недоступна в буферном кэше, система считывает ее с диска (физический IO) и копирует в буферный кеш.

Вы можете использовать CROSS ОТНОСИТЬСЯ присоединиться UDF вместо того, чтобы называть его непосредственно и в первом запросе WHERE условие (asn.emp = 1) может непосредственно применяться после того, как «ON» состоянии, как asn.vehicleno = p.vehicleno И Asn .empid = 1

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