2012-01-05 6 views
0

여기 나는 한 가지 더 어려운 문제에 직면하고 있으며 도움을 얻기 위해이 사이트를 켜고 있습니다.단일 테이블에 다중 삽입

저는 비즈니스 로직을 수행하고 결과를 테이블에 삽입하는 하나의 웹 서비스를 보유하고 있습니다. 내 응용 프로그램이 최소한의로드로 작동하면 정상적으로 작동합니다.

로드가 무거 우면 내 INSERT SQL 문 시간이 초과되었습니다. 연결 시간 초과 및 명령 시간 초과가 증가했습니다. 그러나 문제는 같은 웹 메서드를 호출하는 스레드가 너무 많다는 것입니다. 그냥 힌트를주고, 무거운 하중에 OPEN SQL 연결의 내 번호는 500 +로 간다. 참고로 모든 명령이 끝난 후에 연결을 종료했습니다.

여기에서이 작업을 최적화하려면 어떻게해야합니까?

INSERT 데이터를 데이터 테이블에 저장하고이 데이터 테이블을 APPLICATION 변수에 저장할 계획입니다. 그리고 2 분마다이 데이터 테이블의 데이터를 데이터베이스에 삽입하십시오.

여기 내 인생을 부드럽게 할 수있는 아이디어가 있습니까? 내가 관리 스튜디오에서

SQL 서버 구문 분석을 삽입 쿼리를 실행하고 시간을 컴파일 할 때

가, 자세한 내용은 여기

편집

감사 : CPU 시간 = 0 밀리 초, 경과 시간 = 0 ms.

SQL Server 구문 분석 및 컴파일 시간 : CPU 시간 = 0 ms, 경과 시간 = 11 ms.

테이블 'IndexTable1'. 스캔 카운트 0, 논리적 읽기 2, 물리적 읽기 0, 미리 읽기 0, 로브 논리적 읽기 0, 로브 물리적 읽기 0, 로브 미리 읽기 0으로 읽습니다.

테이블 'IndexTable2'. 스캔 카운트 0, 논리적 읽기 2, 물리적 읽기 0, 미리 읽기 0, 로브 논리적 읽기 0, 로브 물리적 읽기 0, 로브 미리 읽기 0은 0을 읽습니다.

테이블 'fulltext_index_docidstatus_171147655'. 논리 스캔 횟수 0, 미리 읽기가 물리적 0을 판독하고, 11 판독 0 판독 논리 LOB 0 판독 로브 물리적 0 판독 로브 미리 읽기가 0

테이블 'MAINTABLE'읽는다. 논리 스캔 횟수 0, 로브 물리적 0 판독 로브 미리 읽기가 0

(영향 1 행 (들))

를 판독 논리 LOB 0 판독하고, 미리 읽기 0 판독, 물리 4 판독 (28) 판독

(1 행 영향)

SQL Server 실행 시간 : CPU 시간 = 0 ms, 경과 시간 = 69 ms.

SQL Server 구문 분석 및 컴파일 시간 : CPU 시간 = 0 ms, 경과 시간 = 0 ms.

SQL Server 실행 시간 : CPU 시간 = 0 ms, 경과 시간 = 0 ms.

+0

연결 풀의 크기는 어느 정도입니까? – Jordan

+0

잠재적 인 병목 현상을 확인하려면 응용 프로그램을 완전히 벤치마킹해야합니다. 우선, SQL Server의 "계획 설명"을 익히고 인덱스를 확인한 다음 CPU 성능, RAM 및 디스크 I/O 사용률을 확인하기 위해로드중인 Windows 성능 모니터를 살펴보십시오. 이 링크에서 봐도 다음과 같습니다. 1) http://msdn.microsoft.com/en-us/library/ff647768.aspx 2) http://msdn.microsoft.com/en-us/library/ms178071.aspx – paulsm4

+0

Producer/Consumer 패턴을 보아 공유 컨텍스트에서 삽입을 처리 했습니까? 이렇게하면 연결 수를 제어하고 SqlBulkCopy를 사용할 수 있습니다. – Lloyd

답변

2

DB에 데이터를 삽입하기 위해 전용 스레드를 사용할 수 있습니다.몇 초에 한 번씩 큰 덩어리로 데이터를 삽입 할 수있는 경우 모든 삽입 문에 대해 새 연결을 열지 않아도됩니다. 이 스레드는 전용 디스패처 또는 타이머에서 실행될 수 있으며 스레드 간 통신을 위해 스레드 안전 큐를 사용할 수 있습니다.

1

