2010-05-27 3 views
1

나는 수백만 행의 거래 테이블을 가지고 있습니다. 각 행은 거래의 버전을 나타냅니다. 만약 내가 새로운 거래를 할 수 있다면 무역 표의 최신판과 비교할 것입니다. 변경된 경우 새 버전을 추가합니다. 그렇지 않으면 아무것도 수행하지 않습니다. 2 개의 거래를 비교하기 위해 거래 테이블의 버전을 내 애플리케이션으로 읽었습니다.SQL 서버 업데이트 테이블 항목 비교

수십만 개의 새로운 거래가있을 때 제대로 작동하지 않습니다. 일괄 적으로 읽음으로써 한 번에 1000 개의 거래를 읽고 전체 프로세스를 비교하는 데 몇 분이 걸릴 수 있습니다. 항상 DB에 소비됩니다.

나는 새로운 I/O없이 무역 테이블에있는 것과 아마도 새로운 거래를 비교할 방법을 찾고있다. 지금까지 나와야 할 것은 무역 테이블의 각 행에 해시 열을 추가하는 것입니다. 해시는 모든 거래 분야입니다. 그런 다음 새로운 거래가있을 때 해시를 계산하고 값을 임시 테이블에 넣은 다음 다른 테이블을 찾습니다. 이것은 매우 해킹 된 느낌. 그것을하는 더 좋은 방법이 있습니까?

감사

-

SQL Server 2008

Trade(rowid, tradeid, type, trader, volume, etc..) 일부 추가 정보를 원하시면 - rowid 고유은 tradeid

의 표에 대한이 같은 무역의 차이 버전의 중복됩니다 30 열 및 정규화되지 않으므로 type에 따라 일부 열은일 수 있습니다.. 누군가가 수천 개의 거래를 java 서블릿에 게시합니다. 그러면 변경된 모든 거래에 대해 새 행을 추가해야합니다. 불행히도이 작업을 수행하려면 java 서블릿이 수천 개의 거래 중 하나를 읽고이를 비교해야합니다.

가장 최근의 특정 거래는 가장 높은 rowid를 가진 버전 일뿐입니다.

+0

두 테이블의 스키마 (또는 그 중 일부)를 표시 할 수 있습니까? – Thomas

+0

어떤 버전의 SQL Server입니까? – Thomas

답변

0

해시는 좋지 않습니다. 테이블 구조에 대한 정보를 더 게시하면 도움이 될 것입니다.

표준 방법은 단순히 UPDATE 문을 실행하는 것입니다. WHERE 절은 키 필드에 조인을 포함합니다. WHERE table.PRODUCT_ID = NEWTRADE.PRODUCT_ID; 또한 값 필드를 확인하십시오. WHERE table.TRADE_AMOUNT <> newtrade.BIDAMOUONT; PRODUCT_ID로 표를 색인하면 밀리 초 단위로 실행됩니다.

수천 개의 새로운 거래를 테이블에 삽입 한 다음 UPDATE를 실행하여 메인 테이블을 새로운 거래에 가입시킬 수 있습니다. 다시 말하지만, 테이블에 적절하게 색인을 붙이십시오.

0

당신이 우리에게 말한 것을 감안할 때 행이 변경되었는지를 판단 할 부분을 찾고있는 것처럼 들립니다. 이것은 rowversion 열 (이전에 시간 소인이라고 함)에 대한 좋은 후보입니다. 이 열은 행의 값이 변경 될 때마다 변경됩니다. 따라서 마지막 거래의 rowversion을 현재 rowversion과 비교하여 서로 다른지 확인할 수 있습니다.

테이블 스키마에 대한 몇 가지 추가 세부 정보와 "마지막"결정 방법 및 두 테이블의 행 일치 방법을 표시하는 경우 단일 삽입 문에서이 작업을 수행 할 수 있습니다 (예 : 두 테이블).

1

SQL Server 2008을 사용하는 경우 MERGE 문을 사용할 수 있습니다.

각 거래를 고유하게 식별하는 열에 색인을 생성하십시오.

+0

병합 성명서는 아주 멋지다. 전에 본 적이 없다. 불행히도 그것을 사용하려면 꽤 오래 걸릴 것이 임시 테이블에 모든 가능성이 새로운 거래를 삽입해야 겠어. – Dave

+0

@Dave : 왜 임시 테이블이 필요합니까? –

+0

내가 말하고자하는 것은 병합 문을 사용하기 위해서는 우선 SQL 서버를 사용하거나 SQL 서버를 사용할 수 있어야한다는 것입니다. 그러나 많은 양의 데이터를 전송하는 것은 새 것이 아니기 때문에 너무 오래 걸릴 것입니다. 최소한의 데이터 전송 및 DB 조회로 무엇이 새로운 것인지 말할 수 있기를 바랍니다. – Dave