1
좋아 우리는 표 A XML 정수 목록을 받아 반환하는 간단한 UDF이 : 우리는이 UDFSQL 서버 2008 대 2005 UDF XML을 perfomance 문제
를 사용하여 임시 테이블을 생성 저장 프로 시저에서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)
)
을
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 개 JobNumbers의 간단한 목록의 경우이 값은 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;
인덱스가 같은 차이를 게시, 추가 지원
, 통계는 모두 오늘의이 날짜와 계획은 아무런 차이를 보이지 않습니다. udf 결과를 테이블 변수에 저장하도록 SP를 변경 (위 참조)하고 성능을 향상 시켰지만 원본에 커다란 차이가있는 이유는 여전히 알 수 없습니다. –
@ B Thomson : 적어도 실행 계획의 시간은 달라야합니까? 어느 부분이 더 오래 걸리는지 알 수 있습니까? – Andomar
통계가 유효하지 않은 것으로 판명되었으므로 잘못된 데이터베이스에서 쿼리를 실행했습니다. 업데이트 예정된 작업이 새 서버에 설정되지 않은 것 같습니다. –