1

ストアド プロシージャに次の SQL Server クエリがあり、Windows アプリケーションからこのサービスを実行しています。一時テーブル変数に 3,000 万レコードを入力し、それらを前日のレコードと比較してtbl_ref_test_main、さまざまなレコードを追加および削除します。tbl_ref_test_main挿入と削除にはトリガーがあります。トリガーは、別のテーブルに同じレコードを書き込みます。3,000 万件のレコードを比較したため、結果が出るまでに時間がかかり、スローとエラーが発生しました。A severe error occurred on the current command. The results, if any, should be discarded.

任意の提案をお願いします。

前もって感謝します。

-- Declare table variable to store the records from CRM database
DECLARE @recordsToUpload TABLE(ClassId NVARCHAR(100), Test_OrdID NVARCHAR(100),Test_RefId NVARCHAR(100),RefCode NVARCHAR(100));

-- Populate the temp table
INSERT INTO @recordsToUpload
SELECT 
class.classid AS ClassId,
class.Test_OrdID AS Test_OrdID ,    
CAST(ref.test_RefId AS VARCHAR(100)) AS Test_RefId, 
ref.ecr_RefCode AS RefCode                  
FROM  Dev_MSCRM.dbo.Class AS class 
LEFT JOIN Dev_MSCRM.dbo.test_ref_class refClass ON refClass.classid = class.classid
LEFT JOIN Dev_MSCRM.dbo.test_ref ref ON refClass.test_RefId = ref.test_RefId
WHERE class.StateCode = 0
AND (ref.ecr_RefCode IS NULL OR (ref.statecode = 0 AND LEN(ref.ecr_RefCode )<= 18 ))                      
AND LEN(class.Test_OrdID )= 12
AND ((ref.ecr_RefCode IS NULL AND ref.test_RefId IS NULL) 
OR (ref.ecr_RefCode IS NOT NULL AND ref.test_RefId IS NOT NULL));                       

-- Insert new records to Main table
INSERT INTO dbo.tbl_ref_test_main
Select * from @recordsToUpload 
EXCEPT 
SELECT * FROM dbo.tbl_ref_test_main;

-- Delete records from main table where similar records does not exist in temp table
DELETE P FROM dbo.tbl_ref_test_main AS P
WHERE EXISTS
(SELECT P.* 
EXCEPT
SELECT * FROM @recordsToUpload);

-- Select and return the records to upload
SELECT Test_OrdID,
CASE 
WHEN RefCode IS NULL THEN 'NA' 
ELSE RefCode 
END,
Operation AS 'Operation' 
FROM tbl_daily_upload_records 
ORDER BY Test_OrdID, Operation, RefCode;
4

1 に答える 1

0

私の提案は、テーブル変数には 3,000 万行は大きすぎるということです。一時テーブルを作成し、そこにデータを入力してから、そこで分析を実行してみてください。これが不可能/適切でない場合は、おそらく永続的なテーブルを作成し、使用ごとに切り捨てます。

于 2013-02-27T10:13:25.730 に答える