2011-01-24 2 views
2

많은 유가 증권의 가격 견적을 저장하는 금융 애플리케이션을 설계하고 있습니다. 기록 데이터는 보안 당 수백, 수백만 개의 따옴표가 될 수 있습니다 (그리고 수십만 개의 서로 다른 증권이있을 수 있습니다).SQL Server에서 거대한 테이블을 분해하는 것이 더 좋습니까?

각 보안 따옴표를 별도의 테이블에 보관하는 것이 좋습니까? 아니면 하나의 거대한 테이블을 사용할 수 있습니까?

한 테이블을 사용하는 경우 중복되는 따옴표를 방지하기 위해 symbol + time의 고유 키를 제공해야하지만 여러 테이블을 사용하려면 시간 열에 대해 단일 열 키만 사용해야합니다.

감사합니다 BTW

, 따라서 내가 미리 알아야 할, 내가 엔티티 프레임 워크에 시작하고 이후이 요청하고 그리고 내가 ADO.NET을 추가하지 않고 런타임에 테이블을 생성하는 데 사용할 수 없습니다 보인다 어떤 테이블이 필요한지 (그래서 새로운 증권에 대해 새로운 테이블을 추가 할 수는 없다). 아니면 내가 잘못 했니?

+0

번개가 빠른 NoSQL 데이터베이스 ... http : //www.mongodb.org/display/DOCS/Use+Cases의 혜택을 테스트 할 시간이 있다면. 나 자신을 사용하지 마십시오. – ash

답변

3

절차 적으로 테이블을 생성하는 것은 항상 나쁜 생각입니다. 시스템이 목표를 달성하는 데 너무 오래 걸리면 아마도 어쨌든 OLAP Cube을 고려해야합니다.

+0

왜? 그런 거대한 테이블을 갖는 것은 어떨까요? 나는 10의 gb를 말하고있다. 삽입 및 업데이트 속도가 느려 집니까? – Sol

+0

@ 솔 : RDBMS의 포인트를 이기기 때문에. 테이블 크기에 관해서는, 아니요, 보통의 RDBMS가 삽입 및 업데이트시 전체 데이터베이스 구조를 이동시키지 않기 때문에 삽입 및 업데이트가 크게 혼란해서는 안됩니다. 또한 수천 개의 테이블이 데이터베이스 파일/디렉토리 (MSSQL이 하나의 파일을 사용하고 많은 다른 RDBMS가 디렉토리 (즉, MySQL)을 사용함)에서 올바른 테이블을 가져 오는 경우 자유롭지 않으며 자체적 인 오버 헤드를 지니고 있음을 명심하십시오. –

+0

물리적 스토리지 배열 및 읽기 요구 사항에 따라 다릅니다. 한 행을 읽으면 글을 늦추지 않을 수도 있습니다. 큰 스캔을하고 요약하면 업데이트 문제가 발생할 수 있습니다. SQL은 낮은 수준에서 테이블을 잠글 수 있습니다. 전체 테이블은 일반적으로 잠겨 있지 않으므로 다른 모든 활동이 중지됩니다. – Sam

4

테이블 그러나 그것은 당신의 관심을하지 않을 수 있습니다, 저장을 통해 partitioned 될 수 있습니다

분할 큰 혜택을 제공 할 수 있지만, 그것은 당신의 객체의 구현 관리 오버 헤드 및 복잡성을 추가하는 은 이득보다 많은 부담이 될 수 있습니다. 특히 작은 테이블을 분할하거나 현재 성능을 충족하고 유지 관리 요구 사항을 충족하는 테이블 을 원하지 않을 수 있습니다. 앞서 언급 한 판매 시나리오는 이동 행과의 부담을 완화하기 위해 파티션을 사용하여 데이터를 - 당신은 분할을 구현할지 여부를 를 결정할 때 시나리오가 부담 이 종류가 있는지 여부를 고려해야한다.

또한 데이터를 개별 파일 그룹 (결국 디스크 그룹/어레이)으로 분리하는 것이 목표라면 스토리지 시스템을 사용하여 동일한 목표를 달성 할 수 있습니다 (그룹에 많은 드라이브가있는 SAN LUN, RAID 부하가 분산되도록 많은 드라이브가있는 어레이).

저장 용량이 충분하고 코드가 엄격한 경우 하나의 표를 사용하면 애플리케이션을 사용할 수 있습니다.

+1

+1 -이 설정은 수동으로 수행해야하는 작업이 아니라 테이블 설정이라는 점에 유의하십시오. –

+0

기본적으로 파티션이 많은 것처럼 보이지만 오버 헤드가 없으므로 파티션 분할이 핵심적인 것처럼 보입니다. – Sol

+0

질문 : 마스터 테이블에있는 보안의 "심볼"을 기준으로 파티셔닝을 동적으로 할 수 있습니까?따라서 사용자가 "IBM"을 추가하면 quotes 테이블에 IBM 따옴표 용 파티션이 추가됩니다 (따옴표 표에 기호 열이 있음) – Sol

1

인덱스와 제약 조건을 하나만 선택하면됩니다.

테이블을 파티셔닝 할 수 있지만 그 용도는 성능을위한 것이 아니라 관리를위한 것이므로 이전 데이터를 제거하고 새로운 데이터 파티션을 롤 방식으로 추가 할 수 있습니다. 시간을 제외하고 이것은 아마도 당신에게 유용하지 않습니다; 주식 시세 표시로 파티션을 나누지는 않을 것입니다. 파티션을 관리 할 때 어떤 이점이 있는지 잘 모르겠습니다.

아마도 클러스터 된 인덱스가 시세표 (아마도 시세표 또는 아마도 시세 표시기로 int 대리자)와 시간대가되는 것이 좋습니다.

단순한 데이터 모델에서는 차원 모델과 구분할 수 없지만 데이터웨어 하우스 성능에 대한 차원 모델링을 읽으려면 유용 할 수 있습니다. 직각의 날짜 차원과 시간 차원. 데이터가 intraday 인 경우 단일 datetime 열을 사용할 수 있습니다.

0

증권에 대해 다른 테이블을 사용하지 마십시오. 부디! 이것은 궁극적으로 해결할 문제보다 더 많은 문제를 일으킬 것입니다.

보안을 클러스터 된 인덱스의 첫 번째 열 (8 바이트 이하인 경우 필요한 경우 인공 int 키를 사용)로 만들고 인덱스를 가능한 한 짧게 유지하면 성능이 향상됩니다. 엔진이 쿼리를 만족시키기 위해 검색을 수행해야하는 경우에도 보안은 항상 제공되므로 테이블이나 인덱스에서 범위 검색을 수행합니다.

꼭 필요한 경우 테이블을 분할 할 수 있습니다. SQL 2008 이상에서는 테이블의 일부 행만 덮는 filtered indexes을 만들 수 있습니다.

업데이트는 별도의 테이블에있을 때와 다른 문제가 없습니다.

첫 번째 열로 보안이 설정된 삽입물은 실제로 문제를 제기해서는 안됩니다. 궁극적으로 혼합 된 페이지 (페이지 당 여러 개의 증권)가 없으므로 삽입은 보안 값에 의해 페이지 분리가 발생하지 않으므로 별도의 테이블과 동일하게 정확하게 수행됩니다 (다른 페이지로 인해 발생할 수 있음). 문제).

관련 문제