적절한 서버를 얻는 것에 대해 생각해보십시오. 유감스러운 말이지 만, 하드웨어를 완전히 무시한 채로하는 방식으로 데이터베이스 서버가 대부분 "입출력 제한"인 SQL로드를 실행하기에 본질적으로 적합하지 않은 "전형적인 로우 엔드 호스팅 시스템"이라고 생각하게 만듭니다. 따라서 하이 엔드가 필요합니다 IO 하위 시스템.

+0

높은 CPU가있는 4GM RAM이있는 전용 서버가 있으며 (이 정보는 기억하지 않습니다)이 응용 프로그램 만 실행 중입니다. 서버 – user867198

+0

그래서 장난감 (4GB RAM은 저가형 컴퓨터 - 평균 데스크톱 메모리) 및 가능성이 작은 데스크톱 수준 디스크 하나? IO 오버로드가 궁금하십니까? 데이터베이스 서버 구축에 대한 소개 글이 적절할 수 있습니다. CPU가 데이터베이스와 관련이 없으면 디스크가 과부하되고 일반 디스크는 SLOW - 초당 150 - 200io 작업입니다. – TomTom

0

이 질문에 대한 쉬운 대답은 없습니다. 첫째, 계획에 동시성 문제가 발생할 가능성이 있으므로 데이터 테이블을 잠그려고 시도하는 등 문제가 발생할 수 있습니다.

대개의 경우, 응용 프로그램과 데이터베이스 서버 간의 지속적인 연결을 피하는 것이 좋습니다. 그러나 다른 한편으로는, 500+ 이상의 열린 연결 수는 발생해서는 안되는 것입니다. 나는 이것이 당신이 집중해야 할 것이라고 생각합니다. 나는 당신의 거래가 큰 것 같아요, 그것은 2 초 이상 실행됩니다. 그것을 줄이기 위해 노력하십시오. 로그 작성과 같이 매우 단순하고 처리되지 않은 데이터베이스 테이블에 데이터를 쓰도록 제안 할 수 있습니다. 또한 주기적으로 실행되는 SQL 작업에서 해당 테이블을 읽고이를 병렬로 처리합니다. 시스템이로드를 감지하면 처리를 지연시키는 시스템을 관리 할 수도 있습니다.

주어진 시점에 비슷한 삽입 쿼리가 여러 개있는 경우 위의 내역과 상관없이 System.Data.SqlClient.SqlBulkCopy 클래스를 고려해야합니다.

행운을 빕니다.

+0

SQL SP에 Insert 문이 하나뿐입니다. 나는 SqlBulkCopy 명령에 대해 설명 할 것이다. 좋은 대안을 찾습니다 – user867198

0

이러한 질문에 대한 대답은 병목 곳을 파악하는

시도를 overcomplicated 될 수 있습니다 - 클라이언트 또는 @ 서버 측 @ 그 것이다. 어떤 동시에 select 테이블이 이상 수행 autoincrementing 단일 파티션 차 키 입력 테이블

매우 보통이다 - INSERT에 관련된 인덱스의 어떤 양 및 핫스팟이 테이블의 상단에있을 경우

그것에 삽입 할 때

당신은이 모든 것들과 다른 많은 이유들을 검토하여 어디에 문제가 있는지 찾아야합니다.

+0

프런트 엔드 측면에서 concurrenly 테이블을 통해 수행 한 SELECT 문이 있지만 모든 내 SELECT는 NOLOCK 옵션이 있습니다. 그래서 나는 그것이 어떤 문제를 일으키지 않아야한다고 생각한다. – user867198

0

일리아 년 Kogan의 대답은 합리적인 것 같다 귀하의 질문에 더 가치있는 정보를 제공하기 위해 시도하고 그것은 당신과 같은 맥락에있다. 기본적으로 일괄 삽입은 예약 된 방식으로 수행됩니다. 삽입하는 정보 자체가 비즈니스 로직에서 새로운 요청에 응답하는 데 사용되지 않는 경우에만 작동한다는 것을 명심하십시오. 응답을 발행하면 클라이언트는 두 번째 요청을하기로 결정할 때마다 서버의 상태 변화가 이미 발생했다고 가정합니다. 여기에 2 가지 문제가 발생합니다. 1) 클라이언트에 응답 한 후 나중에 그 요청의 결과를 삽입 할 수 없습니까? 2) 응답을 받으면 클라이언트가 첫 번째 요청의 결과가 계속 유지되지 않는 방식으로 새 요청을 발행하면 어떻게됩니까? 이 두 번째 요청을 처리하기 위해 응용 프로그램에서 데이터로 사용할 것은 무엇입니까? 분명히 알 수 있듯이이 간단한 솔루션으로 인해 다른 문제가 발생할 수 있지만 웹 서비스 설계 방식, 특히 추가 요청을 처리 할 때 각 요청에 대한 지속 된 데이터가 필요한지 여부에 따라 다릅니다.