Sample Header Ad - 728x90

how come a table variable is improving the performance of a query in this circumstance?

9 votes
1 answer
291 views
for this specific case, that I will try to explain below, using a table variable is performing better than not using a table variable. I would like to know why, and if possible, get rid of the table variable. this is the query using the table variable: USE [BISource_UAT] GO set statistics io on SET STATISTICS TIME ON SET NOCOUNT ON; DECLARE @OrderStartDate DATETIME = '15-feb-2015' DECLARE @OrderEndDate DATETIME = '28-feb-2016' DECLARE @tmp TABLE ( strBxOrderNo VARCHAR(20) ,sintReturnId INT ) INSERT INTO @tmp SELECT strBxOrderNo ,sintReturnId FROM TABLEBACKUPS.dbo.tblBReturnHistory rh WHERE rh.sintReturnStatusId in ( 3 ) AND rh.dtmAdded >= @OrderStartDate AND rh.dtmAdded 0 AND o.sdtmOrdCreated >= @OrderStartDate this produces the following stats: SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 78 ms, elapsed time = 86 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. Table '#BF0B2154'. Scan count 0, logical reads 1957, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBReturnHistory'. Scan count 1, logical reads 13, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 16 ms, elapsed time = 9 ms. Table 'tblBGiftVoucherPromotion'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBGiftVoucher'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBOrderPaymentGiftVoucher'. Scan count 0, logical reads 452, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBOrderItem'. Scan count 0, logical reads 904, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBOrderPayment'. Scan count 186, logical reads 1649, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBAccountParticipant'. Scan count 0, logical reads 7112, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBOrder'. Scan count 3557, logical reads 14267, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBOrderItemReturn'. Scan count 1951, logical reads 5865, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'tblBReturn'. Scan count 0, logical reads 3902, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table '#BF0B2154'. Scan count 1, logical reads 7, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 125 ms, elapsed time = 138 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. using *showplan_text on* I would like to show the query plan: first part of the query - populating the table variable enter image description here second part of the query: using the table varible and joining the other tables: enter image description here This is the XML plan of the query using table variable. now this is the same query NOT using a table variable: USE [BISource_UAT] GO set statistics io on SET STATISTICS TIME ON SET NOCOUNT ON; DECLARE @OrderStartDate DATETIME = '15-feb-2015' DECLARE @OrderEndDate DATETIME = '28-feb-2016' SELECT op.lngPaymentID ,op.strBxOrderNo ,op.sintPaymentTypeID ,op.strCurrencyCode ,op.strBCCurrencyCode ,op.decPaymentAmount ,op.decBCPaymentAmount ,ap.strAccountCode ,o.sintMarketID ,o.sintOrderChannelID ,o.sintOrderTypeID ,CASE WHEN opgv.lngpaymentID IS NULL THEN NULL -- Not a Voucher = Null WHEN gvp.strIssuedBxOrderNo IS NULL THEN 0 ELSE 1 END AS [IsPromoVoucher] -- Is a Voucher - check type ,o.sdtmOrdCreated FROM TABLEBACKUPS.dbo.tblBReturnHistory rh INNER JOIN TABLEBACKUPS.dbo.tblBReturn r ON r.sintReturnId = rh.sintReturnId AND r.strBxOrderNo = rh.strBxOrderNo INNER JOIN bocss2.dbo.tblBOrder o ON o.strBxOrderNo = r.strBxOrderNo AND o.sdtmOrdCreated >= @OrderStartDate INNER JOIN Bocss2.dbo.tblBOrderPayment op ON op.strBxOrderNo = o.strBxOrderNo INNER JOIN TABLEBACKUPS.dbo.tblBOrderItemReturn AS oir ON r.sintReturnId = oir.sintReturnID AND r.strBxOrderNo = oir.strBxOrderNo AND oir.decReturnFinalAmount > 0 INNER JOIN Bocss2.dbo.tblBOrderItem AS i ON i.strBxOrderNo = oir.strBxOrderNo AND i.sintOrderSeqNo = oir.sintOrderSeqNo INNER JOIN TABLEBACKUPS.dbo.tblBAccountParticipant ap ON o.lngAccountParticipantID = ap.lngParticipantID LEFT OUTER JOIN TABLEBACKUPS.dbo.tblBOrderPaymentGiftVoucher opgv ON op.lngPaymentID = opgv.lngPaymentID LEFT OUTER JOIN TABLEBACKUPS.dbo.tblBGiftVoucher gv ON opgv.strVoucherNumber = gv.strVoucherNumber LEFT OUTER JOIN TABLEBACKUPS.dbo.tblBGiftVoucherPromotion gvp ON gvp.strIssuedBxOrderNo = gv.strIssuedBxOrderNo WHERE rh.sintReturnStatusId in ( 3 ) AND rh.dtmAdded >= @OrderStartDate AND rh.dtmAdded query with table variable query with table variable > query without table variable query without table variable
Asked by Marcello Miorelli (17274 rep)
Apr 11, 2016, 05:11 PM
Last activity: May 23, 2018, 10:51 PM