2011-04-06 2 views
4

SQL Server 2005를 사용하여 다음 시나리오에서 두 테이블을 조인하는 가장 효율적인 방법은 무엇입니까?SQL Server 2005 - 테이블 열의 기준을 기반으로 한 조인

각 테이블의 레코드 수는 약 200,000 개 정도로 상당히 클 수 있습니다.

내가 현재이 작업을 수행 할 수있는 유일한 방법은 커서와 각 항목에 대한 동적 SQL을 사용하여 매우 비효율적 일 것이라고 생각하는 것입니다.

테이블이 두 개 있습니다. PERSON 테이블과 SEARCHITEMS 테이블입니다. SEARCHITEMS 테이블에는 레코드를 PERSON 테이블과 일치시킬 때 사용할 간단한 조건이있는 열이 있습니다. 조건은 PERSON 테이블의 모든 열을 참조 할 수 있습니다. 예를 들어

주어진 다음의 표 :

PERSON 테이블

PERSONID FIRSTNAME LASTNAME GENDER AGE ... VARIOUS OTHER COLUMNS 
1   Fred  Bloggs M  16 
.... 
200000  Steve  Smith M  18 

SEARCHITEMS 테이블 같은 것을 포함해야

ITEMID   DESCRIPTION  SEARCHCRITERIA 
1    Males   GENDER = 'M' 
2    Aged 16   AGE=16 
3    Some Statistic {OTHERCOLUMN >= SOMEVALUE AND OTHERCOLUMN < SOMEVALUE} 
.... 
200000   Males Aged 16 GENDER = 'M' AND AGE = 16 

RESULTS 테이블 :

ITEMID   DESCRIPTION  PERSONID LASTNAME 

1    Males    1   Bloggs 
1    Males    200000  Smith 
2    Aged 16   1   Bloggs 
.... 
200000   Males Aged 16  1   Bloggs 
을 691,363,210

그냥

INSERT INTO RESULTSTABLE 
    SELECT * 
    FROM PERSON P 
    LEFT JOIN SEARCHITEMS SI ON (APPLY SI.SEARCHCRITERIA TO P) 

같은 것을 할 수있을 것이 좋을 것이다 그러나 나는이 작품을 만드는 방법을 볼 수 없습니다. 어떤 도움이나 아이디어라도 감사합니다.

+0

정확히 어떤 문제를 해결하려고합니까? 이 2 개의 테이블을 조인하기위한 요구 사항입니까? – Ali

+0

요구 사항은 일치하는 레코드의 결과를 결과 테이블에 삽입하는 것입니다. 꼭 필요하지는 않습니다. 조인을 효율적으로 사용해야합니다. 결과적으로 조인이 궁극적으로 가장 효율적이라는 것을 알 수 있습니다. –

+0

나는 사람과 검색 항목 사이에 중간 테이블을 가져야한다고 생각한다. 왜냐하면 현재 결과 테이블의 크기가 비례하여 폭발하기 때문이다. 나는 그것에 대해 생각해 보았고 모든 검색 기준 조합을 알지 못하면 커서를 사용하여 더 나은 해결책을 찾지 못했습니다. – Ali

답변

-1

동적으로 TSQL을 빌드 한 다음 sp_executesql으로 실행할 수 있습니다.

5

SEARCHITEMS 테이블이 본질적으로 비 관계형임을 알면 커서 및 동적 SQL 솔루션이 유일한 실행 가능한 것으로 보입니다. 물론 이것은 매우 느릴 것이며 결과를 다소 견딜 수 있도록 "사전 계산"할 것입니다.

이 다음 테이블을 작성하려면 다음을 수행

CREATE TABLE MATCHEDITEMS(
    ITEMID int NOT NULL 
     CONSTRAINT fkMatchedSearchItem 
     FOREIGN KEY 
     REFERENCES SEARCHITEMS(ITEMID), 
    PERSONID int 
     CONSTRAINT fkMatchedPerson 
     FOREIGN KEY 
     REFERENCES PERSON(PERSONID) 
     CONSTRAINT pkMatchedItems 
     PRIMARY KEY (ITEMID, PERSONID) 
     ) 

테이블은 많은 양의 데이터가 포함됩니다,하지만 가게를 고려하면 2 개 INT 컬럼 디스크의 공간이 작을 것이다.

다음 트리거를 만들고이 테이블을 갱신하려면

  • 규칙이 변경되거나 추가 될 때마다 MATCHEDITEMS 테이블을 채울 SEARCHITEMS 테이블에 트리거.
  • 업데이트되거나 추가 된 PERSON 레코드에 대한 규칙을 실행할 PERSON 테이블의 트리거.

결과는 3 개의 테이블을 결합하여 간단하게 나타낼 수 있습니다.

SELECT m.ITEMID, m.DESCRIPTION, m.PERSONID, p.LASTNAME 
FROM MATCHEDITEMS m 
JOIN PERSON p 
    ON m.PERSONID = p.PERSONID 
JOIN SEARCHITEMS s 
    ON m.ITEMID = s.ITEMID 
+0

+1은 현명한 해결 방법을 제시합니다. 나는 더 나은 해결책이 존재한다고 생각하지 않는다. 그리고 적어도 초기로드가 완료되면 트리거로 업데이트 된 상태로 유지 될 것이다. –

+0

답변 해 주셔서 감사합니다. 트리거를 사용하여 테이블을 업데이트한다는 생각을하지 못했습니다. –