쓰기가 많은 제품에 대한 데이터베이스가 있습니다. 방금 SSD를 갖춘 새로운 서버 시스템을 구입했습니다. 놀랍게도 저장 속도가 훨씬 느린 기존 컴퓨터보다 삽입 속도가 빠르지 않았습니다. 벤치마킹 과정에서 SQL Server 프로세스에서 표시되는 IO 비율이 매우 낮다는 것을 알았습니다.
예를 들어 루프 주변에 BEGIN TRAN 및 COMMIT를 추가 한 것을 제외하고는 이 페이지 에서 찾은 스크립트를 실행했습니다 . 기껏해야 디스크 사용량이 7Mb / s에 달하는 반면 CPU는 거의 5 %에 닿지 않았습니다. 서버에 64Gb가 설치되어 있고 10을 사용 중입니다. 총 실행 시간은 첫 번째 호출의 경우 2 분 15 초이고 후속 호출의 경우 약 1 분입니다. 데이터베이스가 단순 복구 상태이며 테스트 중에 유휴 상태입니다. 각 통화 사이에 테이블을 삭제했습니다.
왜 그렇게 간단한 스크립트가 그렇게 느려 집니까? 하드웨어는 거의 사용되지 않습니다. 전용 디스크 벤치마킹 도구와 SQLIO는 모두 SSD가 읽기 및 쓰기 속도가 500Mb / s 이상의 속도로 올바르게 작동 함을 나타냅니다. 임의 쓰기가 순차적 쓰기보다 느리다는 것을 이해하지만 클러스터 인덱싱이없는 테이블에 이와 같은 간단한 삽입이 훨씬 빠를 것으로 예상합니다.
궁극적으로 우리의 시나리오는 훨씬 더 복잡하지만 간단한 사례를 먼저 이해해야한다고 생각합니다. 간단히 말해서 우리의 응용 프로그램은 오래된 데이터를 삭제 한 다음 SqlBulkCopy를 사용하여 새 데이터를 준비 테이블에 복사하고 필터링을 수행 한 다음 마지막으로 데이터를 최종 테이블에 복사하는 경우에 따라 MERGE 및 / 또는 INSERT INTO를 사용합니다.
-> 편집 1 : Martin Smith와 연결된 절차를 따르면 다음과 같은 결과가 나타납니다.
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
NETWORK_IO가 표시하는 결과가없고 SQL 파일 이외의 다른 곳으로 전송할 데이터가 없다는 점을 고려하면 NETWORK_IO가 대부분 시간이 걸린다는 것을 알았습니다. NETWORK_IO 유형에 모든 IO가 포함됩니까?
-> 편집 2 : 20Gb RAM 디스크를 만들고 거기에서 데이터베이스를 마운트했습니다. SSD에서 가장 좋은 시간은 48 초이며 RAM 디스크는 37 초로 줄었습니다. NETWORK_IO는 여전히 가장 큰 대기입니다. RAM 디스크에 대한 최대 쓰기 속도는 약 250Mb / s이며 초당 수 기가 바이트를 수행 할 수 있습니다. 여전히 많은 CPU를 사용하지 않았으므로 SQL을 유지하는 것은 무엇입니까?
NETWORK_IO
메시지는 3 백만 개의 "1 개의 행 영향을받는"메시지가 전송 된 것일 수 있습니다. SET NOCOUNT ON
스크립트에 추가하려고 했습니까 ?
EE_WaitStats*.xel
하므로 오래된 카드 는 결과를 오염시킵니다.
SET NOCOUNT ON
그것에 덧붙일 것이다 .