Sql server TSQL信息\u SCHEMA.COLUMNS VS sys.COLUMNS VS colu长度(';Table';,';ColumnName';)
我找到了这几个变体来检查列是否存在。一些评论说,访问Sql server TSQL信息\u SCHEMA.COLUMNS VS sys.COLUMNS VS colu长度(';Table';,';ColumnName';),sql-server,performance,tsql,database-performance,query-performance,Sql Server,Performance,Tsql,Database Performance,Query Performance,我找到了这几个变体来检查列是否存在。一些评论说,访问信息模式视图或系统列会命中磁盘,而列长度使用缓存数据库,但我不太明白这意味着什么 我找不到任何解释该模式如何存储在磁盘上、其缓存方式以及这3个选项之间的性能差异的内容 有人能给我解释一下吗?SQL Server存储有关数据库及其内容的元数据。通常通过sys.表格和信息\u模式。视图访问这些信息 sys表在某种程度上特定于SQL Server,并且趋向于相当标准化。相反,信息模式视图(与您可能创建的其他许多报告视图一样)以更可读的格式提供数据—它
信息模式
视图或系统列
会命中磁盘,而列长度
使用缓存数据库,但我不太明白这意味着什么
我找不到任何解释该模式如何存储在磁盘上、其缓存方式以及这3个选项之间的性能差异的内容
有人能给我解释一下吗?SQL Server存储有关数据库及其内容的元数据。通常通过
sys.
表格和信息\u模式。
视图访问这些信息
sys表在某种程度上特定于SQL Server,并且趋向于相当标准化。相反,信息模式视图(与您可能创建的其他许多报告视图一样)以更可读的格式提供数据—它们通常将各种sys表连接在一起以获得结果。有关更多信息,请参阅
COL_LENGTH()是一个在数据库上运行的函数,不需要“读取数据”
然而,对于所有实际目的,您将发现它们之间的差异为零。如果您刚好在特定列的列长度之后,请使用COL_length,因为它可能会稍微快一些。否则,您可以随意使用information_schema视图,因为它们提供了更易于阅读的信息(或一组连接在一起的定制sys表),因为获取元数据的读取次数非常少
例如,我有一个用于测试的表,名为“test”,有5列(ID和col2、col3、col4、col5)。它几乎有200万行,但实际上不需要读取该表中的任何数据,只需要读取元数据
我运行了这些命令,以从每个列获取列长度/信息。每一个都需要0.000秒才能完成(例如,不到1毫秒)。下面是一些命令和结果(仅前10列)以演示其中的一些差异
SELECT col_length('dbo.test', 'col2') AS Col2_info
/*
Col2_info
100
*/
SELECT * FROM sys.columns where object_id = (SELECT TOP 1 object_id FROM sys.objects WHERE name = 'test')
/*
object_id name column_id system_type_id user_type_id max_length precision scale collation_name is_nullable is_ansi_padded
2094630505 ID 1 56 56 4 10 0 NULL 0 0
2094630505 col2 2 167 167 100 0 0 Latin1_General_CI_AS 0 1
2094630505 col3 3 167 167 100 0 0 Latin1_General_CI_AS 1 1
2094630505 col4 4 167 167 100 0 0 Latin1_General_CI_AS 1 1
2094630505 col5 5 167 167 100 0 0 Latin1_General_CI_AS 1 1
*/
SELECT * from information_schema.COLUMNS where table_name = 'test'
/*
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH
Testdb dbo test ID 1 NULL NO int NULL
Testdb dbo test col2 2 NULL NO varchar 100
Testdb dbo test col3 3 NULL YES varchar 100
Testdb dbo test col4 4 NULL YES varchar 100
Testdb dbo test col5 5 NULL YES varchar 100
*/
注意,在上面的版本中,sys.columns版本更难构建,因为它只与我的test_表的object_id相关;此外,它提供的数据比信息模式版本更难读取。您真的认为这会成为性能的瓶颈吗?现在它并没有造成任何问题,但我只想了解,通常人们会如何选择使用哪一个?