우리 회사는 상당히 중대한 성능 문제가있는 응용 프로그램을 사용합니다. 데이터베이스 자체에는 여러 가지 문제가 있지만 작업 중이지만 많은 문제는 순전히 응용 프로그램 관련 문제입니다.
내 조사에서 빈 테이블을 쿼리하는 SQL Server 데이터베이스에 도달하는 수백만 개의 쿼리가 있음을 발견했습니다. 약 300 개의 빈 테이블이 있으며이 테이블 중 일부는 분당 100-200 회까지 쿼리됩니다. 이 테이블은 비즈니스 영역과 아무 관련이 없으며 본질적으로 벤더가 당사와 소프트웨어 계약을 맺기 위해 계약을 체결했을 때 공급 업체가 제거하지 않은 원래 응용 프로그램의 일부입니다.
응용 프로그램 오류 로그에이 문제와 관련된 오류가 발생했다는 사실을 제외하고, 공급 업체는 응용 프로그램이나 데이터베이스 서버에 성능이나 안정성에 영향을 미치지 않습니다. 진단을 수행하는 데 2 분 이상의 오류가 표시되지 않을 정도로 오류 로그가 넘칩니다.
이러한 쿼리의 실제 비용은 CPU주기 등의 측면에서 분명히 낮아질 것입니다. 그러나 SQL Server와 응용 프로그램에 미치는 영향을 제안 할 수 있습니까? 요청을 보내고 확인하고 처리하고 반환하고 응용 프로그램에서 영수증을 확인하는 실제 메커니즘이 성능에 영향을 줄 것이라고 생각합니다.
우리는 응용 프로그램을 위해 SQL Server 2008 R2, Oracle Weblogic 11g를 사용합니다.
@ Frisbee- 간단히 말해서, 응용 프로그램 데이터베이스의 빈 테이블에 충돌하는 쿼리 텍스트가 포함 된 테이블을 만든 다음 비어있는 것으로 알려진 모든 테이블 이름에 대해 쿼리하여 매우 긴 목록을 얻었습니다. 가장 큰 인기는 30 일의 가동 시간 동안 270 만 건의 실행으로 앱이 일반적으로 오전 8시에서 오후 6 시까 지 사용되므로 해당 숫자가 운영 시간에 더 집중되어 있다는 점을 명심하십시오. 여러 테이블, 여러 쿼리, 아마도 일부는 조인을 통한 관련성이 있습니다. 최고 히트 (당시 270 만)는 조인이없는 where 절이있는 단일 빈 테이블에서 간단하게 선택했습니다. 빈 테이블에 조인이있는 더 큰 쿼리에는 연결된 테이블에 대한 업데이트가 포함될 수 있지만 확인 하고이 질문을 최대한 빨리 업데이트하겠습니다.
업데이트 : 실행 횟수가 1043-4622614 (2.5 개월 이상) 인 1000 개의 쿼리가 있습니다. 캐시 된 계획이 언제 시작되는지 알아 내려면 더 많이 파헤쳐 야합니다. 이것은 단지 쿼리의 범위에 대한 아이디어를 제공하기위한 것입니다. 대부분 20 개가 넘는 조인으로 합리적으로 복잡합니다.
@ srutzky- 그렇습니다. 계획이 컴파일 될 때 관련이있는 날짜 열이 있다고 생각하므로 관심을 가질 것입니다. SQL Server가 VMware 클러스터에있을 때 스레드 제한이 전혀 문제가되지 않을까요? 곧 전용 Dell PE 730xD가 될 것입니다.
@Frisbee-늦게 응답해서 죄송합니다. 제안한 바와 같이 SQLQueryStress (실제 240,000 반복)를 사용하여 24 개의 스레드에서 10,000 번 빈 테이블에서 select *를 실행하고 즉시 10,000 배치 요청을 기록했습니다. 그런 다음 24 스레드에서 1000 배로 줄이고 4,000 배치 요청 / 초 미만으로 적중했습니다. 또한 12 스레드 (총 120000 회 반복)에 대해 10,000 회 반복을 시도하여 6,505 Batches / sec가 지속되었습니다. CPU에 미치는 영향은 실제로 각 테스트 실행 동안 총 CPU 사용량의 약 5-10 %입니다. 네트워크 대기 시간은 무시할 만하지 만 (워크 스테이션에서 클라이언트와의 3ms와 같은) CPU에 미치는 영향은 확실합니다. CPU 사용량과 약간의 불필요한 데이터베이스 파일 IO로 요약됩니다. 총 실행 / 초는 3000 미만으로 작동합니다. 프로덕션보다 많지만 이와 같은 수십 가지 쿼리 만 테스트하고 있습니다. 따라서 분당 300-4000 배의 속도로 빈 테이블에 충돌하는 수백 개의 쿼리의 결과는 CPU 시간과 관련하여 무시할 수 없습니다. 모든 테스트는 듀얼 플래시 어레이와 256GB RAM, 12 개의 최신 코어를 갖춘 유휴 PE 730xD에 대해 수행되었습니다.

