[英]optimizing this piece of a stored procedure
因此,這是我要調整的一部分存儲過程。 我發現運行速度很慢。 我大約需要3個小時。 我認為數據庫可能缺少索引或視圖。 我相信join
是如此之慢的原因,但是我不知道拆分聯接的方法,因此Sql不會很難處理它們。 我以為臨時表。 如果可以的話,謝謝。
SELECT ftrec.AccountName,
cast(ftrec.AssetId as varchar(50)) as AssetId,
va.Class as Category,
gt.Name as RegisteredGrade,
gtu.Name as FinishedGrade,
'Recycling' as SKU,
DATENAME(month,ftrec.CreatedOn) + ' ' + cast(DATEPART(yyyy,ftrec.CreatedOn) as varchar(50)) AS ServiceCompleteMonth,
ISNULL(CASE ftRec.RateTypeID
WHEN 1 THEN a.Weight
ELSE 1 END * ftRec.Rate,0) as ServiceTotal,
itwrec.Name as 'Warehouse',
asu.UserName as 'TechnicianName'
FROM itAsset a (nolock)
inner JOIN vAssetSimpleView va on a.AssetRecId = va.AssetId
inner JOIN dbo.itGradeTypes gtu ON gtu.RecID = a.Upgrade_Grade
inner JOIN itGradeTypes gt ON va.Grade = gt.RecId
inner JOIN FinancialTransactions ftRec (nolock) ON ((ftRec.AssetID = a.AssetRecID) OR (ftRec.FKeyID = a.OrigTransactionID and ftRec.AssetID = 0)) AND ftRec.FinancialTypeID = 1
INNER JOIN ittransactionprocess tpRec (nolock) on ftRec.fkeyid = tpRec.transactionid
inner JOIN dbo.itLotTrips lt ON a.OrigLotNumber = lt.LotNumber
inner JOIN dbo.itDocks d ON lt.DockID = d.DockID
inner JOIN dbo.itWarehouse itwrec ON d.WarehouseID = itwrec.WarehouseID
--LEFT JOIN itWarehouse itwrec (nolock) on ftrec.WarehouseID = itwrec.WarehouseID
inner JOIN Aspnet_users asu (nolock) ON asu.userid = tprec.ModifiedBy
WHERE ftrec.CreatedOn > @StartDate AND ftrec.CreatedOn < @EndDate
AND a.LockedStatus = 5
--and ftrec.Assetid = 285912
沒有執行計划,也沒有添加索引的能力,只能猜測一個人可以執行。 首先要執行的計划是執行計划-在提出問題之前,如果這沒有幫助您將執行計划包括在問題中。
我的第一個猜測是,我將更改表的順序。 看來FinancialTransactions
是最重要的,所以我將其用作“ from”表:
SELECT
ftrec.AccountName
, CAST( ftrec.AssetId AS varchar(50) ) AS AssetId
, va.Class AS Category
, gt.Name AS RegisteredGrade
, gtu.Name AS FinishedGrade
, 'Recycling' AS SKU
, DATENAME( MONTH, ftrec.CreatedOn ) + ' ' + CAST( DATEPART( yyyy, ftrec.CreatedOn ) AS varchar(50) ) AS ServiceCompleteMonth
, ISNULL( CASE ftRec.RateTypeID WHEN 1 THEN a.Weight ELSE 1 END * ftRec.Rate, 0 ) AS ServiceTotal
, itwrec.Name AS 'Warehouse'
, asu.UserName AS 'TechnicianName'
FROM FinancialTransactions ftrec
INNER JOIN itAsset a ON (
(ftRec.AssetID = a.AssetRecID)
OR
(ftRec.FKeyID = a.OrigTransactionID AND ftRec.AssetID = 0)
)
INNER JOIN vAssetSimpleView va ON a.AssetRecId = va.AssetId
INNER JOIN dbo.itGradeTypes gtu ON gtu.RecID = a.Upgrade_Grade
INNER JOIN itGradeTypes gt ON va.Grade = gt.RecId
INNER JOIN ittransactionprocess tpRec ON ftRec.fkeyid = tpRec.transactionid
INNER JOIN dbo.itLotTrips lt ON a.OrigLotNumber = lt.LotNumber
INNER JOIN dbo.itDocks d ON lt.DockID = d.DockID
INNER JOIN dbo.itWarehouse itwrec ON d.WarehouseID = itwrec.WarehouseID
--LEFT JOIN itWarehouse itwrec on ftrec.WarehouseID = itwrec.WarehouseID
INNER JOIN Aspnet_users asu ON asu.userid = tprec.ModifiedBy
WHERE ftrec.CreatedOn > @StartDate
AND ftrec.CreatedOn < @EndDate
--and ftrec.Assetid = 285912
AND a.LockedStatus = 5
;
另外,我可能還會嘗試使用CTE,這可能會對性能產生影響。
WITH ftRec
AS (
SELECT
AccountName
, AssetId
, CreatedOn
, RateTypeID
FROM FinancialTransactions
WHERE CreatedOn > @StartDate
AND CreatedOn < @EndDate
--and Assetid = 285912
)
SELECT
ftrec.AccountName
, CAST( ftrec.AssetId AS varchar(50) ) AS AssetId
, va.Class AS Category
, gt.Name AS RegisteredGrade
, gtu.Name AS FinishedGrade
, 'Recycling' AS SKU
, DATENAME( MONTH, ftrec.CreatedOn ) + ' ' + CAST( DATEPART( yyyy, ftrec.CreatedOn ) AS varchar(50) ) AS ServiceCompleteMonth
, ISNULL( CASE ftRec.RateTypeID WHEN 1 THEN a.Weight ELSE 1 END * ftRec.Rate, 0 ) AS ServiceTotal
, itwrec.Name AS 'Warehouse'
, asu.UserName AS 'TechnicianName'
FROM ftrec
INNER JOIN itAsset a ON (
(ftRec.AssetID = a.AssetRecID)
OR
(ftRec.FKeyID = a.OrigTransactionID AND ftRec.AssetID = 0)
)
INNER JOIN vAssetSimpleView va ON a.AssetRecId = va.AssetId
INNER JOIN dbo.itGradeTypes gtu ON gtu.RecID = a.Upgrade_Grade
INNER JOIN itGradeTypes gt ON va.Grade = gt.RecId
INNER JOIN ittransactionprocess tpRec ON ftRec.fkeyid = tpRec.transactionid
INNER JOIN dbo.itLotTrips lt ON a.OrigLotNumber = lt.LotNumber
INNER JOIN dbo.itDocks d ON lt.DockID = d.DockID
INNER JOIN dbo.itWarehouse itwrec ON d.WarehouseID = itwrec.WarehouseID
--LEFT JOIN itWarehouse itwrec on ftrec.WarehouseID = itwrec.WarehouseID
INNER JOIN Aspnet_users asu ON asu.userid = tprec.ModifiedBy
WHERE a.LockedStatus = 5
;
我不會使用NOLOCK。 它不是性能調整項,它只是允許查詢包括未提交的數據(“臟讀”)。
另外,正如Avi在評論中已經提到的,請嘗試從源表而不是視圖vAssetSimpleView
定位va.Class
,這對於單個輸出列可能會產生很多開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.