SQL Server cách phát hiện các chế độ xem không sử dụng và / hoặc nhận số liệu thống kê sử dụng


7

Có cách nào để xác định xem một chế độ xem không còn được sử dụng (mà không xóa chúng)?

Lý tưởng nhất là tôi muốn biết cách sử dụng lượt xem cho SQL Server 2000 và 2012 .

Tôi đang nâng cấp một số cơ sở dữ liệu và nghi ngờ rằng nhiều quan điểm không còn được sử dụng. Ngoài ra, một số khung nhìn sẽ khó biên dịch trên máy chủ mới khi chúng truy cập nhiều cơ sở dữ liệu, một số khung nhìn không được chuyển sang máy chủ mới.

Câu trả lời:


8

Mặc dù câu trả lời này đã được chấp nhận, xin vui lòng xem câu trả lời của Jonathan Kehayias bên dưới để biết cách tốt hơn nhiều để làm điều này.


Đối với SQL Server 2012, bạn có thể kiểm tra bộ đệm kế hoạch cho tên của khung nhìn.

DECLARE     @FindSql nvarchar(max) = 'name_of_view';
SELECT 
    /* cp.*, ct.* */
    cp.objtype AS [Type],
    cp.refcounts AS ReferenceCount,
    cp.usecounts AS UseCount,
    cp.size_in_bytes / 1024 AS SizeInKB,
    db_name(ct.dbid) AS [Database],
    CAST(pt.query_plan as xml) as QueryPlan
FROM sys.dm_exec_cached_plans cp
OUTER APPLY sys.dm_exec_text_query_plan(plan_handle, 0, -1) pt
OUTER APPLY sys.dm_exec_sql_text(plan_handle) AS ct
WHERE (ct.text LIKE '%' + @FindSql + '%') OR (pt.query_plan LIKE '%' + @FindSql + '%')
ORDER BY cp.usecounts DESC;

Bạn có thể muốn sử dụng DBCC FREEPROCCACHE <sql_plan_handle>với trình điều khiển kế hoạch của bất kỳ gói nào sử dụng chế độ xem, sau đó xem kết quả của truy vấn trên để xem liệu nó có bật lên nữa không.

MSSQLTips có một bài viết tuyệt vời về cách thực hiện điều này trong SQL Server 2000 +

USE Master
GO
SELECT 
    UseCounts, RefCounts,CacheObjtype, ObjType, DB_NAME(dbid) as DatabaseName, SQL
FROM syscacheobjects
WHERE SQL LIKE '%view_name_here%'
ORDER BY dbid,usecounts DESC,objtype

Cảm ơn, có vẻ như UseCount sẽ rất hữu ích. Vẫn hy vọng điều gì đó tương tự trên SQL Server 2000.
PatFromCanada

Tôi đã thêm lời khuyên SQL Server 2000 vào câu trả lời của mình ...
Max Vernon

Có lẽ nó không lý tưởng nhưng tôi sẽ xây dựng một ứng dụng đơn giản để thăm dò bằng cách sử dụng truy vấn này và lưu trữ kết quả trong một bảng. Tôi nhận thấy rằng một số đối tượng sẽ biến mất khỏi bộ nhớ cache vào ban ngày và nó khá trống vào buổi sáng. Tất cả tôi cần là một lần nhấn để biết chế độ xem đang hoạt động.
PatFromCanada

Cảm ơn thông tin này! Tuy nhiên, FYI, tôi đã gặp lỗi này khi tôi thử: "Msg 6335, Cấp 16, Trạng thái 101, Ví dụ kiểu dữ liệu XML Dòng 2 có quá nhiều nút được lồng. Độ sâu tối đa được phép là 128 cấp." Mọi suy nghĩ về cách xử lý với?
jrdevdba

1
@jrdevdba - sp_BlitzErik đã đề cập trong cuộc trò chuyện sáng nay rằng "kế hoạch truy vấn với> 128 nút được lưu trữ trong sys.dm_execigin_query_plan thay vì sys.dm_exec_query_plan" ... có thể giúp bạn.
Max Vernon

15

Thật không may nếu bạn muốn chính xác 100%, bộ đệm của kế hoạch sẽ không cắt nó, bởi vì có tất cả các loại kịch bản trong SQL Server, nơi một kế hoạch có thể không được lưu vào bộ đệm. Ví dụ: TÙY CHỌN (RECOMPILE), kế hoạch chi phí bằng không, tối ưu hóa cho khối lượng công việc đặc biệt và sơ khai kế hoạch sử dụng một lần, v.v.

Vì bạn muốn một phương thức hoạt động trong suốt 2000-2012, nên tùy chọn thực sự duy nhất của bạn để đảm bảo bạn nắm bắt được cách sử dụng là sử dụng dấu vết phía máy chủ với Audit Database Object Accesssự kiện:

http://msdn.microsoft.com/en-us/l Library / ms175013.aspx

Bạn sẽ muốn lọc trên ObjectType = 8278để bạn chỉ bắt được Lượt xem đang được truy cập:

http://msdn.microsoft.com/en-us/l Library / ms180953.aspx

Sau đó, thiết lập một công việc kéo dữ liệu tệp vào và tổng hợp số đếm mỗi vài giờ (hoặc thậm chí vài ngày tùy thuộc vào tốc độ tạo dữ liệu) và bạn sẽ có thể theo dõi chính xác các truy cập đang xảy ra.

Vâng, tôi ghét Trace nhiều như anh chàng tiếp theo, nhưng đây là một trong những tình huống mà nó là công cụ phù hợp cho nhiệm vụ trong tay.

FWIW, vào năm 2012, bạn có thể sử dụng Kiểm toán máy chủ hoặc Sự kiện mở rộng cho việc này để theo dõi truy cập đối tượng, nhưng một khi bạn tạo định nghĩa Trace cho năm 2000, nó sẽ có thể di động trong hầu hết năm 2012 và bạn có thể sử dụng Profiler để tạo các kịch bản để làm cho nó dễ dàng hơn để làm việc với.


Điều này có vẻ rất hứa hẹn nhưng tôi đã không thể có được SQL Server 2000 để ghi lại bất cứ điều gì cho các lượt xem. Nếu tôi chạy một dấu vết cho tất cả các loại đối tượng với sự kiện Đối tượng-Đối tượng: Đã mở, tôi không nhận được lần truy cập nào. (trợ giúp cho sự kiện này cho biết "Cho biết khi nào một đối tượng đã được truy cập, chẳng hạn như đối với câu lệnh CHỌN, CHERTN hoặc XÓA.") Không có sự kiện Truy cập đối tượng nào tôi có thể thấy.
PatFromCanada
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.