Truy vấn metadata và Dynamyic Management Object trong SQL Server
- 05-06-2022
- Toanngo92
- 0 Comments
Thuộc tính của một đối tượng như là bảng hoặc view được lưu trữ trong một bảng hệ thống đặc biệt. Các thuộc tính này được gọi là metadata. Tất cả SQL objects đều có metadata. Các metadata này có thể xem được bằng system views, những view được định nghĩa sẵn của SQL Server
Có khoảng hơn 230 system views khác nhau và chúng được tự động thêm vào database mà user tạo ra. Các views này được nhóm lại thành vài schemas khác nhau như sau.
Mục lục
System Catalog Views
Những views này chứ thông tin về mục lục bên trong hệ thống SQL Server. Catalog tương tự như inventory hoặc objects. Các views này chứa một lượng lớn metadata. Trong các phiên bản trước của SQL Server, để lấy dữ liệu này người dùng cần truy vấn một lượng lớn dữ liệu trong bảng hệ thống, views hệ thống, functions hệ thống. Từ sau phiên bản 2021 trở đi, tất cả người dùng có thể truy vấn dễ dàng vào catalog metadata để tìm kiếm.
Ví dụ:
SELECT name,object_id,type,type_desc
FROM sys.tables;
Information Schema Views
Người dùng có thể truy vấn thông tin schemaview và trả về metadata hệ thống. Những views này hữu dụng khi giao tiếp với bên thứ ba. Thông tin schema views cho phép các ứng dụng hoạt động chính xác mặc dù đã có những thay đổi quan trọng đối với các bảng hệ thống bên dưới.
Bảng phía dưới sẽ giúp chúng ta quyết định nên truy vấn SQL Server-specific system views hay information schema views:
Information Schema Views | SQL Server System Views |
Chúng được lưu trữ trong Schema của riêng chúng, INFORMATION_SCHEMA | Chúng xuất hiện trong sys schema. |
Nó sử dụng thuật ngữ tiêu chuẩn thay vì thuật ngữ SQL Server. Ví dụ: sử dụng catalog thay vì database và domain thay vì kiểu dữ liệu do người dùng xác định. | Chúng tuân theo thuật ngữ SQL Server. |
Chúng có thể không hiển thị tất cả siêu dữ liệu có sẵn cho các dạng xem danh mục riêng của SQL Server. Ví dụ: cột sys bao gồm các thuộc tính cho thuộc tính nhận dạng và thuộc tính cột được tính toán, trong khi các cột INFORMATION_SCHEMA thì không. | Chúng có thể hiển thị tất cả siêu dữ liệu có sẵn cho các dạng xem danh mục của SQL Server. |
Ví dụ:
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES;
System Metadata functions
Ngoài các views, SQL Server cung cấp một số hàm tích hợp trả về siêu dữ liệu cho một truy vấn. Chúng bao gồm các hàm vô hướng và các hàm có giá trị bảng, có thể trả về thông tin về cài đặt hệ thống, tùy chọn phiên và một loạt các đối tượng khác.
Các hàm siêu dữ liệu của SQL Server có nhiều định dạng khác nhau, Một số có vẻ giống với các hàm vô hướng tiêu chuẩn, chẳng hạn như ERROR_NUMBER(). Các hàm khác sử dụng các tiền tố đặc biệt, chẳng hạn như @@VERSION hoặc $PARTITION.
Function Name | Description | Example |
OBJECT_ID(<object_name>) | Trả về ID của database object | SELECT OBJECT_ID(‘Sales.Customer’) |
OBJECT_NAME(<object_id>) | Trả về tên tương ứng của một object ID | SELECT OBJECT_NAME(197575742) |
@@ERROR | Trả về 0 nếu câu lệnh cuối thành công, nếu không trả về mã lỗi | SELECT 5/0 SELECT @@ERROR |
SERVERPROPERTY(<property>) | Trả về giá trị xác định của thuộc tính server | SELECT SERVERPROPERTY(‘Collation’) |
Ví dụ sử dụng câu lệnh SELECT để query system metadata:
SELECT SERVERPROPERTY('EDITION') AS EditionName;
Một trong những tính năng mới trong SQL Server 2019 là siêu dữ liệu (metadata) tempdb được tối ưu hóa cho bộ nhớ. Nhóm SQL Server đã nâng cao mã tempdb với các tối ưu hóa để một số siêu dữ liệu có thể là nút thắt cổ chai trên các hệ thống tempdb nặng hiện có thể dựa vào bộ nhớ và được tối ưu hóa để truy cập RAM.
Các môi trường có dung lượng lớn, quy mô lớn sử dụng nhiều tempdb thường gặp phải kiểu tắc nghẽn này, Trước đó, điều này sẽ yêu cầu một số loại giải pháp để giảm việc sử dụng tempdb. Tuy nhiên, với tính năng mới này, có thể cho phép siêu dữ liệu lưu lại trong bộ nhớ và được truy cập một cách tối ưu.
Truy vấn đối tượng quản lý động
Lần đầu được giới thiệu bởi SQL Server 2006, Dynamic Management Views (DMVs) và Dynamic Management Functions (DMFs) là những đối tượng quản lý động (dynamic management object) mà trả về thông tin server hoặc thông tin trạng thái của database. DMVs và DMFs gọi chung là đối tượng quản lý động. Chúng cung cấp cái nhìn sâu sắc về hoạt động của phần mềm và có thể được sử dụng để kiểm tra trạng thái của phiên bản SQL Server, khắc phục sự cố và điều chỉnh hiệu suất.
Cả DMVs và DMFs trả về dữ liệu định dạng bảng nhưng sự khác biệt là DMF nhận vào ít nhất một tham số, DMV không nhận vào tham số. SQL Server 2019 cung cấp gần 200 đối tượng quản lý động (dynamic management object). Để truy vấn tới DMVs, sẽ cần phải có quyền VIEW SERVER STATE hoặc VIEW DATABASE STATE, dựa trên phạm vi của DMV.
Chia danh mục và truy vấn DMVs
Danh sách quy ước giúp tổ chức DMVs bằng function
Naming Parttern | Description |
db | Database related (CSDL quan hệ) |
io | I/O statistics (Thống kê input/output) |
Os | SQL Server Operation System Information |
‘tran’ | Transaction-related |
‘exec’ | Query execution-related metadata |
Để truy vấn đối tượng quản lý động (dynamic management object), bạn sử dụng câu lệnh SELECT như cách bạn làm với bất kỳ đối tượng view hoặc multi-valued table. Ví dụ: Đoạn mã phía dưới trả về danh sách các kết nối người dùng hiện tại từ sys.dm_ex.
sys.dm_exec_sessions là một DMV có phạm vi máy chủ hiển thị thông tin về tất cả các kết nối người dùng đang hoạt động và tác vụ nội bộ. Thông tin này bao gồm người dùng đăng nhập, cài đặt phiên hiện tại, phiên bản ứng dụng khách, tên chương trình khách, thời gian đăng nhập ứng dụng khách, v.v. sys.dm_exec_sessions có thể là được sử dụng để xác định một phiên cụ thể và tìm thông tin về phiên đó.
Ví dụ:
SELECT session_id, login_time, program_name FROM sys.dm_exec_sessions WHERE login_name='sa' and is_user_process = 1;
Ở đây, is_user_process là một cột trong dạng xem xác định xem phiên có phải là phiên hệ thống hay không. Giá trị 1 cho biết rằng đó không phải là phiên hệ thống mà là phiên của người dùng. Cột program_name xác định tên của chương trình khách hàng đã khởi tạo phiên, Cột login_time thiết lập thời gian khi phiên bắt đầu.