2013-08-19 1 views
1

Windows XP SP3에서 MS SQL Server 2008 R2에 수백만 레코드 데이터베이스가 있습니다.ODBC DSN이 MSSQL에서 시간 초과를 느리게합니다.

동료가이 db에 직접 연결하고 적절한 양의 쿼리를 실행하는 .Net 응용 프로그램을 작성했습니다. 나도 몰라. 닷넷,하지만이 응용 프로그램은 ODBC를 사용하여 DB에 연결하지 않을 것이라고 확신합니다.

다른 한편으로 나는이 데이터베이스에 연결하고 인터넷을 통해 다른 곳으로 데이터를 보내기 위해 간단한 쿼리를 실행하는 명령 줄 파이썬 (CPython 버전 2.7.5) 응용 프로그램을 작성했습니다. 데이터베이스 연결은 pyodbc 3.0.7 (설치 프로그램 : http://www.lfd.uci.edu/~gohlke/pythonlibs/)과 SQL Server Native Client 10.0 드라이버를 사용하는 DSN을 사용하여 이루어집니다. 나는 Connection Pooling 탭의이 드라이버에 대한 연결 풀을 사용 해제 및 사용 설정하려고 시도했습니다. Data Sources (ODBC) 애플릿. 스크립트는 db로부터 100 개의 레코드를 전송 한 다음 연결을 닫고 2 분 동안 휴면 모드로 전환 한 다음 다시 실행합니다.

이러한 프로그램은 모두 db와 동일한 시스템에서 지속적으로 실행됩니다.

질문 : .Net 응용 프로그램은 정의 된 DSN을 제거 할 때 멋지게 실행됩니다 (물론 python 스크립트가 실행되고 있지 않음). DSN을 다시 정의하고 Python 스크립트를 시작하여 .Net 앱을 나란히 실행하면 약 5 시간 동안 아무런 문제가 없습니다. 하지만 점차 파이썬 스크립트가 대부분 괜찮 으면서. 닷넷 애플 리케이션은 DB에서 타임 아웃을 시작합니다.

무엇이 잘못 될 수 있습니까?

편집 :, 잘 실행 항상 (ODBC를 사용하여 연결)

파이썬 스크립트. 닷넷 앱은 몇 시간 만 지나면 보통 성능에 뒤진다. 파이썬 스크립트를 닫을 때 .Net 앱이 여전히 남아 있습니다. 하지만 파이썬 스크립트에 대해 정의한 ODBC DSN을 제거하면 .Net 앱이 정상적인 성능으로 돌아갑니다. 매우 이상합니다. 내가 말했듯이 .Net에 대해서는 아무 것도 모른다. 닷넷 앱의 비표준 코드, 아마도 트랜잭션, 잠금, 너무 많은 연결 등의 결과 일 수있다. 낯선 사람을 만들기 위해서 데이터베이스 크기를 절반으로 줄이고 레코드를 삭제하고 인덱스를 다시 작성하면 .Net 앱 문제가 해결 된 것 같습니다.

편집 2 : 파이썬 스크립트가 실행되는

유일한 두 쿼리은 다음과 같습니다

SELECT TOP 100 FROM tbl_data WHERE id > ? ORDER BY id 

SELECT * FROM tbl_data WHERE id = ? 

첫 번째 쿼리는 보통 파이썬의 각 실행에 한 번 실행 스크립트. 두 번째 것은 최대 100 번 실행됩니다. id은 기본 키이므로 색인이 생성됩니다. 당신이 볼 수 있듯이 질의는 더 간단 할 수 없다. 첫 번째 쿼리의 경우 DB 서버에서 커서를 열지 않도록 프로그램의 전체 결과 집합을 읽습니다. 또한 내가 사용하고있는 드라이버에 대해 ODBC 애플릿의 연결 풀링을 해제 했으므로 스크립트를 실행할 때마다 DB 연결이 삭제되고 DB 서버의 모든 리소스가 해제되어야합니다. 스크립트는 2 분 동안 잠자기 후 이것을 반복합니다.

.Net 앱이 실행하는 쿼리는 데이터베이스의 일부 트리거와 결합되어 훨씬 더 복잡합니다. 이상한 것은 그 자체로는 대부분 잘 돌아갑니다. 그러나 DSN이 정의되면 단일 삽입 문에서 긴 대기 시간이 시작되어 때로는 시간 초과가 발생합니다.

또한 Windows와 MSSQL이 Microsoft의 최신 패치로 업데이트되지 않아야하므로 ODBC 드라이버 나 MSSQL 자체의 버그 일 경우 이미 다른 사람들을 위해 해결되었을 수 있습니다.

편집 3

테이블은 PK 인덱스에 클러스터됩니다. 데이터 테이블에는 약 1.5M 레코드가 포함되어 있습니다. DB 크기는 약 160GB입니다. 서버에는 높은 사양이 없습니다. Intel Core i7 2600, 4GB RAM, 일반 1TB SATA 디스크 드라이브.

+0

업데이트 해 주셔서 감사합니다. 기본 키가 클러스터되었거나 클러스터되지 않은 상태입니까? 또한이 서버 (메모리, CPU 등)의 크기는 어느 정도입니까? –

+0

나는 – aalizadeh

+1

질문을 편집했다. 당신의 설명에 따르면, 파이썬 (ODBC) 응용 프로그램이 자원 충돌로 인해 .Net 응용 프로그램을 차단하고있는 것처럼 보입니다.제한 시간은 몇 가지 사항, 자원 경합, 장기 실행 쿼리 및 차단으로 인해 야기 될 수 있습니다. 일반적인 용의자입니다. 성능이 저하되면 활성 연결을 살펴보고 블로킹 문제가 있는지 확인하십시오. –

답변

1

성능에 영향을 미칠 수있는 여러 가지 사항이 있습니다. 리소스 경합, 차선의 SQL Server 구성, 느린 디스크, 누락 된 인덱스 등이있을 수 있습니다.

두 프로세스가 모두 실행 중일 때 시스템 리소스를 모니터링하여 시작할 것입니다. perfmon을 사용하여 OS 및 SQL 카운터를 모니터 할 수 있습니다. 나는 ProcessorInformation/%의 ProcessorTime

하여 LogicalDisk/평균 디스크 초/읽기

하여 LogicalDisk/평균 디스크 초/쓰기

메모리/사용 가능한 공간 (MB)에게

  • 을보고 시작하는 것

    SQLServerBufferManager/BufferCacheHitRatio

    SQLServerBufferManager/PageLifeExpectency

여기, 성능 모니터를 사용하는 방법에 대한 좋은 기사입니다 http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/

다음 단계는 쿼리와 SQL 서버 성능을 최적화한다.

쿼리 성능, http://technet.microsoft.com/en-us/magazine/2007.11.sqlquery.aspx SQL Server 성능,

점은 데이터베이스에 영향을 미치는 수 많은 가능성가 제공 한 정보에 기반하여 문제를 진단하는 것은 거의 불가능하다,이 있다는 것입니다. 시스템이 최적으로 실행되지 않는 이유를 확인하려면 각 항목을 살펴 보는 것이 좋습니다.

+0

도움이되는 정보를위한 감사합니다, 그러나 나가 말한대로. 닷넷 애플 리케이션은 ODBC DSN이 없을 때 잘 실행된다. 그래서 문제는 ODBC와 관련이 있어야한다고 생각합니다. 그 동안 mssql C API를 사용하는 pymssql 라이브러리를 사용하여 mssql에 직접 연결하는 스크립트를 다시 작성하고 있습니다. 이 방법이 작동한다면 ** ODBC에 대해 뭔가 이상 할 것입니다. – aalizadeh

+0

무엇이 ODBC DSN이 범인이라고 생각합니까? ODBC DSN을 통해 실행중인 쿼리를 SQL Server에서 직접 실행 했습니까? 그렇다면 상당히 빠르게 실행 되었습니까? 나는이 결론에 어떻게 도달했는지 알아 내려고 노력하고 있습니다. 당신의 결론은 정확할 수 있습니다, 나는 단지 당신이 가지고 있고 시도하지 않은 것을 이해하고 싶습니다. –

+0

질문을 편집했습니다. – aalizadeh