Chỉ số sử dụng chỉ mục DMV cho thấy không có hoạt động chỉ mục


7

Tôi đang cố gắng để có được thông tin về các chỉ mục. Theo một số trang web, truy vấn TSQL dưới đây sẽ tham gia thông tin về các chỉ mục vào bảng chỉ mục, trả về các chỉ mục và thông tin liên quan. Truy vấn dưới đây được đơn giản hóa để tham gia trần, vì hiện tại tôi đang cố gắng trả lại dữ liệu và sau đó, tôi sẽ trả về những gì tôi cần:

SELECT *
FROM sys.indexes i
     INNER JOIN sys.dm_db_index_usage_stats s ON i.object_id = s.object_id

Truy vấn này không trả về gì cả. Tuy nhiên, trong một số cơ sở dữ liệu có hàng trăm bảng có ít nhất một chỉ mục và theo các bài viết trực tuyến khác nhau, truy vấn này sẽ trả về các chỉ mục đó (vì nó tham gia vào id đối tượng). Ngoài ra, nếu tôi cố gắng thay đổi truy vấn thành truy vấn bên dưới, nó cũng không trả về kết quả nào:

SELECT *
FROM DATABASENAME.sys.indexes i
    INNER JOIN DATABASENAME.sys.dm_db_index_usage_stats s ON i.object_id = s.object_id

Tại sao truy vấn này không trả về dữ liệu?

Thêm

Nếu tôi chạy các truy vấn bên dưới, tôi sẽ nhận được dữ liệu từ cả hai SELECTtruy vấn sau:

SELECT *
FROM sys.indexes

SELECT *
FROM sys.dm_db_index_usage_stats

Vấn đề (trên truy vấn ban đầu) là object_idtham gia. Tuy nhiên, tôi không biết tại sao tôi có các đối tượng trong một bảng không tồn tại trong một bảng khác.

Cuối cùng: Martin đã có câu trả lời đúng ban đầu - mặc dù dữ liệu được trả về từ sys.dm_db_index_usage_statsbảng, nó nằm trên msdbcơ sở dữ liệu, không phải cơ sở dữ liệu cụ thể mà tôi đang tìm kiếm. Tôi chạy lại các truy vấn trên các bảng và tìm thấy id cơ sở dữ liệu trong bảng. Không chắc chắn lý do tại sao sys.dm_db_index_usage_statsbảng không giữ lại dữ liệu từ các truy vấn trước đó trên cơ sở dữ liệu đó.


Người dùng db nào đang chạy truy vấn và người dùng đó có những khoản trợ cấp nào?
Frambot

@MartinSmith Nếu tôi sử dụng sa, chạy SQL Server express trên máy cục bộ của mình với các bảng chứa chỉ mục, nó cũng không trả về gì.

@MartinSmith Có, cả hai bảng trả về dữ liệu riêng lẻ.

Không có số liệu thống kê sử dụng?

2
Ah là chỉnh sửa của bạn. SQL Express tự động đóng cơ sở dữ liệu theo mặc định để bạn có thể mất nó sau đó.
Martin Smith

Câu trả lời:


8

Một khả năng là bạn không có đủ quyền để xem siêu dữ liệu.

Một điều nữa là sys.dm_db_index_usage_statschỉ báo cáo về các chỉ mục đã được sử dụng ít nhất một lần kể từ khi máy chủ được khởi động lại lần cuối. Cũng thế

Bất cứ khi nào cơ sở dữ liệu bị tách ra hoặc bị tắt (ví dụ: vì AUTO_CLOSE được đặt thành BẬT), tất cả các hàng được liên kết với cơ sở dữ liệu sẽ bị xóa.

AUTO_CLOSE là mặc định cho SQL Server Express.

Bạn cần lọc sys.dm_db_index_usage_statstheo database_idđể xác định xem nó có tải siêu dữ liệu cho một cơ sở dữ liệu cụ thể không, tham gia nên bao gồmindex_id

SELECT *
FROM   sys.indexes i
       LEFT JOIN sys.dm_db_index_usage_stats s
         ON i.object_id = s.object_id
            AND i.index_id = s.index_id
            AND s.database_id = DB_ID() 
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.