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 디스크 드라이브.
업데이트 해 주셔서 감사합니다. 기본 키가 클러스터되었거나 클러스터되지 않은 상태입니까? 또한이 서버 (메모리, CPU 등)의 크기는 어느 정도입니까? –
나는 – aalizadeh
질문을 편집했다. 당신의 설명에 따르면, 파이썬 (ODBC) 응용 프로그램이 자원 충돌로 인해 .Net 응용 프로그램을 차단하고있는 것처럼 보입니다.제한 시간은 몇 가지 사항, 자원 경합, 장기 실행 쿼리 및 차단으로 인해 야기 될 수 있습니다. 일반적인 용의자입니다. 성능이 저하되면 활성 연결을 살펴보고 블로킹 문제가 있는지 확인하십시오. –