2015-02-04 2 views
0

현재 유지 관리를 위해 오프라인 상태 인 24GB RAM이있는 복제 서버가 있습니다. SQL Server 2014를 실행하고 있습니다.내 컴퓨터에서 메모리가 부족한 Sql 쿼리

나는 하나에서 다른 데이터베이스로 일치하는 레코드 수를 찾고 싶습니다. 나는에 대한 ID_NUMBER를 사용하고있어 기록과 일치하는

Database 1 Name: Clients_Records.(Table).Retail_BASE 
Database 2 Name: Clients_Documents.(Table).Documents 

는 각 테이블의 고유하고있는 다른 필요한 필드를 가져온다.

아래의 스크립트가 실행 '과에서 다음 시간을 몇 분 동안 실행 메모리 부족 오류 '입니다.

select [Clients_Records].[dbo].[Retail_BASE].CLIENT_CODE, 
[Clients_Records].[dbo].[Retail_BASE].ID_NUMBER, 
[Clients_Documents].[dbo].[Documents].CBAF8917 AS Document_Type 
from [Clients_Records].[dbo].[Retail_BASE], 
[Clients_Documents].[dbo].[Documents] 
where [Clients_Records].[dbo].[Retail_BASE].ID_NUMBER = [Clients_Documents].[dbo].[Documents].B61DDE99 

내 결과는 다음과 같아야합니다.

CLIENT_CODE ID_NUMBER Document_Type 
1234   111111  Contract 
1234   111111  Agreement 
1234   111111  ID_Document 
1235   111112  Contract 
1235   111112  Agreement 
1236   111113  Agreement 
1237   111114  Contract 
1237   111114  Agreement 
1239   111115  ID_Document 
1240   111116  ID_Document 

여기에 대한 지침이 있습니다.

감사합니다.

답변

0

WHERE 절을 사용하는 대신 테이블간에 JOIN을 시도합니다. 나는 사용 된 최적화가 다를 것이라는 점을 합리적으로 확신하며 이것은 쿼리에 도움이 될 수 있습니다.

select [Clients_Records].[dbo].[Retail_BASE].CLIENT_CODE, 
     [Clients_Records].[dbo].[Retail_BASE].ID_NUMBER, 
     [Clients_Documents].[dbo].[Documents].CBAF8917 AS Document_Type 
from [Clients_Records].[dbo].[Retail_BASE] 
    join [Clients_Documents].[dbo].[Documents] 
     ON [Clients_Records].[dbo].[Retail_BASE].ID_NUMBER = 
       [Clients_Documents].[dbo].[Documents].B61DDE99 

나는 100 % 확실하지 않다,하지만 당신은 WHERE 절과 Table1, Table2 구문과 필터를 사용할 때 내 생각, 그것은 Table2의 모든 기록에 Table1의 모든 레코드를 조인 한 다음 비를 필터링 성냥. 그것은 많은 기억을 필요로 할 것입니다. 특히 ID_NUMBER 또는 B61DDE99 중 하나는 색인화되지 않으며 옵티마이 저가 테이블 스캔을 수행해야합니다.

ETA : 귀하의 의견에 조합 당 하나의 문서 유형이 CLIENT_CODEID_NUMBER 인 것으로 나타났습니다. 이 경우 다음과 같이하면 더 잘 작동 할 수 있습니다.

Documents의 내용을 필터링하여 CUB (Common Table Expresion)를 사용하여 Document_TypeB61DDE99 만 반환한다는 점에 유의하십시오.

;  
WITH Unique_DocumentTypes 
AS (
    SELECT DISTINCT 
      B61DDE99 as ID_NUMBER 
     , CBAF8917 as Document_Type 
    FROM [Clients_Documents].[dbo].[Documents] 
) 
select rb.CLIENT_CODE, 
     rb.ID_NUMBER, 
     dt.Document_Type 
from [Clients_Records].[dbo].[Retail_BASE] rb 
    join Unique_DocumentTypes dt 
     ON rb.ID_NUMBER = dt.ID_NUMBER 
+0

안녕하십니까. 답장을 보내 주셔서 감사합니다. 예외적으로 메모리 예외입니다. – user3906930

+0

데이터를 보면 각 레코드에 대해 두 가지 이상의 문서 형식이 있습니다. ID_Number 1111111처럼 2 개의 계약서, 3 개의 애플리케이션 및 1 개의 계약서가 있습니다. 각 문서에 대해 하나의 문서 유형 만 표시된다는 것을 어떻게 필터링합니까? – user3906930

+0

@ user3906930 원하는 경우 문서 유형과 문서에 대한 추가 정보가 없으면 SELECT DISTINCT를 사용해보십시오 (SELECT 키워드 다음에 첫 번째 열 이름 앞에 DISTINCT 키워드 사용). 그러면 모든 레코드가 고유하게 반환됩니다. –

관련 문제