2016-03-21 6 views
1

私はすべてのSQL Serverをスピードアップして偶然のDBAです。私は恐ろしい平均労働時間と非常に使用されるクエリを持っています。 XMLを使用してストアドプロシージャにデータを渡すことに気付きました。クエリプランは、XMLを変換する時間のほとんどを費やしていることを示しています。私が読んだことはすべて、XMLはTVPよりも約33%遅いと言います。多くの実験の後ストアドプロシージャのSQLのtvpとXMLの速度は同じですか?私のテストやロジックに欠陥がありますか?

SELECT @StartTime=GETDATE() 
exec GetTVPData3 @tvp --or XML method 
SELECT @EndTime=GETDATE() 
SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in millisecs] 

と時間を平均.... XML対TVPは、5msのにより当選XMLを有している:私はこの方法を用いてTVPと比較時間を用いてSPを書き直し。 ????? (550msと545ms)テストやロジックに欠陥がありますか?

StartTimeを取得する前に、XMLとTVPの両方が設定されています。私は2つの異なるSQLテストサーバーでこれを実行して、同様の結果を得ました。

特定のコードはクロス・アプリケーションで使用されています。 SPでの唯一の違いは、次のとおりです。私の頭の中で

**TVP** 
CROSS APPLY (SELECT id AS ProductID, sortorder AS SortOrder FROM @Insert_tvp) Items 

**XML** 
CROSS APPLY (
SELECT f.id.value('@id', 'int') AS ProductID, f.id.value('@sortorder', 'int') AS SortOrder 
FROM @ProductIDs.nodes('list/p') 
AS f(id) 
) Items 

すべては私たちがTVPの使用に切り替えると、XMLを取り除くために必要があると言われます。しかし、私は良い結果を出さずにコーダーを説得することはできません。

EDIT:全XMLのSPを追加:

ALTER PROCEDURE [dbo].[ExtendedDataXML] 

@HostedSiteID INT, 
@ProductIDs XML = NULL, 
@ImageType VARCHAR(20) = NULL 
AS 
BEGIN 

SET NOCOUNT ON; 

SELECT 
    Products.ID AS ItemID, 
    0 AS ItemType, 
    Products.SKU, 
    Products.Title, 
    HSP.Slug, 
    Products.Rank, 
    Products.Rank AS SalesRank, 
    Products.Status, 
    Products.LaunchDate, 
    Products.IsOnline, 
    Products.IsAutoOffline, 
    Products.IsSalableOnline, 
    Products.IsMarketableOnline, 
    Products.LeadIn, Products.LeadOut, 
    COALESCE(Products.CaseQuantity, 1) AS CaseQuantity, 
    COALESCE(Products.MinimumOrderQuantity, 1) AS MinimumOrderQuantity, 
    Products.QuantityOnHand, 
    Image.Filename, Image.Width, Image.Height, Image.Alt, Image.Title, 
    Pricing.Price, Pricing.SalePrice, 
    Products.TruckShipment, 
    HSP.NDescription 
FROM Products 
JOIN HostedSites_Products HSP ON Products.ID = HSP.ProductID 
CROSS APPLY (
    SELECT f.id.value('@id', 'int') AS ProductID, f.id.value('@sortorder', 'int') AS SortOrder 
    FROM @ProductIDs.nodes('list/p') 
    AS f(id) 
) Items 
OUTER APPLY (
    SELECT TOP(1) Filename, Width, Height, Alt, Title 
    FROM Items_Images 
    JOIN Images ON Items_Images.ImageID = Images.ID 
    WHERE Items_Images.ItemID = Products.ID 
    AND Items_Images.ItemType = 0 
    AND Images.Type = COALESCE(@ImageType, '.4b') 
) Image 
OUTER APPLY (
    SELECT TOP(1) Price, SalePrice, CurrentPrice 
    FROM ProductPrices 
    WHERE ProductPrices.ProductID = Products.ID 
    ORDER BY LoRange ASC 
) Pricing 
WHERE Products.ID = Items.ProductID 
AND HSP.HostedSiteID = @HostedSiteID 
AND HSP.Validated = 1 
AND Products.IsMarketableOnline = 1 
ORDER BY Items.SortOrder 
END 
+0

