非常に複雑なクエリを持つビューがあります(下記参照)。次に、このビューを使用して別の表にデータを挿入します。データベースにはたくさんのデータがあり、挿入クエリを実行すると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
私は実際のデータベースにアクセスできないため、正確なレコード数はわかりませんが、2000年以降のデータがあります。 – andr111
このコードLEFT JOIN PROVIDER p ON p.PROVIDERCODE = ev.PRIMARYPROVIDERCODE WHERE p。 DOCREVNO = 0は、内部結合を左結合に変えます。 http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOINこれはあなたのパフォーマンスの問題ではありませんが、間違ったレコードセットを取得している可能性があります。 – HLGEM