r_i_x
asked on
Stored Procedure Running Slow
I have a simple stored procedure that accepts two arguments. The procedure has been running fine and then all of a sudden, it is now taking over 30 seconds to return (in Query Analyzer). I take the query out of the SP and run it through Query Analyzer and it runs in less than 3 seconds.
I have tried recompiling but with no change.
Thoughts?
I have tried recompiling but with no change.
Thoughts?
Please post Query.....
Also take a look at the Execution Plan and see if you are loosing time some where specific.
This is How>> Befor you run your query on Query analyzer press Ctrl-K and then run the query.
At the bottom left of the Query analyzer there will be a Execution plan tab.
Also take a look at the Execution Plan and see if you are loosing time some where specific.
This is How>> Befor you run your query on Query analyzer press Ctrl-K and then run the query.
At the bottom left of the Query analyzer there will be a Execution plan tab.
It also depend on the traffic of your server at the particular time you are run the SP.
agree - Drop, then recreate the SP some time help with SQL 2000, but never see anything different in SQL 7.0
agree - Drop, then recreate the SP some time help with SQL 2000, but never see anything different in SQL 7.0
ASKER
I have tried dropping and recreating, running it under a different name and creating and altering WITH RECOMPILE but that hasn't helped. I have run it at the same time as running the query through Query Anl but the stored procedure is 10 times slower. I believe that there are some server resource issues however, I would still like to understand the time differences.
Here is the query:
CREATE PROCEDURE dbo.ProductsGet_CS
@JDEORGID as nvarchar(255),
@CATEGORYCODE as nvarchar(255)
WITH RECOMPILE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN
SELECT DISTINCT
[Company_en-US_Catalog].Na me AS Name,
'Company' AS BaseCatalogName,
Company_CatalogProducts.oi d,
Company_CatalogProducts.De finitionNa me,
Company_CatalogProducts.Is Searchable ,
Company_CatalogProducts.cy _list_pric e,
Company_CatalogProducts.Us eCategoryP ricing,
Company_CatalogProducts.[T imeStamp],
Company_CatalogProducts.Or iginalPric e,
Company_CatalogProducts.i_ ClassType,
Company_CatalogProducts.Pa rentOID,
Company_CatalogProducts.Pr oductID + '(Company)' AS ProductID,
Company_CatalogProducts.Va riantID,
Company_CatalogProducts.Pr oductVaria ntCode,
Company_CatalogProducts.La stModified ,
Company_CatalogProducts.Ca talogName,
Company_CatalogProducts.Pr imaryParen tCategory,
Company_CatalogProducts.[# CategoryDi splayName] ,
Company_CatalogProducts.Pr oductCode,
Company_CatalogProducts.Ap provalCode ,
Company_CatalogProducts.Cy cleCountCa tegory,
Company_CatalogProducts.Ef fectiveDat e,
Company_CatalogProducts.Ex pirationDa te,
Company_CatalogProducts.GL Category,
Company_CatalogProducts.In ventoryIte mFlag,
Company_CatalogProducts.It emType,
Company_CatalogProducts.JD EGenericIt emID,
Company_CatalogProducts.Jd eItemId,
Company_CatalogProducts.JD EItemMaste rLastUpdat ed,
Company_CatalogProducts.JD EItemMaste rLastUpdat eID,
Company_CatalogProducts.JD EItemXRefL astUpdated ,
Company_CatalogProducts.JD EItemXRefL astUpdateI D,
Company_CatalogProducts.JD ESupplierC atalogLast Updated,
Company_CatalogProducts.JD ESupplierC atalogLast UpdateID,
Company_CatalogProducts.JD EUOMConver sionLastUp dated,
Company_CatalogProducts.JD EUOMConver sionLastUp dateID,
Company_CatalogProducts.JD EVendorID,
Company_CatalogProducts.JD EVendorIte mID,
Company_CatalogProducts.Li neType,
Company_CatalogProducts.Ma rketCostFl ag,
Company_CatalogProducts.Pa rentCatego ryCode,
ParentCategoryHierarchy.Ca tegoryDisp layName AS ParentCategoryName,
tblCategoryHierarchy.Categ oryDisplay Name AS CategoryName,
Company_CatalogProducts.Pr iceLastUpd ated,
Company_CatalogProducts.Pr imaryLastV endorNo,
Company_CatalogProducts.Pr oductRecor dType,
Company_CatalogProducts.Pu rchaseUOM,
Company_CatalogProducts.Se rialNumber Required,
Company_CatalogProducts.St ockingType ,
ISNULL(Company_CatalogProd ucts.Count ingUOM,
Company_CatalogProducts.UO M) AS UOM,
Company_CatalogProducts.Im age_filena me,
Company_CatalogProducts.Im age_height ,
Company_CatalogProducts.Im age_width,
Company_CatalogProducts.Di splayProdu ctFlag,
ISNULL(Company_CatalogProd ucts.Count ingUOM,
Company_CatalogProducts.UO M) AS CountingUOM,
ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS UOMtoCountingUOMConv,
1 AS PrimaryVendorFlag,
ISNULL(tblOrgProducts.favo ritesflag, 0) AS FavoritesFlag,
tblOrgProducts.PurchasePri ce,
ISNULL(tblOrgProducts.UOMt oPurchaseU OMConv, 1) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS UOMtoPurchaseUOMConv,
ISNULL(tblOrgProducts.Reor derLevel, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS ReorderLevel,
ISNULL(tblOrgProducts.typi calReorder quantity, 0) AS typicalReorderquantity,
(ISNULL(tblOrgProducts.Reo rderLevel, 1) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) * ISNULL(tblOrgProducts.UOMt oPurchaseU OMConv, 1)) AS ReorderLevelUnits,
CASE tblOrgProducts.MinimumOrde rQuantity
WHEN NULL THEN NULL
ELSE tblOrgProducts.MinimumOrde rQuantity / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1)
END AS MinimumOrderQuantity,
CASE tblOrgProducts.MaximumOrde rQuantity
WHEN NULL THEN NULL
ELSE tblOrgProducts.MaximumOrde rQuantity / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1)
END AS MaximumOrderQuantity,
ISNULL(QOH.QtyOnHand, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS QuantityOnHand,
(ISNULL(QOH.QtyOnHand, 0) --* ISNULL(UOMtoCountingUOMCon v, 1)
/ ISNULL(CASE tblOrgProducts.UOMtoPurcha seUOMConv
WHEN 0 THEN 1
ELSE tblOrgProducts.UOMtoPurcha seUOMConv
END, 1))
AS PurchaseUnitsOnHand,
CASE
WHEN ISNULL(UOMtoCountingUOMCon v, 1) = 1 THEN
ISNULL(tblOrgProducts.quan tityOnOrde r, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1)
ELSE
CAST( ISNULL(tblOrgProducts.quan tityOnOrde r, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS numeric(18, 2))
END AS quantityOnOrder,
tblOrgProducts.ActiveItemF lag,
Company_CatalogProducts.Lo adStatus,
CASE tblOrgProducts.taxableitem flag
WHEN 1 THEN 'Y'
WHEN 0 THEN 'N'
END AS TaxableItemFlag,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Vendor_ID
END AS tblVendorID,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END AS VendorName,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN 1
WHEN 'HOMRS' THEN 1
ELSE tblVendor.JDEStatus
END AS ValidVendorCount,
NULL AS BudgetedMRSID,
NULL AS BudgetedMRSDetailID,
NULL AS CapExID,
NULL AS ProjectOID,
NULL AS ProjectDetailID
FROM Company_CatalogProducts INNER JOIN
[Company_en-US_Catalog] ON Company_CatalogProducts.oi d = [Company_en-US_Catalog].[# Catalog_La ng_Oid] INNER JOIN
tblOrgProducts ON Company_CatalogProducts.oi d = tblOrgProducts.oid INNER JOIN
OrganizationObject ON tblOrgProducts.JDEOrgID = OrganizationObject.JDE_ID INNER JOIN
tblVendor ON Company_CatalogProducts.JD EVendorID = tblVendor.JDE_ID LEFT JOIN
(SELECT JDEOrgID, JDEItemID, SUM(QtyOnHand) AS QtyOnHand FROM InvCurrentCounts
WHERE InvCurrentCounts.BusinessD ate =
(SELECT BusinessDate FROM InvTheater WHERE JDEOrgID = @JDEORGID)
GROUP BY JDEOrgID, JDEItemID
) QOH ON convert(varchar, QOH.JDEOrgID) = OrganizationObject.JDE_ID AND
Company_CatalogProducts.JD EItemID = QOH.JDEItemID INNER JOIN
tblCategoryHierarchy ON tblCategoryHierarchy.Categ oryName LIKE Company_CatalogProducts.Pa rentCatego ryCode INNER JOIN
tblCategoryHierarchy ParentCategoryHierarchy ON tblCategoryHierarchy.Paren tCategoryN ame LIKE ParentCategoryHierarchy.Ca tegoryName
WHERE (OrganizationObject.JDE_ID = @JDEORGID) AND (Company_CatalogProducts.P arentCateg oryCode = @CATEGORYCODE OR
(tblOrgProducts.FavoritesF lag = 1 AND Company_CatalogProducts.Pr oductRecor dType IN
(SELECT ProductRecordType FROM tblCategoryHierarchy
WHERE CategoryName = @CATEGORYCODE AND ParentCategoryName IS NULL)))
AND (Company_CatalogProducts.D isplayProd uctFlag = 1)
AND (
(Company_CatalogProducts.J DEVendorID <> '' AND tblOrgProducts.PrimaryVend orFlag >= 0) OR
(Company_CatalogProducts.P roductReco rdType IN ('THEATERMRS', 'HOMRS'))
)
ORDER BY
ParentCategoryHierarchy.Ca tegoryDisp layName,
tblCategoryHierarchy.Categ oryDisplay Name,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END,
[Company_en-US_Catalog].Na me
END
GO
Here is the query:
CREATE PROCEDURE dbo.ProductsGet_CS
@JDEORGID as nvarchar(255),
@CATEGORYCODE as nvarchar(255)
WITH RECOMPILE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN
SELECT DISTINCT
[Company_en-US_Catalog].Na
'Company' AS BaseCatalogName,
Company_CatalogProducts.oi
Company_CatalogProducts.De
Company_CatalogProducts.Is
Company_CatalogProducts.cy
Company_CatalogProducts.Us
Company_CatalogProducts.[T
Company_CatalogProducts.Or
Company_CatalogProducts.i_
Company_CatalogProducts.Pa
Company_CatalogProducts.Pr
Company_CatalogProducts.Va
Company_CatalogProducts.Pr
Company_CatalogProducts.La
Company_CatalogProducts.Ca
Company_CatalogProducts.Pr
Company_CatalogProducts.[#
Company_CatalogProducts.Pr
Company_CatalogProducts.Ap
Company_CatalogProducts.Cy
Company_CatalogProducts.Ef
Company_CatalogProducts.Ex
Company_CatalogProducts.GL
Company_CatalogProducts.In
Company_CatalogProducts.It
Company_CatalogProducts.JD
Company_CatalogProducts.Jd
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.Li
Company_CatalogProducts.Ma
Company_CatalogProducts.Pa
ParentCategoryHierarchy.Ca
tblCategoryHierarchy.Categ
Company_CatalogProducts.Pr
Company_CatalogProducts.Pr
Company_CatalogProducts.Pr
Company_CatalogProducts.Pu
Company_CatalogProducts.Se
Company_CatalogProducts.St
ISNULL(Company_CatalogProd
Company_CatalogProducts.UO
Company_CatalogProducts.Im
Company_CatalogProducts.Im
Company_CatalogProducts.Im
Company_CatalogProducts.Di
ISNULL(Company_CatalogProd
Company_CatalogProducts.UO
ISNULL(Company_CatalogProd
1 AS PrimaryVendorFlag,
ISNULL(tblOrgProducts.favo
tblOrgProducts.PurchasePri
ISNULL(tblOrgProducts.UOMt
ISNULL(tblOrgProducts.Reor
ISNULL(tblOrgProducts.typi
(ISNULL(tblOrgProducts.Reo
CASE tblOrgProducts.MinimumOrde
WHEN NULL THEN NULL
ELSE tblOrgProducts.MinimumOrde
END AS MinimumOrderQuantity,
CASE tblOrgProducts.MaximumOrde
WHEN NULL THEN NULL
ELSE tblOrgProducts.MaximumOrde
END AS MaximumOrderQuantity,
ISNULL(QOH.QtyOnHand, 0) / ISNULL(Company_CatalogProd
(ISNULL(QOH.QtyOnHand, 0) --* ISNULL(UOMtoCountingUOMCon
/ ISNULL(CASE tblOrgProducts.UOMtoPurcha
WHEN 0 THEN 1
ELSE tblOrgProducts.UOMtoPurcha
END, 1))
AS PurchaseUnitsOnHand,
CASE
WHEN ISNULL(UOMtoCountingUOMCon
ISNULL(tblOrgProducts.quan
ELSE
CAST( ISNULL(tblOrgProducts.quan
END AS quantityOnOrder,
tblOrgProducts.ActiveItemF
Company_CatalogProducts.Lo
CASE tblOrgProducts.taxableitem
WHEN 1 THEN 'Y'
WHEN 0 THEN 'N'
END AS TaxableItemFlag,
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Vendor_ID
END AS tblVendorID,
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END AS VendorName,
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN 1
WHEN 'HOMRS' THEN 1
ELSE tblVendor.JDEStatus
END AS ValidVendorCount,
NULL AS BudgetedMRSID,
NULL AS BudgetedMRSDetailID,
NULL AS CapExID,
NULL AS ProjectOID,
NULL AS ProjectDetailID
FROM Company_CatalogProducts INNER JOIN
[Company_en-US_Catalog] ON Company_CatalogProducts.oi
tblOrgProducts ON Company_CatalogProducts.oi
OrganizationObject ON tblOrgProducts.JDEOrgID = OrganizationObject.JDE_ID INNER JOIN
tblVendor ON Company_CatalogProducts.JD
(SELECT JDEOrgID, JDEItemID, SUM(QtyOnHand) AS QtyOnHand FROM InvCurrentCounts
WHERE InvCurrentCounts.BusinessD
(SELECT BusinessDate FROM InvTheater WHERE JDEOrgID = @JDEORGID)
GROUP BY JDEOrgID, JDEItemID
) QOH ON convert(varchar, QOH.JDEOrgID) = OrganizationObject.JDE_ID AND
Company_CatalogProducts.JD
tblCategoryHierarchy ON tblCategoryHierarchy.Categ
tblCategoryHierarchy ParentCategoryHierarchy ON tblCategoryHierarchy.Paren
WHERE (OrganizationObject.JDE_ID
(tblOrgProducts.FavoritesF
(SELECT ProductRecordType FROM tblCategoryHierarchy
WHERE CategoryName = @CATEGORYCODE AND ParentCategoryName IS NULL)))
AND (Company_CatalogProducts.D
AND (
(Company_CatalogProducts.J
(Company_CatalogProducts.P
)
ORDER BY
ParentCategoryHierarchy.Ca
tblCategoryHierarchy.Categ
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END,
[Company_en-US_Catalog].Na
END
GO
If you run it two times in a row, is the second run faster ?
What about Executing the SP from Query Analyzer?? have you tried that??
Exec dbo.ProductsGet_CS "WIth the variables"
Is this fast or Slow?
If this is fast I can tell you that your SP is good.
My next question is how are you Executing the SP?? is it through a ASP page or some kind of an online page??
Exec dbo.ProductsGet_CS "WIth the variables"
Is this fast or Slow?
If this is fast I can tell you that your SP is good.
My next question is how are you Executing the SP?? is it through a ASP page or some kind of an online page??
ASKER
I have executed it by right-clicking and click open and fill in the variables. I have executed it by doing EXEC dbo.ProductsGet_CS with the variables. I have executed it with EXEC dbo.ProductsGet_CS with the variables WITH RECOMPILE. I have run the SP mulitple times and it is always slow.
Now you're understanding the 500 points available?
What's the difference between running the query in QA or running the query in the stored procedure in QA? That's the question.
Now you're understanding the 500 points available?
What's the difference between running the query in QA or running the query in the stored procedure in QA? That's the question.
Can you try to se the Execution Plan by pressing ctl + L in query analyzer for both Query and SP. See if you can make out any difference?
Also can you hardcode the parameters passing and see if it makes a difference.
Can you remove the order By and se if it helps?
Please let us know the results.
I am thinking it could be the way the Execution plan was prepared for Query and SP.
Also can you hardcode the parameters passing and see if it makes a difference.
Can you remove the order By and se if it helps?
Please let us know the results.
I am thinking it could be the way the Execution plan was prepared for Query and SP.
Don't know how you're running the query in QA.
But ff you're running the query in QA with out the (SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED) and both criteria JDEORGID and CATEGORYCODE straight in the where clause, of course this would run much faster. For a accurate comparison,
you might want to run both in QA as follow:
Exec ProductsGet_CS (with variables to pass into the SP)
---AND
Declare @JDEORGID as nvarchar(255),@CATEGORYCOD E as nvarchar(255)
Set @JDEORGID = 'yourdata'
Set @CATEGORYCODE = 'yourdata'
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN
SELECT DISTINCT
[Company_en-US_Catalog].Na me AS Name,
'Company' AS BaseCatalogName,
Company_CatalogProducts.oi d,
Company_CatalogProducts.De finitionNa me,
Company_CatalogProducts.Is Searchable ,
Company_CatalogProducts.cy _list_pric e,
Company_CatalogProducts.Us eCategoryP ricing,
Company_CatalogProducts.[T imeStamp],
Company_CatalogProducts.Or iginalPric e,
Company_CatalogProducts.i_ ClassType,
Company_CatalogProducts.Pa rentOID,
Company_CatalogProducts.Pr oductID + '(Company)' AS ProductID,
Company_CatalogProducts.Va riantID,
Company_CatalogProducts.Pr oductVaria ntCode,
Company_CatalogProducts.La stModified ,
Company_CatalogProducts.Ca talogName,
Company_CatalogProducts.Pr imaryParen tCategory,
Company_CatalogProducts.[# CategoryDi splayName] ,
Company_CatalogProducts.Pr oductCode,
Company_CatalogProducts.Ap provalCode ,
Company_CatalogProducts.Cy cleCountCa tegory,
Company_CatalogProducts.Ef fectiveDat e,
Company_CatalogProducts.Ex pirationDa te,
Company_CatalogProducts.GL Category,
Company_CatalogProducts.In ventoryIte mFlag,
Company_CatalogProducts.It emType,
Company_CatalogProducts.JD EGenericIt emID,
Company_CatalogProducts.Jd eItemId,
Company_CatalogProducts.JD EItemMaste rLastUpdat ed,
Company_CatalogProducts.JD EItemMaste rLastUpdat eID,
Company_CatalogProducts.JD EItemXRefL astUpdated ,
Company_CatalogProducts.JD EItemXRefL astUpdateI D,
Company_CatalogProducts.JD ESupplierC atalogLast Updated,
Company_CatalogProducts.JD ESupplierC atalogLast UpdateID,
Company_CatalogProducts.JD EUOMConver sionLastUp dated,
Company_CatalogProducts.JD EUOMConver sionLastUp dateID,
Company_CatalogProducts.JD EVendorID,
Company_CatalogProducts.JD EVendorIte mID,
Company_CatalogProducts.Li neType,
Company_CatalogProducts.Ma rketCostFl ag,
Company_CatalogProducts.Pa rentCatego ryCode,
ParentCategoryHierarchy.Ca tegoryDisp layName AS ParentCategoryName,
tblCategoryHierarchy.Categ oryDisplay Name AS CategoryName,
Company_CatalogProducts.Pr iceLastUpd ated,
Company_CatalogProducts.Pr imaryLastV endorNo,
Company_CatalogProducts.Pr oductRecor dType,
Company_CatalogProducts.Pu rchaseUOM,
Company_CatalogProducts.Se rialNumber Required,
Company_CatalogProducts.St ockingType ,
ISNULL(Company_CatalogProd ucts.Count ingUOM,
Company_CatalogProducts.UO M) AS UOM,
Company_CatalogProducts.Im age_filena me,
Company_CatalogProducts.Im age_height ,
Company_CatalogProducts.Im age_width,
Company_CatalogProducts.Di splayProdu ctFlag,
ISNULL(Company_CatalogProd ucts.Count ingUOM,
Company_CatalogProducts.UO M) AS CountingUOM,
ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS UOMtoCountingUOMConv,
1 AS PrimaryVendorFlag,
ISNULL(tblOrgProducts.favo ritesflag, 0) AS FavoritesFlag,
tblOrgProducts.PurchasePri ce,
ISNULL(tblOrgProducts.UOMt oPurchaseU OMConv, 1) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS UOMtoPurchaseUOMConv,
ISNULL(tblOrgProducts.Reor derLevel, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS ReorderLevel,
ISNULL(tblOrgProducts.typi calReorder quantity, 0) AS typicalReorderquantity,
(ISNULL(tblOrgProducts.Reo rderLevel, 1) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) * ISNULL(tblOrgProducts.UOMt oPurchaseU OMConv, 1)) AS ReorderLevelUnits,
CASE tblOrgProducts.MinimumOrde rQuantity
WHEN NULL THEN NULL
ELSE tblOrgProducts.MinimumOrde rQuantity / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1)
END AS MinimumOrderQuantity,
CASE tblOrgProducts.MaximumOrde rQuantity
WHEN NULL THEN NULL
ELSE tblOrgProducts.MaximumOrde rQuantity / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1)
END AS MaximumOrderQuantity,
ISNULL(QOH.QtyOnHand, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS QuantityOnHand,
(ISNULL(QOH.QtyOnHand, 0) --* ISNULL(UOMtoCountingUOMCon v, 1)
/ ISNULL(CASE tblOrgProducts.UOMtoPurcha seUOMConv
WHEN 0 THEN 1
ELSE tblOrgProducts.UOMtoPurcha seUOMConv
END, 1))
AS PurchaseUnitsOnHand,
CASE
WHEN ISNULL(UOMtoCountingUOMCon v, 1) = 1 THEN
ISNULL(tblOrgProducts.quan tityOnOrde r, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1)
ELSE
CAST( ISNULL(tblOrgProducts.quan tityOnOrde r, 0) / ISNULL(Company_CatalogProd ucts.UOMto CountingUO MConv, 1) AS numeric(18, 2))
END AS quantityOnOrder,
tblOrgProducts.ActiveItemF lag,
Company_CatalogProducts.Lo adStatus,
CASE tblOrgProducts.taxableitem flag
WHEN 1 THEN 'Y'
WHEN 0 THEN 'N'
END AS TaxableItemFlag,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Vendor_ID
END AS tblVendorID,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END AS VendorName,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN 1
WHEN 'HOMRS' THEN 1
ELSE tblVendor.JDEStatus
END AS ValidVendorCount,
NULL AS BudgetedMRSID,
NULL AS BudgetedMRSDetailID,
NULL AS CapExID,
NULL AS ProjectOID,
NULL AS ProjectDetailID
FROM Company_CatalogProducts INNER JOIN
[Company_en-US_Catalog] ON Company_CatalogProducts.oi d = [Company_en-US_Catalog].[# Catalog_La ng_Oid] INNER JOIN
tblOrgProducts ON Company_CatalogProducts.oi d = tblOrgProducts.oid INNER JOIN
OrganizationObject ON tblOrgProducts.JDEOrgID = OrganizationObject.JDE_ID INNER JOIN
tblVendor ON Company_CatalogProducts.JD EVendorID = tblVendor.JDE_ID LEFT JOIN
(SELECT JDEOrgID, JDEItemID, SUM(QtyOnHand) AS QtyOnHand FROM InvCurrentCounts
WHERE InvCurrentCounts.BusinessD ate =
(SELECT BusinessDate FROM InvTheater WHERE JDEOrgID = @JDEORGID)
GROUP BY JDEOrgID, JDEItemID
) QOH ON convert(varchar, QOH.JDEOrgID) = OrganizationObject.JDE_ID AND
Company_CatalogProducts.JD EItemID = QOH.JDEItemID INNER JOIN
tblCategoryHierarchy ON tblCategoryHierarchy.Categ oryName LIKE Company_CatalogProducts.Pa rentCatego ryCode INNER JOIN
tblCategoryHierarchy ParentCategoryHierarchy ON tblCategoryHierarchy.Paren tCategoryN ame LIKE ParentCategoryHierarchy.Ca tegoryName
WHERE (OrganizationObject.JDE_ID = @JDEORGID) AND (Company_CatalogProducts.P arentCateg oryCode = @CATEGORYCODE OR
(tblOrgProducts.FavoritesF lag = 1 AND Company_CatalogProducts.Pr oductRecor dType IN
(SELECT ProductRecordType FROM tblCategoryHierarchy
WHERE CategoryName = @CATEGORYCODE AND ParentCategoryName IS NULL)))
AND (Company_CatalogProducts.D isplayProd uctFlag = 1)
AND (
(Company_CatalogProducts.J DEVendorID <> '' AND tblOrgProducts.PrimaryVend orFlag >= 0) OR
(Company_CatalogProducts.P roductReco rdType IN ('THEATERMRS', 'HOMRS'))
)
ORDER BY
ParentCategoryHierarchy.Ca tegoryDisp layName,
tblCategoryHierarchy.Categ oryDisplay Name,
CASE Company_CatalogProducts.Pr oductRecor dType
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END,
[Company_en-US_Catalog].Na me
END
GO
But ff you're running the query in QA with out the (SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED) and both criteria JDEORGID and CATEGORYCODE straight in the where clause, of course this would run much faster. For a accurate comparison,
you might want to run both in QA as follow:
Exec ProductsGet_CS (with variables to pass into the SP)
---AND
Declare @JDEORGID as nvarchar(255),@CATEGORYCOD
Set @JDEORGID = 'yourdata'
Set @CATEGORYCODE = 'yourdata'
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN
SELECT DISTINCT
[Company_en-US_Catalog].Na
'Company' AS BaseCatalogName,
Company_CatalogProducts.oi
Company_CatalogProducts.De
Company_CatalogProducts.Is
Company_CatalogProducts.cy
Company_CatalogProducts.Us
Company_CatalogProducts.[T
Company_CatalogProducts.Or
Company_CatalogProducts.i_
Company_CatalogProducts.Pa
Company_CatalogProducts.Pr
Company_CatalogProducts.Va
Company_CatalogProducts.Pr
Company_CatalogProducts.La
Company_CatalogProducts.Ca
Company_CatalogProducts.Pr
Company_CatalogProducts.[#
Company_CatalogProducts.Pr
Company_CatalogProducts.Ap
Company_CatalogProducts.Cy
Company_CatalogProducts.Ef
Company_CatalogProducts.Ex
Company_CatalogProducts.GL
Company_CatalogProducts.In
Company_CatalogProducts.It
Company_CatalogProducts.JD
Company_CatalogProducts.Jd
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.JD
Company_CatalogProducts.Li
Company_CatalogProducts.Ma
Company_CatalogProducts.Pa
ParentCategoryHierarchy.Ca
tblCategoryHierarchy.Categ
Company_CatalogProducts.Pr
Company_CatalogProducts.Pr
Company_CatalogProducts.Pr
Company_CatalogProducts.Pu
Company_CatalogProducts.Se
Company_CatalogProducts.St
ISNULL(Company_CatalogProd
Company_CatalogProducts.UO
Company_CatalogProducts.Im
Company_CatalogProducts.Im
Company_CatalogProducts.Im
Company_CatalogProducts.Di
ISNULL(Company_CatalogProd
Company_CatalogProducts.UO
ISNULL(Company_CatalogProd
1 AS PrimaryVendorFlag,
ISNULL(tblOrgProducts.favo
tblOrgProducts.PurchasePri
ISNULL(tblOrgProducts.UOMt
ISNULL(tblOrgProducts.Reor
ISNULL(tblOrgProducts.typi
(ISNULL(tblOrgProducts.Reo
CASE tblOrgProducts.MinimumOrde
WHEN NULL THEN NULL
ELSE tblOrgProducts.MinimumOrde
END AS MinimumOrderQuantity,
CASE tblOrgProducts.MaximumOrde
WHEN NULL THEN NULL
ELSE tblOrgProducts.MaximumOrde
END AS MaximumOrderQuantity,
ISNULL(QOH.QtyOnHand, 0) / ISNULL(Company_CatalogProd
(ISNULL(QOH.QtyOnHand, 0) --* ISNULL(UOMtoCountingUOMCon
/ ISNULL(CASE tblOrgProducts.UOMtoPurcha
WHEN 0 THEN 1
ELSE tblOrgProducts.UOMtoPurcha
END, 1))
AS PurchaseUnitsOnHand,
CASE
WHEN ISNULL(UOMtoCountingUOMCon
ISNULL(tblOrgProducts.quan
ELSE
CAST( ISNULL(tblOrgProducts.quan
END AS quantityOnOrder,
tblOrgProducts.ActiveItemF
Company_CatalogProducts.Lo
CASE tblOrgProducts.taxableitem
WHEN 1 THEN 'Y'
WHEN 0 THEN 'N'
END AS TaxableItemFlag,
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Vendor_ID
END AS tblVendorID,
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END AS VendorName,
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN 1
WHEN 'HOMRS' THEN 1
ELSE tblVendor.JDEStatus
END AS ValidVendorCount,
NULL AS BudgetedMRSID,
NULL AS BudgetedMRSDetailID,
NULL AS CapExID,
NULL AS ProjectOID,
NULL AS ProjectDetailID
FROM Company_CatalogProducts INNER JOIN
[Company_en-US_Catalog] ON Company_CatalogProducts.oi
tblOrgProducts ON Company_CatalogProducts.oi
OrganizationObject ON tblOrgProducts.JDEOrgID = OrganizationObject.JDE_ID INNER JOIN
tblVendor ON Company_CatalogProducts.JD
(SELECT JDEOrgID, JDEItemID, SUM(QtyOnHand) AS QtyOnHand FROM InvCurrentCounts
WHERE InvCurrentCounts.BusinessD
(SELECT BusinessDate FROM InvTheater WHERE JDEOrgID = @JDEORGID)
GROUP BY JDEOrgID, JDEItemID
) QOH ON convert(varchar, QOH.JDEOrgID) = OrganizationObject.JDE_ID AND
Company_CatalogProducts.JD
tblCategoryHierarchy ON tblCategoryHierarchy.Categ
tblCategoryHierarchy ParentCategoryHierarchy ON tblCategoryHierarchy.Paren
WHERE (OrganizationObject.JDE_ID
(tblOrgProducts.FavoritesF
(SELECT ProductRecordType FROM tblCategoryHierarchy
WHERE CategoryName = @CATEGORYCODE AND ParentCategoryName IS NULL)))
AND (Company_CatalogProducts.D
AND (
(Company_CatalogProducts.J
(Company_CatalogProducts.P
)
ORDER BY
ParentCategoryHierarchy.Ca
tblCategoryHierarchy.Categ
CASE Company_CatalogProducts.Pr
WHEN 'THEATERMRS' THEN NULL
WHEN 'HOMRS' THEN NULL
ELSE tblVendor.Name
END,
[Company_en-US_Catalog].Na
END
GO
Some indexing on your tables should help if they are not Indexed yet.
CREATE TRIGGER NameMe
ON YourTable
FOR insert, UPDATE
AS
BEGIN
--inserted and deleted tables will have the changes for updates.
--You can set your timestamps here
END
--
ASKER
Execution plan is identical for both. Hard coding parameters makes no difference.
Indexing tables won't help. (query runs fast/sp runs slow)
What is the trigger about? (misposted?)
Indexing tables won't help. (query runs fast/sp runs slow)
What is the trigger about? (misposted?)
One thing to look at is the ANSI_NULL and Quoted_identifier values. Please run:
select objectproperty(object_id(' ProductsGe t_CS'), 'ExecIsAnsiNullsOn')
select objectproperty(object_id(' ProductsGe t_CS'), 'ExecIsQuotedIdentOn')
If these are not on, try setting them in your Create Procedure code:
Set ANSI_NULLS ON
Set QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.ProductsGet_CS
@JDEORGID as nvarchar(255),
@CATEGORYCODE as nvarchar(255)
WITH RECOMPILE
AS
....
Then test - do things improve?
(Reference: The below Google Groups thread:
http://groups.google.com/groups?q=Microsoft+SQL+Server+stored+procedure+slow&hl=en&lr=&safe=off&selm=3dcfb867%240%2485006%24e4fe514c%40dreader7.news.xs4all.nl&rnum=8
)
select objectproperty(object_id('
select objectproperty(object_id('
If these are not on, try setting them in your Create Procedure code:
Set ANSI_NULLS ON
Set QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.ProductsGet_CS
@JDEORGID as nvarchar(255),
@CATEGORYCODE as nvarchar(255)
WITH RECOMPILE
AS
....
Then test - do things improve?
(Reference: The below Google Groups thread:
http://groups.google.com/groups?q=Microsoft+SQL+Server+stored+procedure+slow&hl=en&lr=&safe=off&selm=3dcfb867%240%2485006%24e4fe514c%40dreader7.news.xs4all.nl&rnum=8
)
ASKER
both are set to ON.
Some ideas. Try using
SET STATISTICS IO ON
Then run both ways, and see if any table has an increased IO (the output appears in the "messages" tab in QA. If all looks the same, try putting
SELECT GETDATE()
before and after the main select in the SP to *confirm* that the time is actually being lost running the select. If the difference between those times is about how long it takes in QA, then the time is being lost elsewhere (parse and compile, maybe).
BTW, you should specify the schema (usually dbo) before each table and stored prodecure.
e.g
exec dbo.ProductsGet_CS
and
FROM dbo.Company_CatalogProduct s INNER JOIN
SET STATISTICS IO ON
Then run both ways, and see if any table has an increased IO (the output appears in the "messages" tab in QA. If all looks the same, try putting
SELECT GETDATE()
before and after the main select in the SP to *confirm* that the time is actually being lost running the select. If the difference between those times is about how long it takes in QA, then the time is being lost elsewhere (parse and compile, maybe).
BTW, you should specify the schema (usually dbo) before each table and stored prodecure.
e.g
exec dbo.ProductsGet_CS
and
FROM dbo.Company_CatalogProduct
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I see that many people have tried to help you out in vairous ways, so I thought I woul add my 2 cents worth.....
y not break you query up into multiple queries. i.e. perform 2-3 smaller queries and then join them all with 1 big SELECT, joining them together....? You could even try removing the the sections that are doing the divisions into a seperate query, then join it on... I honestly feel like you are trying to do too much in one query.....
indexing on certain columns should also help your cause.
y not break you query up into multiple queries. i.e. perform 2-3 smaller queries and then join them all with 1 big SELECT, joining them together....? You could even try removing the the sections that are doing the divisions into a seperate query, then join it on... I honestly feel like you are trying to do too much in one query.....
indexing on certain columns should also help your cause.
ASKER
Ok, arbert, it is parameter sniffing. I have literally 100s of SPs that hold the same form. Do I need to change them all?
If you can verify that each proc experiences the same behaviour and there is a lot of overhead when the proc runs, I would try and fix it. Otherwise, I wouldn't worry about it (SQL2005 addresses the issue a little bit with better plan caching).
Also, try creating a duplicate of the sproc with a different name, but the same code. Is it also slow? If so, the above will more frequently work.
Finally, if the new version is fast and the old one remains slow, try dropping the old one and renaming the new one.