@ srutzky- 좋은 생각. SQLQueryStress는 기본적으로 연결 풀링을 사용하는 것처럼 보이지만 어쨌든 살펴보고 연결 풀링 상자가 선택되어 있음을 알았습니다. 따라 업데이트
@ srutzky- 응용 프로그램에서 연결 풀링이 활성화되어 있지 않거나 작동하지 않는 것 같습니다. 프로파일 러 추적을 수행하고 연결에 감사 로그인 이벤트에 대한 EventSubClass "1-Non pooled"가 있음을 발견했습니다.
RE : 연결 풀링-weblogics를 확인하고 연결 풀링을 사용하도록 설정했습니다. 라이브에 대해 더 많은 추적을 실행하고 풀링이 올바르게 / 전혀 발생하지 않는 징후를 발견했습니다.

그리고 여기에 채워진 테이블에 대한 조인없이 단일 쿼리를 실행할 때의 모습이 있습니다. 예외는 "SQL Server에 연결하는 동안 네트워크 관련 또는 인스턴스 별 오류가 발생했습니다. 서버를 찾을 수 없거나 액세스 할 수 없습니다. 인스턴스 이름이 올 바르고 SQL Server가 원격 연결을 허용하도록 구성되어 있는지 확인하십시오. (제공자 : 명명 된 파이프 공급자, 오류 : 40-SQL Server에 대한 연결을 열 수 없습니다) "배치 요청 카운터를 기록하십시오. 예외가 생성되는 동안 서버를 핑하면 성공적인 핑 응답이 발생합니다.
업데이트-두 번의 연속 테스트 실행, 동일한 워크로드 (select * fromEmptyTable), 풀링 활성화 / 비활성화 약간 더 많은 CPU 사용량과 많은 오류가 발생하며 초당 500 회의 일괄 요청을 초과하지 않습니다. 테스트는 10,000 Batches / sec와 풀링이 켜져있는 상태에서 실패하지 않았으며, 약 400 개의 배치 / 초와 풀링이 비활성화되어 많은 실패를 보여줍니다. 이러한 오류가 연결 가용성 부족과 관련이 있는지 궁금합니다.
@ srutzky- sys.dm_exec_connections에서 카운트 (*)를 선택하십시오.
풀링 가능 :로드 테스트가 중지 된 후에도 일관성있게 37
풀링 비활성화 됨 :
SQLQueryStress에서 예외가 발생 하는지 여부에 따라 11-37 : 예를 들어 이러한 트로프가
Batches / sec 그래프에 나타나는 경우 SQLQueryStress에서 예외가 발생하고
연결 수가 11로 감소한 다음 점진적으로 최대 37까지 백업 배치가 정점에 도달하고 예외가 발생하지 않는 경우 매우 흥미 롭습니다.
테스트 / 라이브 인스턴스 모두의 최대 연결은 기본값 0으로 설정됩니다.
응용 프로그램 로그를 확인했지만 연결 문제를 찾을 수 없지만 많은 수의 크기, 즉 많은 스택 추적 오류로 인해 몇 분 분량의 로깅 만 사용할 수 있습니다. 앱 지원에 대한 동료는 연결과 관련하여 상당한 수의 HTTP 오류가 발생한다고 조언합니다. 이것은 어떤 이유로 응용 프로그램이 연결을 올바르게 풀링하지 않아서 서버에 연결이 반복적으로 부족한 것으로 보입니다. 앱 로그를 더 살펴볼 것입니다. SQL Server 측에서 프로덕션 환경에서 이것이 일어나고 있음을 증명하는 방법이 있는지 궁금합니다.
@ srutzky- 감사합니다. 내일 weblogic 설정을 확인하고 업데이트하겠습니다. 나는 단지 37 개의 연결에 대해서만 생각하고 있었다-SQLQueryStress가 10,000 반복 = 120,000 개의 select 문을 풀링하지 않고 12 개의 스레드를 수행하는 경우 각 선택이 SQL 인스턴스에 대한 고유 한 연결을 생성한다는 것을 의미하지 않아야합니까?
@ srutzky- Weblogics는 연결을 풀링하도록 구성되었으므로 제대로 작동해야합니다. 연결 풀링은 4 개의로드 밸런스 웹 로직 각각에서 다음과 같이 구성됩니다.
- 초기 용량 : 10
- 최대 수용 인원 : 50
- 최소 수용 인원 : 5
빈 테이블 쿼리에서 선택을 실행하는 스레드 수를 늘리면 연결 수가 약 47입니다. 연결 풀링을 사용하지 않으면 최대 배치 요청 / 초가 10,000에서 400까지 줄어 듭니다. 매번 일어날 일은 SQLQueryStress의 '예외'가 배치 / 초가 최저점에 도달 한 직후에 발생한다는 것입니다. 연결과 관련이 있지만 이것이 왜 일어나는지 정확히 이해할 수는 없습니다. 테스트가 실행되고 있지 않으면 #connections는 약 12로 줄어 듭니다.
연결 풀링을 사용하지 않으면 예외가 발생하는 이유를 이해하는 데 어려움이 있지만 Adam Machanic에 대한 다른 모든 스택 교환 질문 / 질문 일 수 있습니까?
@ srutzky SQL Server에 연결이 부족하지 않은 경우에도 풀링을 사용하지 않고 예외가 발생하는 이유는 무엇입니까?
SELECT COUNT(*) FROM sys.dm_exec_connections;를 실행하여 풀링 사용 여부와 값이 크게 다른지 확인하십시오. 아니. 이러한 오류를 기반으로 풀링을 사용하지 않으면 더 많은 연결이있을 것이라고 생각합니다.
Pooling=false나 Max Pool Size?

