これで、XML整数リストを取得してテーブルを返す単純なudfができました。
CREATE FUNCTION [dbo].[udfParseXmlListOfInt]
(
@ItemListXml XML (dbo.xsdListOfInteger)
)
RETURNS TABLE
AS
RETURN
( --- parses the XML and returns it as an int table ---
SELECT ListItems.ID.value('.','INT') AS KeyValue
FROM @ItemListXml.nodes('//list/item') AS ListItems(ID)
)
ストアドプロシージャでは、このUDFを使用して一時テーブルを作成します
INSERT INTO @JobTable
(JobNumber, JobSchedID, JobBatID, StoreID, CustID, CustDivID, BatchStartDate, BatchEndDate, UnavailableFrom)
SELECT JOB.JobNumber,
JOB.JobSchedID,
ISNULL(JOB.JobBatID,0),
STO.StoreID,
STO.CustID,
ISNULL(STO.CustDivID,0),
AVL.StartDate,
AVL.EndDate,
ISNULL(AVL.StartDate, DATEADD(day, -8, GETDATE()))
FROM dbo.udfParseXmlListOfInt(@JobNumberList) TMP
INNER JOIN dbo.JobSchedule JOB ON (JOB.JobNumber = TMP.KeyValue)
INNER JOIN dbo.Store STO ON (STO.StoreID = JOB.StoreID)
INNER JOIN dbo.JobSchedEvent EVT ON (EVT.JobSchedID = JOB.JobSchedID AND EVT.IsPrimary = 1)
LEFT OUTER JOIN dbo.Availability AVL ON (AVL.AvailTypID = 5 AND AVL.RowID = JOB.JobBatID)
ORDER BY JOB.JobSchedID;
SQL2005の10個のJobNumberの単純なリストの場合、これは1秒未満で返されますが、2008年には、まったく同じデータに対して7分で返されます。これは、より多くのメモリを備えたはるかに高速なマシン上にあります。何か案は?
代わりにこれを行うためにSPを変更すると、パフォーマンスは2005バージョンと同等になります。
DECLARE @JobNumbers TABLE
(
JobNumber INT NOT NULL
);
INSERT INTO @JobNumbers
(JobNumber)
SELECT * from dbo.udfParseXmlListOfInt(@JobNumberList);
INSERT INTO @JobTable
(JobNumber, JobSchedID, JobBatID, StoreID, CustID, CustDivID, BatchStartDate, BatchEndDate, UnavailableFrom)
SELECT JOB.JobNumber,
JOB.JobSchedID,
ISNULL(JOB.JobBatID,0),
STO.StoreID,
STO.CustID,
ISNULL(STO.CustDivID,0),
AVL.StartDate,
AVL.EndDate,
ISNULL(AVL.StartDate, DATEADD(day, -8, GETDATE()))
FROM @JobNumbers TMP
INNER JOIN dbo.JobSchedule JOB ON (JOB.JobNumber = TMP.JobNumber)
INNER JOIN dbo.Store STO ON (STO.StoreID = JOB.StoreID)
INNER JOIN dbo.JobSchedEvent EVT ON (EVT.JobSchedID = JOB.JobSchedID AND EVT.IsPrimary = 1)
LEFT OUTER JOIN dbo.Availability AVL ON (AVL.AvailTypID = 5 AND AVL.RowID = JOB.JobBatID)
ORDER BY JOB.JobSchedID;