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

Откуда:
Сообщений: 1
Может кто знает что еще можно сделать чтоб быстрее работало?

SELECT COUNT(*)
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.TransactionHistory h on sod.ProductID = h.ProductID
INNER JOIN Sales.SalesOrderHeader soh on sod.SalesOrderID = soh.SalesOrderID
INNER JOIN Sales.SalesOrderHeader hsoh on h.ReferenceOrderID = hsoh.SalesOrderID
LEFT OUTER JOIN Sales.SalesOrderHeaderSalesReason sr on sod.SalesOrderID = sr.SalesOrderID
LEFT OUTER JOIN Sales.SalesReason r on sr.SalesReasonID = r.SalesReasonID
OPTION(HASH JOIN)

  |--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(int,[globalagg1009],0)))
       |--Stream Aggregate(DEFINE:([globalagg1009]=SUM([partialagg1008])))
            |--Parallelism(Gather Streams)
                 |--Stream Aggregate(DEFINE:([partialagg1008]=Count(*)))
                      |--Hash Match(Right Outer Join, HASH:([sr].[SalesOrderID])=([sod].[SalesOrderID]))
                           |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([sr].[SalesOrderID]))
                           |    |--Clustered Index Scan(OBJECT:([AdventureWorks2008Default].[Sales].[SalesOrderHeaderSalesReason].[PK_SalesOrderHeaderSalesReason_SalesOrderID_SalesReasonID] AS [sr]))
                           |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([sod].[SalesOrderID]))
                                |--Hash Match(Inner Join, HASH:([h].[ProductID])=([sod].[ProductID]))
                                     |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([h].[ProductID]))
                                     |    |--Hash Match(Inner Join, HASH:([h].[ReferenceOrderID])=([hsoh].[SalesOrderID]))
                                     |         |--Bitmap(HASH:([h].[ReferenceOrderID]), DEFINE:([Bitmap1010]))
                                     |         |    |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([h].[ReferenceOrderID]))
                                     |         |         |--Clustered Index Scan(OBJECT:([AdventureWorks2008Default].[Production].[TransactionHistory].[PK_TransactionHistory_TransactionID] AS [h]))
                                     |         |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([hsoh].[SalesOrderID]))
                                     |              |--Index Scan(OBJECT:([AdventureWorks2008Default].[Sales].[SalesOrderHeader].[IX_SalesOrderHeader_Status] AS [hsoh]),  WHERE:(PROBE([Bitmap1010],[AdventureWorks2008Default].[Sales].[SalesOrderHeader].[SalesOrderID] as [hsoh].[SalesOrderID],N'[IN ROW]')))
                                     |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([sod].[ProductID]))
                                          |--Index Scan(OBJECT:([AdventureWorks2008Default].[Sales].[SalesOrderDetail].[IX_SalesOrderDetail_ProductID] AS [sod]))


Сообщение было отредактировано: 5 авг 16, 17:18
5 авг 16, 17:12    [19506876]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация  [new]
iiyama
Member

Откуда:
Сообщений: 642
truncate table Sales.SalesOrderDetail 


Сорри, не удержался. Пятница ...
5 авг 16, 17:31    [19507004]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
uladzimir_v,

так точно будет быстрее
SELECT COUNT(*)
FROM Sales.SalesOrderDetail sod
5 авг 16, 17:35    [19507050]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
uladzimir_v,

а вам точно именно count(*) нужен? потому как, если нужен не count(*), то план уже более другим может оказаться. а если все-таки именно он и нужен, то из запроса смело можно пару джойнов выкинуть. что сервер в плане, собственно, и сделал.
5 авг 16, 17:56    [19507208]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LEFT JOIN для COUNT(*) нужен только если отношение между соответствующими таблицами не 1:1.
Если отношение 1:1, то их надо выкинуть.
5 авг 16, 18:33    [19507367]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить