2010-05-18 5 views
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; 

답변

2

서버의 색인이 동일한 지 확인하십시오.

은 또한 통계가 최신 상태인지 확인하십시오 쿼리 실행 계획 (set showplan_text on)

+0

인덱스가 같은 차이를 게시, 추가 지원

SELECT object_name = Object_Name(ind.object_id), IndexName = ind.name, StatisticsDate = STATS_DATE(ind.object_id, ind.index_id) FROM SYS.INDEXES ind order by STATS_DATE(ind.object_id, ind.index_id) desc 

, 통계는 모두 오늘의이 날짜와 계획은 아무런 차이를 보이지 않습니다. udf 결과를 테이블 변수에 저장하도록 SP를 변경 (위 참조)하고 성능을 향상 시켰지만 원본에 커다란 차이가있는 이유는 여전히 알 수 없습니다. –

+0

@ B Thomson : 적어도 실행 계획의 시간은 달라야합니까? 어느 부분이 더 오래 걸리는지 알 수 있습니까? – Andomar

+0

통계가 유효하지 않은 것으로 판명되었으므로 잘못된 데이터베이스에서 쿼리를 실행했습니다. 업데이트 예정된 작업이 새 서버에 설정되지 않은 것 같습니다. –