편집 : 사용하여 SQL Server 2005최적화 SQL 쿼리는 많은 열이 존재하는 절
나는 레거시 데이터베이스에서 행이 이미으로 가져온 여부를 확인하는 쿼리가 새 데이터베이스를 가져오고 이미없는 경우 가져옵니다. 레거시 데이터베이스가 잘못 설계 되었기 때문에 레거시 테이블의 행에 대해 고유 한 ID가 없으므로 휴리스틱을 사용하여 행을 가져 왔는지 여부를 결정해야합니다. (나는 레거시 데이터베이스를 제어 할 권한이 없다.) 새 데이터베이스는 약간 다른 구조를 가지고 있으며, 날짜가 일치하는지, 그룹 번호가 일치하는지 등과 같은 여러 값을 검사해야만 새로운 데이터베이스에 행이 있는지 또는 아니. 그다지 예쁘지는 않지만 인터페이스가있는 레거시 시스템의 나쁜 설계로 인해 선택의 여지가 거의 없습니다.
어쨌든 시스템 사용자는 내가 설계 한 것보다 시스템에서 10 배에서 100 배 더 많은 데이터를 던지기 시작했으며 이제 쿼리가 너무 느리게 실행됩니다. 빨리 할 수있는 방법을 제안 해 주시겠습니까? 다음은 몇 가지 개인 정보 보호를 위해 redadacted 또는 단순화하기로 코드는,하지만 난 내가 중요한 부분 왼쪽 생각 : 스키마, 당신의 첫 번째 단계는 그 하위 쿼리 EXPLAIN
이다 생겼는지 알고하지
INSERT INTO [...NewDatabase...]
SELECT [...Bunch of columns...]
FROM [...OldDatabase...] AS t1
WHERE t1.Printed = 0
AND NOT EXISTS(SELECT *
FROM [...New Database...] AS s3
WHERE year(s3.dtDatePrinted) = 1850 --This allows for re-importing rows marked for reprint
AND CAST(t1.[Group] AS int) = CAST(s3.vcGroupNum AS int)
AND RTRIM(t1.Subgroup) = s3.vcSubGroupNum
AND RTRIM(t1.SSN) = s3.vcPrimarySSN
AND RTRIM(t1.FirstName) = s3.vcFirstName
AND RTRIM(t1.LastName) = s3.vcLastName
AND t1.CaptureDate = s3.dtDateCreated)
@OMGPonies : 세부 정보 ?? 우리는 더러운 정보가 필요하지 않습니다 !! :-) (죄송합니다 - 내부의 농담 - 그냥 "호의"를 되 돌리는 것을 막을 수 없었습니다 ) –
@marc_s : 그건 내 뻔뻔스럽게 Cheech & Chong에게서 털어 놓은 것입니다 : p –
Whoa stupid of me. 물론 당신은 어떤 데이터베이스인지 알아야합니다. 그것은 SQL Server 2005입니다. 왜냐하면 ... 우리는 색인에 알레르기가 있기 때문에 칼럼에 색인이 없습니다. 또는 우리는 그들이 당신의 영혼을 훔쳐 간다고 생각합니다. 또는 뭔가; 나는 왜 그런지 모르지만 나는 그들에게 의존하지 말라고 들었다. – Dennis