私はすべての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
文字列を渡して、この文字列は、あなたのプロシージャ内のテーブルデータに解析されることを意味::。
BEGIN...END
なしの構文は次のようなこれを試す可能性があると非常によく似た文字列(にそれをシリアル化XMLでない場合はXML ...)、反対側のテーブルに戻してもう一度シリアル化してください。ここでは全く同じことをしています... – Shnugoあなたは重い作業負荷がIDリストを解析する形になるとは思わないので、SPをポストするかもしれません... – Shnugo
今投稿しようとしています。 1683キロ長さです –