Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
vijays3
Constraint Violating Yak Guru
354 Posts |
Posted - 2011-10-31 : 11:20:20
|
| Hi All,I am finding trouble to optimize this view/query performance.User reported us that below query is taking time and not returning even top 100 records.I looked this query and ran it after down each part and found that this causing trouble at the end where NOT EXISTS clause is used.As a beginner I am not sure how to change this query from NOT EXISTS to in different query so that result could come fast .Please advise what can be possible things I can use in place of NOT EXISTs to get the same records. SELECT top 100 S.ClaimID ,S1.SalesID AS OriginalShipmentSalesID ,C.AnshinPlusID ,AD.Date AS ApprovedDate ,SD.Date AS ShipDate ,O.created_by AS 'ReshipmentOperatedBy' ,O.created_dtm AS 'ReshipCreatedDateTime' ,LRD.Date AS LastReshipDate ,LRD.Date_Int As LastReshipDateID ,PT.PerilType ,MT.MatrixType AS OriginalMatrixType ,SH1.AsurionSKU AS OriginalShippedEquipment ,SL1.ASU_ESN AS OriginalShippedESN ,SH1.Model AS OriginalShippedModel ,SH1.ColorEnglish AS OriginalShippedModelColor ,SH1.Manufacturer AS OriginalShippedHandsetMake ,S1.LineAmount AS OriginalShipHandsetCost -------,SL.SALESID AS ReshippedSalesOrderID ,S.SalesID AS ReshipmentSalesID ,SH.AsurionSKU AS ReshippedEquipment ,SL.ASU_ESN AS ReshippedESN ,SH.Model AS ReshippedModel ,SH.ColorEnglish AS ReshippedModelColor ,SH.Manufacturer AS ReshippedHandsetMake ,S.LineAmount AS ReshipHandsetCost ,(CASE WHEN ISNULL(LRD.Date,SD.Date) < (SELECT Min(I1.PRICEDATE) FROM Master.InventoryPrice I1 WITH (NOLOCK) WHERE I1.ItemId = (SELECT STUFF(HD.AsurionSKU,1,1,'N') FROM Dim.Handset HD WHERE HD.HandsetID = ISNULL(S.ShippedItemID,-1) )) THEN (SELECT TOP 1 I1.Price FROM Master.InventoryPrice I1 WITH (NOLOCK) WHERE I1.ItemId = (SELECT STUFF(HD.AsurionSKU,1,1,'N') FROM Dim.Handset HD WHERE HD.HandsetID = ISNULL(S.ShippedItemID,-1) ) ORDER BY I1.PRICEDATE DESC) ELSE (SELECT I1.Price FROM MASTER.InventoryPrice I1 WITH (NOLOCK) WHERE I1.ItemId = (SELECT STUFF(HD.AsurionSKU,1,1,'N') FROM Dim.Handset HD WHERE HD.HandsetID = ISNULL(S.ShippedItemID,-1) ) AND ISNULL(LRD.Date,SD.Date) BETWEEN I1.PRICEDATE AND ISNULL(I1.EndDate - 1, GETDATE())) END) AS ReshipHandsetNewCost ,ReshipReasonCategory_Level1 ,ReshipReasonCategory_Level2 ,ReshipReasonCategory_Level3 ,TS.Comment AS Comments ,(CASE WHEN TS.DS_Confirmation = 1 THEN N'DS??????' WHEN TS.DS_Confirmation = 2 THEN N'DS??????' WHEN TS.DS_Confirmation = 3 THEN N'DS????' END) AS DSConfirmation ,IRM.ASU_LEVEL1 AS ReasonCategory ,IRM.ASU_LEVEL2 AS ReasonCode ,(CASE WHEN SRRMA.REASONMATCH = 0 THEN 'None' WHEN SRRMA.REASONMATCH = 1 THEN 'No Match' WHEN SRRMA.REASONMATCH = 2 THEN 'Match' WHEN SRRMA.REASONMATCH = 3 THEN 'Not Tested' ELSE 'Unknown' END) AS ReproducibilityTest ,SRRMA.EMPLID AS 'ShipReturnOperatorID' ,DATEADD(HH,9,SRRMA.CREATEDDATETIME) AS 'MatchUnMatchDateTime' ,SRRMA.InspectionComments AS ReproducibilityTestResult FROM Fact.Shipment S WITH (NOLOCK) LEFT JOIN Fact.Shipment S1 WITH (NOLOCK) ON S.ClaimID = S1.ClaimID LEFT JOIN Fact.Claim C WITH (NOLOCK) ON S.ClaimID = C.ClaimID LEFT JOIN SourceAxapta.vSalesLine SL WITH (NOLOCK) ON cast (S.SALESID as nvarchar(20)) = cast(SL.SALESID as nvarchar(20)) AND S.SalesLineNum = SL.LINENUM LEFT JOIN SourceAxapta.vSalesLine SL1 WITH (NOLOCK) ON cast(S1.SALESID as nvarchar(20)) = cast(SL1.SALESID as nvarchar(20)) AND S1.SalesLineNum = SL1.LINENUM INNER JOIN Dim.Handset H WITH (NOLOCK) ON S.ShippedItemID = H.HandsetID INNER JOIN Dim.Handset H1 WITH (NOLOCK) ON S1.ShippedItemID = H1.HandsetID LEFT JOIN Dim.MatrixType MT WITH (NOLOCK) ON S1.MatrixTypeID = MT.MatrixTypeID LEFT JOIN Dim.PerilType PT WITH (NOLOCK) ON C.PerilTypeID = PT.ID LEFT JOIN Dim.Handset SH WITH (NOLOCK) ON S.ShippedItemID = SH.HandsetID LEFT JOIN Dim.Handset SH1 WITH (NOLOCK) ON S1.ShippedItemID = SH1.HandsetID LEFT JOIN SourceAxapta.vSalesTable ST WITH (NOLOCK) ON cast(S.SALESID as nvarchar(20)) = cast(ST.SALESID as nvarchar(20))LEFT JOIN SourceIntelliset.vOrder O WITH (NOLOCK) ON ST.ASU_ISORDERID = O.order_id LEFT JOIN SourceIntelliset.vReshipReasonCategorySource RRC WITH (NOLOCK) ON O.parent_order_id = RRC.order_id LEFT JOIN SourceIntelliset.vTechSupport TS WITH (NOLOCK) ON RRC.order_id = TS.order_id LEFT JOIN SourceAxapta.vASU_SHIPRETURNRMA SRRMA WITH (NOLOCK) ON S1.SALESID = SRRMA.SALESID AND SRRMA.SALESID NOT LIKE '%SO%' LEFT JOIN SourceAxapta.vASU_INSPECTIONREASONMASTER IRM WITH (NOLOCK) ON SRRMA.INSPECTIONREASONSERIALNUMBER = IRM.SERIALNUMBER LEFT JOIN Dim.Date AD WITH (NOLOCK) ON C.ApprovedDateID = AD.ID LEFT JOIN Dim.Date SD WITH (NOLOCK) ON C.ShipDateID = SD.ID LEFT JOIN Dim.Date LRD WITH (NOLOCK) ON S.ShipDateID = LRD.ID WHERE S.SalesID > S1.SalesID AND SL.SALESID NOT LIKE '%SO%' AND SL1.SALESID NOT LIKE '%SO%' AND ST.SALESID NOT LIKE '%SO%' and (S1.ShippedItemID = S.PrevShipmentItemID) AND H.ItemGroupID = 'Phone' AND H1.ItemGroupID = 'Phone' AND S.ShipEventID IN (1,2) AND S1.ShipEventID IN (1,2) AND S.ShippedQty = 1 AND S1.ShippedQty = 1 AND NOT EXISTS (SELECT 1 FROM fact.shipment FS WITH (NOLOCK) INNER JOIN Dim.Handset H2 ON FS.ShippedItemID = H2.HandsetID WHERE H2.ItemGroupID = 'Phone' AND FS.SalesID < S.SalesId AND FS.SalesID > S1.SalesID) AND O.parent_order_id > 0 ThanksVIjay Sahu |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2011-10-31 : 11:25:31
|
| try using LEFT JOIN instead and check for IS NULL condition for relating fields------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
nigelrivett
Master Smack Fu Yak Hacker
3385 Posts |
Posted - 2011-10-31 : 11:35:26
|
| Doesn't make senseYou have a left join on s1 and are using it in the inequality in the subquery. If there is no associated s1 row that will never return a row.s1 is also used i the where clause - so this is an inner join.I would populate a temp table and then use that to optimise the subquery.in factFROM Fact.Shipment S WITH (NOLOCK) LEFT JOIN Fact.Shipment S1 WITH (NOLOCK) ON S.ClaimID = S1.ClaimID How can there not be a row from S1 in that join and presumably you will be returning duplicates. The where clause will remove the equality rows.I think you proibably want to group by claim_id having more than one sales ID. So you want to get a row for each sale or each claim - if for each claim then use the max and min for the subquery.==========================================Cursors are useful if you don't know sql.SSIS can be used in a similar way.Beer is not cold and it isn't fizzy. |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2011-10-31 : 11:45:33
|
| best thing is to show with some sample data with required output so that we can try giving you optimised rewritten query instead------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
vijays3
Constraint Violating Yak Guru
354 Posts |
Posted - 2011-10-31 : 13:01:14
|
| ClaimID ReshipmentSalesID ReshippedEquipment ReshippedESN ReshippedModel ReshippedModelColor ReshippedHandsetMake ReshipHandsetCost ReshipHandsetNewCost6368412 636841205 S900-3744-SH01B 359421020520982 SH-01B Gold Sharp 29300.000000000000 52072.0000000000006474300 647430003 N900-3771-SH06B 355604034814947 SH-06B White Sharp 31556.000000000000 31556.0000000000006502608 650260802 N900-8820-F08B 353168035615945 F-08B Black Fujitsu 27400.000000000000 27400.0000000000006500555 650055502 S900-2120-P905i 359932017422248 P905i Black Panasonic 24323.000000000000 51980.0000000000006501416 650141602 S900-8871-F01B 356772024407680 F-01B White Fujitsu 26180.000000000000 53268.0000000000006501416 650141602 S900-8871-F01B 356772024407680 F-01B White Fujitsu 26180.000000000000 53268.0000000000006501416 650141602 S900-8871-F01B 356772024407680 F-01B White Fujitsu 26180.000000000000 53268.0000000000006502305 650230502 S900-1820-N905iu 355298017521916 N905iu Black NEC 27586.000000000000 48852.0000000000006462304 646230402 S900-1871-N04B 359940017366794 N-04B White NEC 20175.000000000000 52500.0000000000006464821 646482102 S900-2171-P906i 353707024184361 P906i White Panasonic 25486.000000000000 51060.000000000000above given data is from query which is written before NOT EXIST.Please fine the top 10 records with some of the columns from fact.shipment table .SalesLineNum ClaimID ShippedQty ShipEventID ShipEventDateID ShipDateID ShipReturnDateID IsValidShipment PrevShipmentItemID MatrixTypeID1 50006 1 1 38899 38899 -1 1 -1 12 50006 1 1 38899 38899 -1 1 -1 11 50009 1 1 38899 38899 -1 1 -1 12 50009 1 1 38899 38899 -1 1 -1 11 50010 1 1 38899 38899 -1 1 -1 12 50010 1 1 38899 38899 -1 1 -1 11.5 50016 1 1 38900 38900 -1 1 -1 52 50016 1 1 38900 38900 -1 1 -1 53 50016 1 1 38900 38900 -1 1 -1 51 50033 1 1 38902 38902 -1 1 -1 1Smaple data from Dim.Handset table :HandsetID ManuFacturerCode Manufacturer InstallmentJapanese InstallmentEnglish InstallmentRomaji HandsetType HandsetPackage ItemGroupID-1 NULL Unknown ?? Unknown Fumei Unknown Unknown Unknown2 88 Fujitsu ????? Not Eligible Hitaisyou New Kit PHONE3 16 Mitsubishi ????? Not Eligible Hitaisyou New Handset PHONE4 18 NEC ???? Eligible Taisyou New Kit PHONE5 37 Sharp ????? Not Eligible Hitaisyou New Handset PHONE6 18 NEC ????? Not Eligible Hitaisyou New Handset PHONE7 88 Fujitsu ????? Not Eligible Hitaisyou New Handset PHONE8 16 Mitsubishi ????? Not Eligible Hitaisyou New Kit PHONE9 37 Sharp ???? Eligible Taisyou New Kit PHONE10 16 Mitsubishi ????? Not Eligible Hitaisyou New Kit PHONEI hope this data will be enough make it |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2011-10-31 : 13:32:17
|
| and whats the output you're looking at?------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
vijays3
Constraint Violating Yak Guru
354 Posts |
Posted - 2011-10-31 : 14:37:03
|
| user is trying to get the result of the to 100 records from the report.vReshipment view.. report.vReshipment view is created by using my given query ..select top 100 * from report.vReshipment nolock |
 |
