2009-08-25 2 views
7

제 작품에는 작은 데이터베이스가 있습니다 (이백 개의 테이블과 어쩌면 백만 개의 행이 있습니다).데이터베이스 쿼리 및 삽입 속도는 무엇에 달려 있습니까?

필자는 항상 초당 수십만의 순서로 매우 빠르며 연결이 설정되면 쿼리가 밀리 초가 걸릴 것으로 예상했습니다.

우리는 약간의 성능 문제를 겪고 있으므로 초당 수백 회의 삽입이 이루어지며 가장 단순한 것조차도 영원히 받아 들일 것입니다.

나는 그것이 표준 행동/성능인지 우리가 잘못하고 있는지 확실하지 않습니다. 예를 들어, 하나의 키 열에 4 개의 테이블을 합치는 것을 의미하는 1500 개의 쿼리는 약 10 초 걸립니다. 제약 조건을 위반하지 않고 간단한 삽입을 사용하여 XML 형식의 300K 데이터를 데이터베이스에로드하는 데 3 분이 걸립니다.

데이터베이스는 SQL Server 2005이며 풍부한 관계 종속성 모델을 가지고 있습니다. 즉, 분류 코드 및 기타 여러 가지 사항에 대한 전체 검사 제약 조건뿐만 아니라 데이터에 대한 많은 관계 및 범주화를 의미합니다.

시간이 맞습니까? 그렇지 않은 경우 실적에 어떤 영향을 미칠 수 있습니까? (모든 쿼리는 인덱싱 된 열에서 수행됩니다.)

답변

5

대략적인 비교 : TPC-C benchmark record for SQL Server은 분당 약 1.2 백만 건의 거래이며, 지난 4 년 간 (64 CPU OS 제한으로 제한됨) 이와 유사합니다. 그건 ~ 16k 초당 거래의 balpark에있는 것입니다. 이것은 슈퍼 하이 엔드 머신, 64 CPU, 많은 RAM, NUMA 노드 당 클라이언트와 결합 된 짧은 클라이언트 I/O 시스템 (각 스핀들의 1-2 % 정도만 사용됨)에 있습니다. TPC-C 트랜잭션을 염두에 두십시오. 따라서 여러 작업으로 구성됩니다 (평균 4-5 개의 읽기와 1-2 개의 쓰기가 있다고 생각합니다).

이 실제 하드웨어의 맨 아래 부분을 실제 배치로 확장해야합니다. 예상 범위를 어디에서 설정해야합니까? OLTP 트랜잭션 처리.

데이터 업로드의 경우 현재 world record is about 1TB in 30 minutes (여전히 최신 인 경우 ...). 초당 수십만 개의 인서트는 심각한 하드웨어에서 제대로 수행 될 때 매우 야심적이지만 성취 할 수 있습니다. 링크의 기사에는 ETL 고 처리량 (예 : 여러 업로드 스트림 사용 및 NUMA 노드에 연결)에 대한 팁과 트릭이 포함되어 있습니다.

상황에 내가 먼저 권합니다 무엇보다도 측정은 그래서 당신은 병목 현상을 발견하고 어떻게 특정 botlenecks를 해결하는 특정 질문을. 좋은 출발점은 Waits and Queues whitepaper입니다.

+0

위 답변입니다. 1 메모, 120 만 TPM = 20,000 TPS. – RBarryYoung

2

"리치 관계 종속성"모델은 빠른 삽입 속도에 도움이되지 않습니다. 모든 제약 조건 (기본 키, 값 검사 및 특히 외래 키)은 삽입 된 모든 레코드에 대해 검사해야합니다. Thats는 "간단한 삽입"보다 훨씬 효과적입니다.

그리고 삽입물에 제약 조건 위반이없는 것은 아닙니다. 외래 키를 확인하는 데 시간이 많이 걸릴 것입니다. 당신이 방아쇠를 당기는 경우가 아니라면, 그들은 더 악화되기 때문입니다.

틀린 점은 Insert 테이블이 반드시 must-have-children "FK 관계를위한 부모 -FK입니다. 다른 테이블에 대한 FK 관계입니다. 그 자식 -FK에 대한 인덱스를 추가하는 것을 잊었습니다. FK 관계의 측면 (이것은 자동이 아니며 종종 잊혀집니다.) 물론 운 좋게되기를 바랄뿐입니다. :-)

