好的,我们有一个简单的 udf,它接受一个 XML 整数列表并返回一个表:
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;