Cửa hàng truy vấn SQL Server - Điều gì được coi là truy vấn 'ad-hoc'?


10

Tôi đã đi sâu vào Cửa hàng Truy vấn SQL Server và tôi thường thấy các tài liệu tham khảo về các truy vấn 'ad-hoc'. Tuy nhiên, tôi chưa thấy Cửa hàng Truy vấn xác định truy vấn đặc biệt là gì. Tôi đã thấy những nơi mà nó có thể được suy ra là một truy vấn không có tham số hoặc truy vấn được thực hiện chỉ một lần. Liệu một định nghĩa chính thức tồn tại cho điều này? Tôi không có ý nói chung. Ý tôi là vì nó liên quan đến Cửa hàng Truy vấn.

Ví dụ, trang này hiển thị một ví dụ về việc xóa các truy vấn đặc biệt khỏi cửa hàng truy vấn, nhưng nó xuất hiện các tiêu chí mà nó sử dụng là số lượng thực thi chỉ là một. Đây dường như là một định nghĩa kỳ lạ của một truy vấn đặc biệt. BTW, nếu bạn truy cập trang, hãy tìm kiếm 'Xóa truy vấn đặc biệt'.



@SqlWorldWide - Tôi đã điều chỉnh lại câu hỏi của mình. Tôi không có ý nói chung. Ý tôi là vì nó liên quan đến Cửa hàng Truy vấn.
Randy Minder

Cửa hàng truy vấn của bạn được cấu hình như thế nào - tất cả hay tự động?
Kin Shah

@Kin - Nó được đặt là Tự động
Randy Minder

Câu trả lời:


8

Sau một chút tìm kiếm, tôi không thể tìm thấy một nguồn cụ thể và thỏa mãn từ tài liệu của Microsoft để trả lời câu hỏi này. Có rất nhiều mô tả và định nghĩa của bên thứ ba về adhoc / ad-hoc / ad hoc ngoài kia, nhưng đối với tính đặc thù của câu hỏi này, tôi nghĩ rằng một nguồn gần với nguồn là lý tưởng.

Di chuyển các định nghĩa chung (nhưng vẫn chính xác) như bài đăng SO này (cảm ơn SqlWorldWide), nếu chúng ta xem tài liệu nói gì về chủ đề này, nó đồng ý với những gì bạn đã đề cập về định nghĩa dựa trên số lần thực hiện , Tôi nghĩ đến mức chúng ta có thể coi đó là sự thật.

Bài viết về tối ưu hóa cho quy trình làm việc ad hoc nói,

Khi tùy chọn này được đặt thành 1, Cơ sở dữ liệu sẽ lưu trữ một sơ đồ được biên dịch nhỏ trong bộ đệm của gói khi một lô được biên dịch lần đầu tiên, thay vì gói được biên dịch đầy đủ. Điều này giúp giảm áp lực bộ nhớ bằng cách không cho phép bộ đệm kế hoạch được lấp đầy với các gói đã biên dịch không được sử dụng lại. Sơ đồ kế hoạch đã biên dịch cho phép Công cụ cơ sở dữ liệu nhận ra rằng lô ad hoc này đã được biên dịch trước đó nhưng chỉ lưu trữ sơ đồ kế hoạch đã biên dịch, do đó, khi lô này được gọi (biên dịch hoặc thực thi) một lần nữa, Công cụ cơ sở dữ liệu sẽ biên dịch lô ... và thêm kế hoạch được biên dịch đầy đủ vào bộ đệm của kế hoạch.

Vì vậy, nó sẽ xuất hiện tùy chọn cấu hình máy chủ truy vấn ad hoc cũng sử dụng định nghĩa của một thực thi duy nhất như định nghĩa của ad hoc. Nếu truy vấn tiếp tục được thực thi và tạo cùng một kế hoạch, nó sẽ không còn được xử lý như vậy nữa.

Bài viết về Thực tiễn Tốt nhất cho Cửa hàng Truy vấn cũng phù hợp với điều này,

So sánh số lượng giá trị query_hash riêng biệt với tổng số mục trong sys.query_store_query. Nếu tỷ lệ gần bằng 1, khối lượng công việc đặc biệt của bạn sẽ tạo ra các truy vấn khác nhau.

Tất nhiên, điều này là dành cho các truy vấn chưa được sử dụng làm thủ tục được lưu trữ, tham số hóa, v.v. bởi vì chúng có thể được nhận ra và xử lý thích hợp ngay lập tức.

Vì vậy, dựa trên tất cả những điều này, chúng ta có thể nói rằng một truy vấn được coi là ad hoc nếu:

  • Nó không được tham số hóa
  • Nó không được lưu trữ theo chương trình trong cơ sở dữ liệu (lưu trữ Proc, chức năng, kích hoạt, v.v.)
  • Truy vấn tương tự chỉ được thực hiện một lần HOẶC Truy vấn tương tự được thực hiện nhiều lần nhưng tạo ra một kế hoạch truy vấn khác nhau cho mỗi lần thực hiện tiếp theo.

4

Đối với các truy vấn đặc biệt, cột object_id trong sys.query_store_queryDMV sẽ là 0, như đã nêu trong tài liệu sys.query_store_query :

object_id :

ID của đối tượng cơ sở dữ liệu mà truy vấn là một phần của (thủ tục được lưu trữ, kích hoạt, CLR UDF / UDAgg, v.v.). 0 nếu truy vấn không được thực thi như một phần của đối tượng cơ sở dữ liệu (truy vấn đặc biệt).

Bạn có thể xác định truy vấn ad-hoc dựa trên giá trị đó, mặc dù nó không được quy định rõ ràng như "đây là các định nghĩa của ad-hoc truy vấn ". :)


0

Thuật ngữ ad-hoc được sử dụng để chỉ các truy vấn chỉ được thực hiện một lần. Điều này phù hợp với định nghĩa được sử dụng cho cài đặt cơ sở dữ liệu "Tối ưu hóa cho khối lượng công việc đặc biệt".

Liên kết mà bạn tham chiếu liên quan đến việc xóa các truy vấn đặc biệt bao gồm định nghĩa cụ thể này "Xóa các truy vấn đặc biệt: Điều này xóa các truy vấn chỉ được thực hiện một lần và đã hơn 24 giờ."


0

Đặc biệt từ cột sys.dm_exec_cached_plans của dmv objtypetrong docs.microsoft.com.

Adhoc: Truy vấn ad hoc. Đề cập đến Transact-SQL được gửi dưới dạng các sự kiện ngôn ngữ bằng cách sử dụng osql hoặc sqlcmd thay vì các cuộc gọi thủ tục từ xa.

Một cách sử dụng cột này là để xem trong trường hợp Truy vấn có nhiều kế hoạch để xem liệu có nhiều kế hoạch được gây ra hay không 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.