5

인덱싱은 여기에서 중요한 요소입니다. 글쎄, 인덱스는 서버뿐만 아니라 인덱스뿐만 아니라 데이터를 업데이 트뿐만 아니라 인덱스를 잊지 기억하십시오. 여기에 트릭은 다음과 같습니다 :

1) 정말 중요한 쿼리를 결정합니다. 쿼리 shou ld는 그들에게 최적의 인덱스를 가지고있다.

2) 여기서도 채우기 요소가 중요합니다. 이렇게하면 나중에 채우기 위해 색인 페이지에 빈 공간이 제공됩니다. 인덱스 페이지가 가득 차면 (충분한 행이 삽입되는 경우), 더 많은 시간이 소요되는 새로운 페이지를 작성해야합니다. 그러나 빈 페이지는 디스크 공간을 차지합니다.

내 트릭은 다음과 같이 내가 우선 순위를 설정 한 각 응용 프로그램이 있습니다 :

1) 읽기 속도 (SELECT), 일부 DELETE 일부 UPDATE -이 우선 순위가 높은이, 더 많은 인덱스가 나는
2를 만들 쓰기의) 속도 (INSERT, 일부 업데이트, 일부 DELETE) - 높은이 우선 순위, 적은 인덱스 나는
3) 디스크 공간 효율 생성 - 높은이 우선 순위가 더 높은 내 채우기 비율

참고 일반적으로이 지식을 SQL Server에 적용되는 경우, 귀하의 마일리지는 다른 DBMS에 따라 다를 수 있습니다.

SQL 문 평가도 여기에서 도움이 될 수 있지만 실제 상황에서는 조잡한 WHERE 및 JOIN 분석이 병목 현상과 쿼리가 고통스러운 부분을 결정하는 데 도움이됩니다. SHOWPLAN을 켜고 계획을 쿼리하고,보고있는 것을 평가하고 그에 따라 계획하십시오.

또한 색인 된 조인 인 SQL Server 2008을 살펴보십시오!

1

제약 조건은 작은 성능 패널티를 추가합니다. 또한 모든 삽입에 대한 색인을 갱신해야합니다. 그리고 단일 트랜잭션에 여러 개의 삽입을 넣지 않으면 데이터베이스 서버는 모든 삽입을 새로운 개별 트랜잭션으로 실행해야하므로 느려질 수 있습니다.

귀하의 데이터에 대해 많이 알지는 않지만 4 개의 테이블을 합치는 150 개의 쿼리가 정상적으로 들립니다.

0

"나는 항상 초당 수십만 개 정도의 순서로 매우 빠르며 연결이 설정되면 쿼리에 밀리 초가 걸릴 것으로 예상했습니다."

(a) 데이터베이스 성능은 메모리 입출력 데이터베이스를 사용하는 일부 소규모 사이트가 아닌 한 물리적 I/O 양에 따라 99 %가 달라 지므로 메모리 입출력을 수행 할 때까지 물리적 I/O를 모두 망칠 수 있습니다. 하루 완료). (b) 데이터베이스 I/O는 데이터 파일에 대한 실제 물리적 I/O뿐만 아니라 저널/로그/...를 유지하기위한 물리적 I/O도 포함합니다 (저널링은 종종 이중 모드에서도 수행됩니다 ie 약 두 십 년 정도 말하기 때문에). (c) "삽입 량"이 "물리적 I/O 양"에 해당하는 방식은 데이터베이스 설계자가 실제 설계를 최적화하는 데 사용할 수있는 옵션의 수에 따라 완전히 결정됩니다. SQL 시스템은 대부분 "수만 개의 삽입 (insert)"을 물리적 인 I/O의 "수십만"으로 변환하는 데 필요한 옵션을 제공하지 못하는 경우가 대부분입니다. "수만 개의 삽입물"은 일반적으로 "수십 초"를 의미하는 "수천 개의 물리적 I/O"를 의미합니다.

당신의 메시지는 "삽입 속도가 매우 빠릅니다 ("초당 수만 ")" "쿼리가 더 느립니다"("쿼리 당 밀리 초", "1000 개 미만의 쿼리 초당"). 그 기대는 어리 석다.

+0

기대는 내가 사용하고있는 쿼리가 삽입물보다 훨씬 복잡하다는 사실 때문이었습니다. –

관련 문제