我有一個視圖,它具有相當複雜的查詢(請參見下文)。然後我使用這個視圖將數據插入到另一個表中。我在數據庫中有很多數據,當我運行插入查詢時,它會運行8個小時,並且只在最後進行實際插入。它似乎首先從視圖中提取所有結果,然後將其插入到我的表中。是否可以分別插入每條記錄?視圖中的T-SQL長時間運行查詢
這裏是視圖:
CREATE VIEW [dbo].[Enrollment]
AS
WITH CTE AS (SELECT RN = ROW_NUMBER() OVER (PARTITION BY PRIMARYPROVIDERCODE, CLIENTNUMBER
ORDER BY PRIMARYPROVIDERCODE, CLIENTNUMBER, STARTINGDATE), ID, PRIMARYPROVIDERCODE, CLIENTNUMBER, STARTINGDATE, ENDINGDATE
FROM AUTHORIZE
WHERE DOCREVNO = 0 AND CMT = 'N'
GROUP BY PRIMARYPROVIDERCODE, CLIENTNUMBER, STARTINGDATE, ENDINGDATE, ID)
SELECT [Current Row].ID, [Current Row].RN, [Current Row].PRIMARYPROVIDERCODE, [Current Row].CLIENTNUMBER, [Current Row].STARTINGDATE,
ENDINGDATE =
(SELECT TOP 1 [Next Ending].ENDINGDATE
FROM CTE[Next Ending]
WHERE [Next Ending].RN >= [Current Row].RN AND [Next Ending].ENDINGDATE IS NOT NULL AND
[Next Ending].PRIMARYPROVIDERCODE = [Current Row].PRIMARYPROVIDERCODE AND
[Next Ending].CLIENTNUMBER = [Current Row].CLIENTNUMBER
ORDER BY [Next Ending].RN)
FROM CTE[Current Row] INNER JOIN
CTE[Previous Row] ON ([Previous Row].PRIMARYPROVIDERCODE = [Current Row].PRIMARYPROVIDERCODE AND
[Previous Row].CLIENTNUMBER = [Current Row].CLIENTNUMBER) AND (([Previous Row].RN = [Current Row].RN AND [Current Row].RN = 1) OR
([Previous Row].RN = [Current Row].RN - 1 AND [Previous Row].ENDINGDATE IS NOT NULL))
下面是INSERT查詢:
INSERT INTO [dbo].[clientenrollment]
([DOCSERNO]
,[DOCREVNO]
,[USERID]
,[SIGNED]
,[TIMESTAMP]
,[ClientNumber]
,[enrollmentdate]
,[terminationdate]
,[PrimaryProviderCode]
,[Action]
,[Providername]
,[SERVICEMAPCODE])
SELECT REPLACE(STR(6620100322000000 + row_number() over (order by ev.ID asc), 17, 0), ' ', '0')
,0
, NULL
, 0
, GETDATE()
,ev.CLIENTNUMBER
,ev.STARTINGDATE
,ev.ENDINGDATE
,ev.PRIMARYPROVIDERCODE
,auth.ACTION
,p.PROVIDERNAME
,ms.MapCode
FROM [dbo].[Enrollment] AS ev
JOIN AUTHORIZE auth ON auth.ID = ev.ID
LEFT JOIN MasterService ms ON ms.Code = auth.SERVICECODE
LEFT JOIN PROVIDER p ON p.PROVIDERCODE = ev.PRIMARYPROVIDERCODE
WHERE p.DOCREVNO = 0
它獲取/插入多少條記錄需要8小時才能執行? – Thakur 2012-04-17 19:35:31
我不知道確切的記錄數,因爲我沒有訪問實時數據庫,但是有從2000年開始的數據。 – andr111 2012-04-17 19:39:03
此代碼左加入提供者p ON p.PROVIDERCODE = ev.PRIMARYPROVIDERCODE WHERE p。 DOCREVNO = 0將內連接變成左連接。 http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN這不是你的性能問題,但它確實意味着你很可能得到了錯誤的記錄集。 – HLGEM 2012-04-17 20:58:46