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相关;此外,它提供的数据比信息模式版本更难读取。

您真的认为这会成为性能的瓶颈吗?现在它并没有造成任何问题,但我只想了解,通常人们会如何选择使用哪一个?