文字列を渡して、この文字列は、あなたのプロシージャ内のテーブルデータに解析されることを意味::。BEGIN...ENDなしの構文は次のようなこれを試す可能性があると非常によく似た文字列(にそれをシリアル化XMLでない場合はXML ...)、反対側のテーブルに戻してもう一度シリアル化してください。ここでは全く同じことをしています... – Shnugo

+0

あなたは重い作業負荷がIDリストを解析する形になるとは思わないので、SPをポストするかもしれません... – Shnugo

+0

今投稿しようとしています。 1683キロ長さです –

答えて

0

CROSS APPLYが行賢明な実行を意味します! (これは、より良いインラインTVF内で行われたこと、フィルタ事実のほかに

を意味するもの - 私が理解限り - あなたは

あなたのID-リストです...何度もあなたのXMLを解析していますTVPは意味渡すXMLを渡す

ALTER PROCEDURE [dbo].[ExtendedDataXML] 

@HostedSiteID INT, 
@ProductIDs XML = NULL, 
@ImageType VARCHAR(20) = NULL 
AS 
BEGIN 

    SET NOCOUNT ON; 
    WITH IDList AS 
    (
     SELECT f.id.value('@id', 'int') AS ProductID, f.id.value('@sortorder', 'int') AS SortOrder 
     FROM @ProductIDs.nodes('list/p') AS f(id) 
    ) 
    SELECT 
     Products.ID AS ItemID, 
     0 AS ItemType, 
     Products.SKU, 
     Products.Title, 
     HSP.Slug, 
     Products.Rank, 
     Products.Rank AS SalesRank, 
     Products.Status, 
     Products.LaunchDate, 
     Products.IsOnline, 
     Products.IsAutoOffline, 
     Products.IsSalableOnline, 
     Products.IsMarketableOnline, 
     Products.LeadIn, Products.LeadOut, 
     COALESCE(Products.CaseQuantity, 1) AS CaseQuantity, 
     COALESCE(Products.MinimumOrderQuantity, 1) AS MinimumOrderQuantity, 
     Products.QuantityOnHand, 
     Image.Filename, Image.Width, Image.Height, Image.Alt, Image.Title, 
     Pricing.Price, Pricing.SalePrice, 
     Products.TruckShipment, 
     HSP.NDescription 
    FROM Products 
    JOIN HostedSites_Products HSP ON HSP.HostedSiteID = @HostedSiteID AND HSP.Validated = 1 AND Products.ID = HSP.ProductID 
    INNER JOIN IDList AS Items ON Items.ProductID=Products.ProductID 
    OUTER APPLY (
     SELECT TOP(1) Filename, Width, Height, Alt, Title 
     FROM Items_Images 
     JOIN Images ON Items_Images.ImageID = Images.ID 
     WHERE Items_Images.ItemID = Products.ID 
     AND Items_Images.ItemType = 0 
     AND Images.Type = COALESCE(@ImageType, '.4b') 
    ) Image 
    OUTER APPLY (
     SELECT TOP(1) Price, SalePrice, CurrentPrice 
     FROM ProductPrices 
     WHERE ProductPrices.ProductID = Products.ID 
     ORDER BY LoRange ASC 
    ) Pricing 
    WHERE Products.IsMarketableOnline = 1 
    ORDER BY Items.SortOrder 
END 
+0

@ Chris.S私はあなたのWHERE基準のいくつかをJOINに移しました。 '@ H​​ostedSiteID'がNULLの場合はどうなりますか?それが存在しない場合はどうなりますか?それが存在しますが、「検証済み」でない場合はどうなりますか?これは「INNER JOIN」なので、おそらく戻ってくることはありません。 – Shnugo

+0

今日これを試してみてください。しかし、私はあなたがそれを釘付けにしていると確信しています。 (私はこのコードを書いておらず、単にそれをきれいにしなければならなかった) –

+0

私は、古いXMLコードavgと比較して10回実行しました。 古い365msあなたの356ms。 これはITVFのほうが良いかもしれないと私は同意します。しかし、私はこの時間をテストするときに何か気づいた。私はハングアップがロック待ちであると信じています。私はこの上に何のためにも私の尾を追いかけています。私は問題が他の場所にあると信じています。助けてくれてありがとう! –

関連する問題