나는 업데이트 테이블 (30 열과 약 150 000 행)에 대한 간단한 쿼리가 있습니다. 예를 들어SQL : 쿼리 시간 초과가 만료되었습니다.
:이 쿼리는 약 2500 행이 영향을받는 것
UPDATE tblSomeTable set F3 = @F3 where F1 = @F1
.
tblSomeTable 트리거가 있습니다
ALTER TRIGGER [dbo].[trg_tblSomeTable]
ON [dbo].[tblSomeTable]
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
declare @operationType nvarchar(1)
declare @createDate datetime
declare @UpdatedColumnsMask varbinary(500) = COLUMNS_UPDATED()
-- detect operation type
if not exists(select top 1 * from inserted)
begin
-- delete
SET @operationType = 'D'
SELECT @createDate = dbo.uf_DateWithCompTimeZone(CompanyId) FROM deleted
end
else if not exists(select top 1 * from deleted)
begin
-- insert
SET @operationType = 'I'
SELECT @createDate = dbo..uf_DateWithCompTimeZone(CompanyId) FROM inserted
end
else
begin
-- update
SET @operationType = 'U'
SELECT @createDate = dbo..uf_DateWithCompTimeZone(CompanyId) FROM inserted
end
-- log data to tmp table
INSERT INTO tbl1
SELECT
@createDate,
@operationType,
@status,
@updatedColumnsMask,
d.F1,
i.F1,
d.F2,
i.F2,
d.F3,
i.F3,
d.F4,
i.F4,
d.F5,
i.F5,
...
FROM (Select 1 as temp) t
LEFT JOIN inserted i on 1=1
LEFT JOIN deleted d on 1=1
END
을 그리고 업데이트 쿼리를 실행하면 나는 시간 제한이있다.
타임 아웃을 방지하기 위해 논리를 어떻게 최적화 할 수 있습니까?
감사합니다.
사실뿐만 아니라, 아마도이 –
@Sam을 조인 대신 모두가 노동 조합을 의도 기록됩니다 나에게 잘못 보인다 : 나는 로그 테이블의 각 레코드는 신규 및 이전 버전을 모두 포함 믿는다 기록들. – Quassnoi
그래, 나는 그것을보고 좋은 반응이 원인 upvote 않았다. 그러나 여기 로깅 메커니즘은 다소 부풀어 오른 것 같습니다. 이전에 같은 행에서 두 번째 행을 사용하는 것과는 대조적으로 더 쉽게 진단 할 수있는 시간을 절약 할 수 있다고 생각합니다. –