SQL Server 쿼리 저장소- 'ad-hoc'쿼리 란 무엇입니까?


10

SQL Server 쿼리 저장소에 대해 자세히 살펴 보았으며 종종 'ad-hoc'쿼리에 대한 참조가 나타납니다. 그러나 쿼리 저장소가 임시 쿼리를 결정하는 것을 보지 못했습니다. 매개 변수가없는 쿼리 또는 한 번만 실행되는 쿼리라고 추측 할 수있는 장소를 보았습니다. 이에 대한 공식적인 정의가 있습니까? 나는 일반적으로 의미하지 않습니다. 쿼리 저장소와 관련이 있다는 의미입니다.

예를 들어,이 페이지 는 쿼리 저장소에서 임시 쿼리를 제거하는 예를 보여 주지만 사용하는 기준은 하나의 실행 횟수 인 것으로 보입니다. 이것은 임시 쿼리에 대한 이상한 정의 인 것 같습니다. BTW, 페이지로 이동하면 '임시 쿼리 삭제'를 검색하십시오.



@ SqlWorldWide-나는 내 질문을 바꾸었다. 나는 일반적으로 의미하지 않습니다. 쿼리 저장소와 관련이 있다는 의미입니다.
랜디 마인더

쿼리 저장소는 전체 또는 자동으로 어떻게 구성됩니까?
Kin Shah

그것은 자동으로 설정되어 - @Kin
랜디 마인더

답변:


8

약간의 검색 후, 나는이 질문에 대답하기 위해 Microsoft의 문서에서 구체적이고 만족스러운 소스를 찾을 수 없었습니다. 거기에는 adhoc / ad-hoc / ad hoc에 대한 많은 타사 설명과 정의가 있지만이 질문의 특이성에 대해서는 소스와 가까운 것이 이상적이라고 생각합니다.

이 SO 게시물 (SqlWorldWide 덕분에 )과 같은 일반적인 (그러나 여전히 정확한) 정의를 넘어서서, 우리가 주제에 관한 문서가 무엇을 말하는지 살펴보면, 실행 횟수를 기반으로 정의에 대해 언급 한 것에 동의합니다. 나는 우리가 그것을 사실로 받아 들일 수 있다고 생각합니다.

애드혹 워크 플로우 최적화에 관한 기사에 따르면

이 옵션을 1로 설정하면 데이터베이스 엔진은 전체 컴파일 된 계획 대신 일괄 처리를 처음 컴파일 할 때 작은 컴파일 된 계획 스텁을 계획 캐시에 저장합니다. 이를 통해 계획 캐시가 재사용되지 않는 컴파일 된 계획으로 채워지지 않도록함으로써 메모리 부담을 줄일 수 있습니다. 컴파일 된 계획 스텁을 사용하면 데이터베이스 엔진은이 임시 배치가 이전에 컴파일되었지만 컴파일 된 계획 스텁 만 저장했음을 인식하므로이 배치가 다시 호출 (컴파일 또는 실행) 될 때 데이터베이스 엔진은 배치를 컴파일합니다. 전체 컴파일 된 계획을 계획 캐시에 추가합니다.

따라서 ad hoc 쿼리 서버 구성 옵션도 단일 실행 정의를 ad hoc 정의로 사용합니다. 쿼리가 계속 실행되어 동일한 계획을 생성하면 더 이상 그대로 처리되지 않습니다.

Query Store 모범 사례에 관한 기사 도 이와 관련이 있습니다.

고유 한 query_hash 값 수를 sys.query_store_query의 총 항목 수와 비교하십시오. 비율이 1에 가까우면 임시 작업이 다른 쿼리를 생성합니다.

물론 이것은 저장 프로 시저로 아직 사용되지 않거나 매개 변수화 등의 쿼리에 적합합니다. 박쥐에서 바로 인식하고 처리 할 수 ​​있기 때문입니다.

따라서이 모든 것을 바탕으로 다음과 같은 경우 쿼리가 임시로 처리된다고 말할 수 있습니다.

  • 파라미터 화되지 않았습니다
  • 프로그래밍 방식으로 데이터베이스에 저장되지 않습니다 (저장된 proc, 함수, 트리거 등).
  • 동일한 쿼리가 한 번만 실행되거나 동일한 쿼리가 여러 번 실행되지만 이후의 각 실행에 대해 다른 쿼리 계획이 생성됩니다.

4

임시 쿼리의 경우 sys.query_store_query 설명서에 명시된대로 DMV 의 object_id 열은 sys.query_store_query0이됩니다 .

object_id :

조회가 속한 데이터베이스 오브젝트의 ID입니다 (저장 프로 시저, 트리거, CLR UDF / UDAgg 등). 쿼리가 데이터베이스 개체 (임시 쿼리)의 일부로 실행되지 않은 경우 0입니다.

"이것은 임시 쿼리 정의 입니다 "라고 명시 적으로 명시되어 있지 않더라도 해당 값을 기반으로 임시 쿼리를 식별 할 수 있습니다 . :)


0

임시라는 용어는 한 번만 실행 된 쿼리를 나타내는 데 사용됩니다. 이는 "임시 작업 부하 최적화"데이터베이스 설정에 사용 된 정의와 일치합니다.

Ad-hoc 쿼리 삭제와 관련하여 참조하는 링크에는 "Ad-hoc 쿼리 삭제 : 한 번만 실행되었고 24 시간이 지난 쿼리는 삭제됩니다."라는 특정 정의가 포함되어 있습니다.


0

docs.microsoft.com의 sys.dm_exec_cached_plans dmv objtype열의 임시 (ad-hoc)

Adhoc : 임시 쿼리. 원격 프로 시저 호출 대신 osql 또는 sqlcmd를 사용하여 언어 이벤트로 제출 된 Transact-SQL을 나타냅니다.

이 열의 한 가지 용도는 여러 계획이있는 쿼리의 경우 여러 계획이 원인인지 확인하는 것 Adhoc입니다.

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.