|
|
Kristen
Test
22859 Posts |
Posted - 2011-10-31 : 15:11:28
|
| All those "WITH (NOLOCK)" worry me. |
 |
|
|
vijays3
Constraint Violating Yak Guru
354 Posts |
Posted - 2011-10-31 : 23:45:56
|
| Hi KristenShould I remove all NOLOCK ,If I do so it might create a blocking issueThanksVijay Sahu |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
|
|
vijays3
Constraint Violating Yak Guru
354 Posts |
Posted - 2011-11-01 : 13:39:02
|
| It seems this is very difficult to get the exact answer from you Techies without giving you proper question becuase I am also finding tough how to put it so that I can get your ideas.As per your advise inplace of NO EXISTS I have used LEFT join and filtering NULL..I just want your advise will this join work fine in place of NOEXISTwhere co-related query is written. Please advise SELECT S.ClaimID ,S1.SalesID AS OriginalShipmentSalesID ,C.AnshinPlusID ,AD.Date AS ApprovedDate ,SD.Date AS ShipDate ,O.created_by AS 'ReshipmentOperatedBy' ,O.created_dtm AS 'ReshipCreatedDateTime' ,LRD.Date AS LastReshipDate ,LRD.Date_Int As LastReshipDateID ,PT.PerilType ,MT.MatrixType AS OriginalMatrixType ,SH1.AsurionSKU AS OriginalShippedEquipment ,SL1.ASU_ESN AS OriginalShippedESN ,SH1.Model AS OriginalShippedModel ,SH1.ColorEnglish AS OriginalShippedModelColor ,SH1.Manufacturer AS OriginalShippedHandsetMake ,S1.LineAmount AS OriginalShipHandsetCost ---------,SL.SALESID AS ReshippedSalesOrderID ,S.SalesID AS ReshipmentSalesID ,SH.AsurionSKU AS ReshippedEquipment ,SL.ASU_ESN AS ReshippedESN ,SH.Model AS ReshippedModel ,SH.ColorEnglish AS ReshippedModelColor ,SH.Manufacturer AS ReshippedHandsetMake ,S.LineAmount AS ReshipHandsetCost ,(CASE WHEN ISNULL(LRD.Date,SD.Date) < (SELECT Min(I1.PRICEDATE) FROM Master.InventoryPrice I1 WITH (NOLOCK) WHERE I1.ItemId = (SELECT STUFF(HD.AsurionSKU,1,1,'N') FROM Dim.Handset HD WHERE HD.HandsetID = ISNULL(S.ShippedItemID,-1) )) THEN (SELECT TOP 1 I1.Price FROM Master.InventoryPrice I1 WITH (NOLOCK) WHERE I1.ItemId = (SELECT STUFF(HD.AsurionSKU,1,1,'N') FROM Dim.Handset HD WHERE HD.HandsetID = ISNULL(S.ShippedItemID,-1) ) ORDER BY I1.PRICEDATE DESC) ELSE (SELECT I1.Price FROM MASTER.InventoryPrice I1 WITH (NOLOCK) WHERE I1.ItemId = (SELECT STUFF(HD.AsurionSKU,1,1,'N') FROM Dim.Handset HD WHERE HD.HandsetID = ISNULL(S.ShippedItemID,-1) ) AND ISNULL(LRD.Date,SD.Date) BETWEEN I1.PRICEDATE AND ISNULL(I1.EndDate - 1, GETDATE())) END) AS ReshipHandsetNewCost ,ReshipReasonCategory_Level1 ,ReshipReasonCategory_Level2 ,ReshipReasonCategory_Level3 ,TS.Comment AS Comments ,(CASE WHEN TS.DS_Confirmation = 1 THEN N'DS??????' WHEN TS.DS_Confirmation = 2 THEN N'DS??????' WHEN TS.DS_Confirmation = 3 THEN N'DS????' END) AS DSConfirmation ,IRM.ASU_LEVEL1 AS ReasonCategory ,IRM.ASU_LEVEL2 AS ReasonCode ,(CASE WHEN SRRMA.REASONMATCH = 0 THEN 'None' WHEN SRRMA.REASONMATCH = 1 THEN 'No Match' WHEN SRRMA.REASONMATCH = 2 THEN 'Match' WHEN SRRMA.REASONMATCH = 3 THEN 'Not Tested' ELSE 'Unknown' END) AS ReproducibilityTest ,SRRMA.EMPLID AS 'ShipReturnOperatorID' ,DATEADD(HH,9,SRRMA.CREATEDDATETIME) AS 'MatchUnMatchDateTime' ,SRRMA.InspectionComments AS ReproducibilityTestResult into #temp1FROM Fact.Shipment S WITH (NOLOCK) LEFT JOIN Fact.Shipment S1 WITH (NOLOCK) ON S.ClaimID = S1.ClaimID LEFT JOIN Fact.Claim C WITH (NOLOCK) ON S.ClaimID = C.ClaimID LEFT JOIN SourceAxapta.vSalesLine SL WITH (NOLOCK) ON cast (S.SALESID as nvarchar(20)) = cast(SL.SALESID as nvarchar(20)) AND S.SalesLineNum = SL.LINENUM LEFT JOIN SourceAxapta.vSalesLine SL1 WITH (NOLOCK) ON cast(S1.SALESID as nvarchar(20)) = cast(SL1.SALESID as nvarchar(20)) AND S1.SalesLineNum = SL1.LINENUM INNER JOIN Dim.Handset H WITH (NOLOCK) ON S.ShippedItemID = H.HandsetID INNER JOIN Dim.Handset H1 WITH (NOLOCK) ON S1.ShippedItemID = H1.HandsetID LEFT JOIN Dim.MatrixType MT WITH (NOLOCK) ON S1.MatrixTypeID = MT.MatrixTypeID LEFT JOIN Dim.PerilType PT WITH (NOLOCK) ON C.PerilTypeID = PT.ID LEFT JOIN Dim.Handset SH WITH (NOLOCK) ON S.ShippedItemID = SH.HandsetID LEFT JOIN Dim.Handset SH1 WITH (NOLOCK) ON S1.ShippedItemID = SH1.HandsetID LEFT JOIN SourceAxapta.vSalesTable ST WITH (NOLOCK) ON cast(S.SALESID as nvarchar(20)) = cast(ST.SALESID as nvarchar(20))LEFT JOIN SourceIntelliset.vOrder O WITH (NOLOCK) ON ST.ASU_ISORDERID = O.order_id LEFT JOIN SourceIntelliset.vReshipReasonCategorySource RRC WITH (NOLOCK) ON O.parent_order_id = RRC.order_id LEFT JOIN SourceIntelliset.vTechSupport TS WITH (NOLOCK) ON RRC.order_id = TS.order_id LEFT JOIN SourceAxapta.vASU_SHIPRETURNRMA SRRMA WITH (NOLOCK) ON S1.SALESID = SRRMA.SALESID AND SRRMA.SALESID NOT LIKE '%SO%' LEFT JOIN SourceAxapta.vASU_INSPECTIONREASONMASTER IRM WITH (NOLOCK) ON SRRMA.INSPECTIONREASONSERIALNUMBER = IRM.SERIALNUMBER LEFT JOIN Dim.Date AD WITH (NOLOCK) ON C.ApprovedDateID = AD.ID LEFT JOIN Dim.Date SD WITH (NOLOCK) ON C.ShipDateID = SD.ID LEFT JOIN Dim.Date LRD WITH (NOLOCK) ON S.ShipDateID = LRD.ID --LEFT JOIN left Join fact.shipment FS WITH (NOLOCK)on FS.SalesID < S.SalesId AND FS.SalesID > S1.SalesIDLEFT JOIN Dim.Handset H2 ON FS.ShippedItemID = H2.HandsetIDAND H2.ItemGroupID = 'Phone'------WHERE S.SalesID > S1.SalesID AND SL.SALESID NOT LIKE '%SO%' AND SL1.SALESID NOT LIKE '%SO%' AND ST.SALESID NOT LIKE '%SO%' and (S1.ShippedItemID = S.PrevShipmentItemID) AND H.ItemGroupID = 'Phone' AND H1.ItemGroupID = 'Phone' AND S.ShipEventID IN (1,2) AND S1.ShipEventID IN (1,2) AND S.ShippedQty = 1 AND S1.ShippedQty = 1 --AND NOT EXISTS -- (SELECT 1 FROM fact.shipment FS WITH (NOLOCK) -- INNER JOIN Dim.Handset H2 -- ON FS.ShippedItemID = H2.HandsetID -- WHERE H2.ItemGroupID = 'Phone' AND FS.SalesID < S.SalesId AND FS.SalesID > S1.SalesID --) AND O.parent_order_id > 0 AND FS.ShippedItemID IS NULL |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
|
|
|
|
|
|
|