2013-03-13 2 views
3

우리는 매우 큰 테이블을 가진 SQL Server를 가지고 있습니다 (엄청난 규모는 아닙니다). TABLE_B에서 * 그러나 우리는 그 테이블 중 하나에) 일괄 삽입 캔트 선택 동시에 TABLE_A 및 B)를 말한다 -SQL Server 2008 R2에서 성능 삽입 및 선택

우리는

가) 특정 시간에 (초당 약 1000 개 개의 레코드를 삽입

필요 ID가 = 나는 (a)는 현재와 (b) 약 400ms 일 소요 (우리가 할 수없는 일괄 그들에게 주어진 삽입 당)로드 500 ~ 600 밀리 초 걸리는 것으로 나타났습니다 _SOME_GUID_ID

이 (가 인덱스)

이것은 우리가 찾고있는 성능이 거의 없습니다. 테이블/작업을 최적화 할 수있는 방법이 있습니까?

현재 서버의 RAM 용량은 16GB이며 총 데이터베이스 크기는 약 40GB입니다. 우리는이 테이블이 앞으로 몇 개월 동안 10 배로 커질 것으로 기대합니다. Sql Server로 할 수있는 샤딩이 있습니까? MySQL Percona 빌드를 사용하여 성능 향상을 볼 수 있습니까?

바라건대 말이 되네. 나는 우리가 NHibernate를 사용하고 있다고 덧붙이고 싶었지만, 위에 언급 된 성능은 응용 프로그램이나 nh 오버 헤드를 포함하지 않고 db에 삽입하는 데 소요 된 밀리 초입니다.

덕분에, 야 니스

답변

3

여러 가지가 떠오른다. 기본 키는 GUID 또는 정수입니다. GUID이고 클러스터 된 경우 SQL Server는 순차적으로 여러 위치에 삽입해야합니다. 데이터베이스 크기, 로그 크기 또는 항상 자동 증가합니까? Sizing database files

실행 프로파일 러를 실행하고 nhibernate가 생성하는 SQL의 종류를 확인하십시오. 초당 1000 개의 인서트가 그다지 인상적이지는 않습니다. 병목 현상도 하드웨어 일 뿐이며 크기와 구성이 올바른지 확인하십시오. tempdb, 로그 및 데이터 파일이 같은 드라이브에 있습니까? 이 경우, 별도의 드라이브

또 다른 옵션은 단일 행 대신이 삽입 및 배치를하지 조각 여기

내가 SSMS에서 실행 한 예입니다 삽입을 재 작성하는 것입니다, 그것은 166에서 4999 개 삽입을 수행으로 이동 당신이 트랜잭션의 전체를 감싸는 경우 밀리 초 1000 40 밀리 초

CREATE TABLE Sometest(id INT PRIMARY KEY, 
SomeCol VARCHAR(200), SomeDate DATETIME,SomeCol2 VARCHAR(200), 
SomeDate2 DATETIME,SomeCol3 VARCHAR(200), 
SomeDate3 DATETIME,SomeCol4 VARCHAR(200), SomeDate4 DATETIME) 
GO 




DECLARE @start DATETIME = GETDATE() 
SET NOCOUNT ON 
DECLARE @id INT =1 
WHILE @id < 1000 
BEGIN 
    INSERT Sometest 
    SELECT @id ,'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla111111',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla2222',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla3333',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla4444',GETDATE() 
SET @id+=1 
END 




SELECT DATEDIFF(ms,@start,GETDATE()) 
SELECT COUNT(*) FROM Sometest 

은 23 밀리 초

TRUNCATE TABLE Sometest 
DECLARE @start DATETIME = GETDATE() 
SET NOCOUNT ON 
BEGIN tran 
DECLARE @id INT =1 
WHILE @id < 50000 
BEGIN 
    INSERT Sometest 
    SELECT @id ,'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla111111',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla2222',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla3333',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla4444',GETDATE() 
SET @id+=1 
END 
commit 
SELECT DATEDIFF(ms,@start,GETDATE()) 
SELECT COUNT(*) FROM Sometest 
01에 훨씬 더 빨리, 50000 개 삽입 800 밀리, 103 밀리 초 5000 개 삽입, 1000 개 삽입 될 것이다 23,516,

은 테이블과 문제가 무엇인지, 어쩌면 당신은 조각 모음, 파일, 별도의 파일을 프리 사이즈 필요가 조사처럼 보이는 테이블과 시스템에 그런 일을 실행 테이블 등 등 등

+0

TABLE_A에는 자동 증가 int ID가 있고 TABLE_B에는 GUID ID가 있습니다.우리의 하드웨어가 주어진다면 얼마나 오래 삽입해야 할 것인가? – Yannis

+0

SSMS에서 테스트를 실행하고 테스트하십시오. 테스트하지 않고 문제가 무엇인지 어떻게 알 수 있습니까? 네트워크, 드라이브가 될 수 있습니다. 실제 레이아웃은 무엇입니까, 얼마나 많은 RAM이 SQL Server에서 볼 수 있습니까? 등 성능 테스트 계획은 어떻게 생겼습니까 – SQLMenace

0

귀하의 GUID를 할 수있는 순차적 인 guid 또는 임의의 guid가 무엇인지 알아야합니다. 임시로 비 클러스터형 인덱스를 비활성화하고 삽입이 끝나면 다시 작성할 수 있으므로 해당 기간 동안 해당 테이블에서 느리게 선택하는 것을 고려하지 않아도됩니다. 얼마나 많은 코어와 얼마나 많은 temp dbs가 있습니까? 코어 당 하나의 tempdb (최대 8 코어)를 시도하지만 tempdb 사용을 같게하도록 올바른 추적 falg를 설정해야합니다. 그리고 아래에 설명한대로 삽입물을 일괄 처리하십시오.

관련 문제