SQLServer中提供了相當豐富的系統視圖,能夠從宏觀到微觀,從靜態到動態反應數據庫對象的存儲結果、系統性能、系統等待事件等等。同時 也保留了與早期版本兼容性的視圖,主要差別在於SQLServer2008提供的新系統視圖一是更加全面和豐富、二是更注重命名規則。
SQLServer2008的幾乎所有對象信息都存在於sys.objects系統視圖中,同時又在不同的系統視圖中保留了相應的副本,對於函數、視圖、 存儲過程、觸發器等相應的文本對象,把相應的對象的詳細資料存於新的sys.sql_modules視圖中。
序號 | 對象類型 | 對象類型描述 | 相關系統表 |
1 | AF = 聚合函數 (CLR) | AGGREGATE_FUNCTION | N/A |
2 | C = CHECK 約束 | CHECK_CONSTRAINT | CHECK_CONSTRAINTS |
3 | D = DEFAULT(約束或獨立) | DEFAULT_CONSTRAINT | DEFAULT_CONSTRAINTS |
4 | F = FOREIGN KEY 約束 | FOREIGN_KEY_CONSTRAINT | FOREIGN_KEYS |
5 | FN = SQL 標量函數 | SQL_SCALAR_FUNCTION | SQL_MODULES |
6 | FS = 程序集 (CLR) 標量函數 | CLR_SCALAR_FUNCTION | N/A |
7 | FT = 程序集 (CLR) 表值函數 | CLR_TABLE_VALUED_FUNCTION | N/A |
8 | IF = SQL 內聯表值函數 | SQL_INLINE_TABLE_VALUED_FUNCTION | SQL_MODULES |
9 | IT = 內部表 | INTERNAL_TABLE | INTERNAL_TABLES |
10 | P = SQL 存儲過程 | SQL_STORED_PROCEDURE | PROCEDURES SQL_MODULES |
11 | PC = 程序集 (CLR) 存儲過程 | CLR_STORED_PROCEDURE | N/A |
12 | PG = 計划指南 | PLAN_GUIDE | PLAN_GUIDES |
13 | PK = PRIMARY KEY 約束 | PRIMARY_KEY_CONSTRAINT | KEY_CONSTRAINTS |
14 | R = 規則(舊式,獨立) | RULE | SQL_MODULES |
15 | RF = 復制篩選過程 | REPLICATION_FILTER_PROCEDURE | SQL_MODULES |
16 | S = 系統基表 | SYSTEM_TABLE | OBJECTS |
17 | SN = 同義詞 | SYNONYM | SYNONYMS |
18 | SQ = 服務隊列 | SERVICE_QUEUE | SERVICE_QUEUESS |
19 | TA = 程序集 (CLR) DML 觸發器 | CLR_TRIGGER | N/A |
20 | TF = SQL 表值函數 | SQL_TABLE_VALUED_FUNCTION | SQL_MODULES |
21 | TR = SQL DML 觸發器 | SQL_TRIGGER | TRIGGERS SQL_MODULES |
22 | U = 表(用戶定義類型) | USER_TABLE | TABLES |
23 | UQ = UNIQUE 約束 | UNIQUE_CONSTRAINT | KEY_CONSTRAINTS |
24 | V = 視圖 | VIEW | VIEWS SQL_MODULES |
25 | X = 擴展存儲過程 | EXTENDED_STORED_PROCEDURE | EXTENDED_PROCEDURES |
對於數據庫層面的存儲結構,我們可以參看以下視圖:
--數據庫實例的概要情況
SELECT*FROM SYS.SERVERS
WHERE SERVER_ID=0
--兼容性視圖SELECT*FROM SYS.SYSSERVERS
--各個數據庫的詳細信息
SELECT*FROM SYS.DATABASES
--兼容性視圖SELECT*FROM SYS.SYSDATABASES
--文件組的詳細信息
SELECT*FROM SYS.FILEGROUPS
--兼容性視圖SELECT*FROM SYS.SYSFILEGROUPS
--各個數據庫文件的詳細信息
SELECT*FROM SYS.MASTER_FILES
--兼容性視圖SELECT*FROM SYS.SYSALTFILES
--當前數據庫文件的詳細信息
SELECT*FROM SYS.DATABASE_FILES
--兼容性視圖SELECT*FROM SYS.SYSFILES
--數據空間的詳細情況,可以是文件組或分區方案
SELECT*FROM SYS.DATA_SPACES
SELECT*FROM SYS.SERVERS
WHERE SERVER_ID=0
--兼容性視圖SELECT*FROM SYS.SYSSERVERS
--各個數據庫的詳細信息
SELECT*FROM SYS.DATABASES
--兼容性視圖SELECT*FROM SYS.SYSDATABASES
--文件組的詳細信息
SELECT*FROM SYS.FILEGROUPS
--兼容性視圖SELECT*FROM SYS.SYSFILEGROUPS
--各個數據庫文件的詳細信息
SELECT*FROM SYS.MASTER_FILES
--兼容性視圖SELECT*FROM SYS.SYSALTFILES
--當前數據庫文件的詳細信息
SELECT*FROM SYS.DATABASE_FILES
--兼容性視圖SELECT*FROM SYS.SYSFILES
--數據空間的詳細情況,可以是文件組或分區方案
SELECT*FROM SYS.DATA_SPACES
關於數據庫表的存儲信息,通過以下系統表我們可以大致了解數據庫表在數據庫中是如何定義的。以下視圖提供了基本的數據庫對象信息。
#div_code img { border: 0px none; }
--我們首先創建一張表和一些索引
CREATE TABLE dbo.test
(
idintIDENTITY(1,1)NOTNULL,
name char(100)NULL,
CONSTRAINT PK_test PRIMARY KEY CLUSTERED (idASC)
)
CREATE NONCLUSTERED INDEX IX_testONdbo.test(name)
--表和對象詳細信息,根據表名稱查詢出object_id為
--事實上幾乎所有的用戶對象都出自於SYS.OBJECTS表
SELECT*FROM SYS.OBJECTS
WHERE type_desc='USER_TABLE' AND NAME='TEST'
--兼容性視圖SYSOBJECTS
--如果要查詢與該表相關的其他所有對象,則可以執行以下語句
SELECT*FROM SYS.OBJECTS
WHERE type_desc='USER_TABLE' AND NAME='TEST' OR
parent_object_id in
(SELECTobject_id FROM SYS.OBJECTS
WHERE type_desc='USER_TABLE' AND NAME='TEST')
--表字段詳細信息,可以查詢出相關column_id
SELECT*FROM SYS.COLUMNS
WHERE OBJECT_ID=5575058
--兼容性視圖SYSCOLUMNS
--表索引詳細情況,可以清楚的看到存在兩個索引
SELECT*FROM SYS.INDEXES WHERE OBJECT_ID=5575058
--兼容性視圖SYSINDEXES
--表分區情況,數據庫中所有表和索引的每個分區在表中各對應一行
--此處可以看到該表有兩個分區,聚集索引即表本身,還有一個是name的非聚集索引
--partition_id 即分區的ID
--hobt_id包含此分區的行的數據堆或B樹的ID
SELECT*FROM SYS.PARTITIONS WHERE OBJECT_ID=5575058
--分配單元情況,數據庫中的每個分配單元都在表中占一行
--該表只有和SYS.PARTITIONS配合使用才有意義
SELECT*FROM SYS.ALLOCATION_UNITS
--SYS.ALLOCATION_UNITS和SYS.PARTITIONS一起使用能夠反映出某個對象的頁面分配和使用情況
SELECT*FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE IN (1,3)ANDU.CONTAINER_ID=P.HOBT_IDANDP.OBJECT_ID=5575058
UNION ALL
SELECT*FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE=2ANDU.CONTAINER_ID=P.PARTITION_IDANDP.OBJECT_ID=5575058
--返回每個分區的頁和行計數信息
SELECT*FROM SYS.DM_DB_PARTITION_STATS WHERE OBJECT_ID=5575058
--返回索引的詳細字段情況
SELECT*FROM SYS.INDEX_COLUMNS WHERE OBJECT_ID=5575058
--兼容性視圖SYSINDEXKEYS
--以下為根據某個索引名稱獲取其相關字段的語句
DECLARE @index_field_names VARCHAR(500)
SET@index_field_names='';
SELECT@index_field_names=@index_field_names+c.name+','
FROM SYS.INDEX_COLUMNS a,SYS.INDEXES b,SYS.COLUMNS c
WHERE a.object_id=b.object_idANDa.index_id=b.index_id
ANDa.object_id=c.object_idANDa.column_id=c.column_id
ANDb.name='IX_test2'
ORDER BY a.index_column_id
SET@index_field_names=LEFT(@index_field_names,LEN(@index_field_names)-1)
PRINT @index_field_names
--CHECK約束,數據來源sys.objects.type='C'
SELECT*FROM SYS.CHECK_CONSTRAINTS WHERE OBJECT_ID=?
--兼容性視圖SYSCONSTRAINTS
--數據來源sys.objects.type=D
SELECT*FROM SYS.DEFAULT_CONSTRAINTS WHERE OBJECT_ID=?
--兼容性視圖SYSCONSTRAINTS
--主鍵或唯一約束,數據來源sys.objects.type PK 和UQ
SELECT*FROM SYS.KEY_CONSTRAINTS WHERE OBJECT_ID=?
--兼容性視圖SYSCONSTRAINTS
--外鍵,數據來源sys.object.type=F
SELECT*FROM SYS.FOREIGN_KEYS WHERE OBJECT_ID=?
--兼容性視圖SYSREFERENCES
--觸發器
SELECT*FROM SYS.TRIGGERS WHERE OBJECT_ID=?
--注釋
SELECT*FROM SYS.SQL_MODULES
--兼容性視圖SYSCOMMENTS
--數據庫用戶表
SELECT*FROM SYS.DATABASE_PRINCIPALS
--兼容性視圖SYSUSERS
--數據庫數據類型表
SELECT*FROM SYS.TYPES
--兼容性視圖SYSTYPES
CREATE TABLE dbo.test
(
idintIDENTITY(1,1)NOTNULL,
name char(100)NULL,
CONSTRAINT PK_test PRIMARY KEY CLUSTERED (idASC)
)
CREATE NONCLUSTERED INDEX IX_testONdbo.test(name)
--表和對象詳細信息,根據表名稱查詢出object_id為
--事實上幾乎所有的用戶對象都出自於SYS.OBJECTS表
SELECT*FROM SYS.OBJECTS
WHERE type_desc='USER_TABLE' AND NAME='TEST'
--兼容性視圖SYSOBJECTS
--如果要查詢與該表相關的其他所有對象,則可以執行以下語句
SELECT*FROM SYS.OBJECTS
WHERE type_desc='USER_TABLE' AND NAME='TEST' OR
parent_object_id in
(SELECTobject_id FROM SYS.OBJECTS
WHERE type_desc='USER_TABLE' AND NAME='TEST')
--表字段詳細信息,可以查詢出相關column_id
SELECT*FROM SYS.COLUMNS
WHERE OBJECT_ID=5575058
--兼容性視圖SYSCOLUMNS
--表索引詳細情況,可以清楚的看到存在兩個索引
SELECT*FROM SYS.INDEXES WHERE OBJECT_ID=5575058
--兼容性視圖SYSINDEXES
--表分區情況,數據庫中所有表和索引的每個分區在表中各對應一行
--此處可以看到該表有兩個分區,聚集索引即表本身,還有一個是name的非聚集索引
--partition_id 即分區的ID
--hobt_id包含此分區的行的數據堆或B樹的ID
SELECT*FROM SYS.PARTITIONS WHERE OBJECT_ID=5575058
--分配單元情況,數據庫中的每個分配單元都在表中占一行
--該表只有和SYS.PARTITIONS配合使用才有意義
SELECT*FROM SYS.ALLOCATION_UNITS
--SYS.ALLOCATION_UNITS和SYS.PARTITIONS一起使用能夠反映出某個對象的頁面分配和使用情況
SELECT*FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE IN (1,3)ANDU.CONTAINER_ID=P.HOBT_IDANDP.OBJECT_ID=5575058
UNION ALL
SELECT*FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE=2ANDU.CONTAINER_ID=P.PARTITION_IDANDP.OBJECT_ID=5575058
--返回每個分區的頁和行計數信息
SELECT*FROM SYS.DM_DB_PARTITION_STATS WHERE OBJECT_ID=5575058
--返回索引的詳細字段情況
SELECT*FROM SYS.INDEX_COLUMNS WHERE OBJECT_ID=5575058
--兼容性視圖SYSINDEXKEYS
--以下為根據某個索引名稱獲取其相關字段的語句
DECLARE @index_field_names VARCHAR(500)
SET@index_field_names='';
SELECT@index_field_names=@index_field_names+c.name+','
FROM SYS.INDEX_COLUMNS a,SYS.INDEXES b,SYS.COLUMNS c
WHERE a.object_id=b.object_idANDa.index_id=b.index_id
ANDa.object_id=c.object_idANDa.column_id=c.column_id
ANDb.name='IX_test2'
ORDER BY a.index_column_id
SET@index_field_names=LEFT(@index_field_names,LEN(@index_field_names)-1)
PRINT @index_field_names
--CHECK約束,數據來源sys.objects.type='C'
SELECT*FROM SYS.CHECK_CONSTRAINTS WHERE OBJECT_ID=?
--兼容性視圖SYSCONSTRAINTS
--數據來源sys.objects.type=D
SELECT*FROM SYS.DEFAULT_CONSTRAINTS WHERE OBJECT_ID=?
--兼容性視圖SYSCONSTRAINTS
--主鍵或唯一約束,數據來源sys.objects.type PK 和UQ
SELECT*FROM SYS.KEY_CONSTRAINTS WHERE OBJECT_ID=?
--兼容性視圖SYSCONSTRAINTS
--外鍵,數據來源sys.object.type=F
SELECT*FROM SYS.FOREIGN_KEYS WHERE OBJECT_ID=?
--兼容性視圖SYSREFERENCES
--觸發器
SELECT*FROM SYS.TRIGGERS WHERE OBJECT_ID=?
--注釋
SELECT*FROM SYS.SQL_MODULES
--兼容性視圖SYSCOMMENTS
--數據庫用戶表
SELECT*FROM SYS.DATABASE_PRINCIPALS
--兼容性視圖SYSUSERS
--數據庫數據類型表
SELECT*FROM SYS.TYPES
--兼容性視圖SYSTYPES