SQL Server的:我应该使用SYS表上的information_schema表?

在SQL Server中有两个元数据模式:

  • INFORMATION_SCHEMA
  • SYS

我听说INFORMATION_SCHEMA表是基于ANSI标准的。 在开发例如存储过程时,是否应该在sys表上使用INFORMATION_SCHEMA表?

我总是试图直接使用Information_schema视图来查询sys模式。

视图符合ISO标准,所以理论上你应该能够轻松地跨越不同的RDBMS迁移任何查询。

但是,在某些情况下,我所需要的信息在视图中是不可用的。

我提供了一些有关视图和查询SQL Server目录的更多信息的链接。

http://msdn.microsoft.com/en-us/library/ms186778.aspx

http://msdn.microsoft.com/en-us/library/ms189082.aspx

除非你正在编写一个应用程序,你知道的事实将需要是可移植的,或者你只需​​要非常基本的信息,我只是默认使用专有的SQL Server系统视图开始。

Information_Schema视图只显示与SQL-92标准兼容的对象。 这意味着即使是非常基本的构造(如索引)也没有信息模式视图(这些未在标准中定义,并作为实现细节留下)。更不用说任何SQL Server专有function。

另外,它不是人们可以设想的便携性的灵丹妙药。 系统之间的实现依然不同。 Oracle并没有实现“开箱即用”, MySql文档说:

SQL Server 2000(也遵循标准)的用户可能会注意到很强的相似性。 但是,MySQL省略了许多与我们的实现无关的列,并添加了特定于MySQL的列。 一个这样的列是INFORMATION_SCHEMA.TABLES表中的ENGINE列。

即使是面包和黄油的SQL构造,如外键约束, Information_Schema视图的效率可能远低于sys. 视图,因为它们不会暴露允许有效查询的对象id。

例如,查看SQL查询从1秒减慢到11分钟的问题 – 为什么? 和执行计划。

INFORMATION_SCHEMA

计划

SYS

计划

INFORMATION_SCHEMA更适合可能需要与各种数据库接口的外部代码。 一旦数据库中开始编程,可移植性就会从窗口中移出。 如果你正在编写存储过程,那就告诉我你已经致力于一个特定的数据库平台(无论好坏)。 如果你已经承诺到SQL Server,那么一定要用sys视图。

我不会重复一些其他的答案,但添加一个性能的angular度来看。 正如马丁·史密斯在他的回答中所提到的,information_schema的观点并不是这个信息的最有效的来源,因为他们必须公开必须从多个基础资源中收集的标准列。 sys视图可以从这个angular度来看效率更高,所以如果你有很高的性能需求,而且不必担心可移植性,你应该使用sys视图。

例如,下面的第一个查询使用information_schema.tables来检查一个表是否存在。 第二个使用sys.tables来做同样的事情。

 if exists (select * from information_schema.tables where table_schema = 'dbo' and table_name = 'MyTable') print '75% cost'; if exists (select * from sys.tables where object_id = object_id('dbo.MyTable')) print '25% cost'; 

当您查看这些IO时,第一个查询对sysschobjs和sysclsobjs有4个逻辑读取,而第二个查询没有。 也是第一个做两个非聚集索引寻找和一个关键的查找,而第二个只做一个聚集索引寻找。 根据查询计划,第一个费用比第二个费用高出约3倍。 如果你必须在大型系统中多次执行这个操作,比如部署时间,这可能会加起来,并导致性能问题。 但是这只适用于重载系统。 大多数IT业务系统不具有这些级别的性能问题。

同样,与大多数系统中的其他查询相比,这些代码的整体成本都非常小,但是如果您的系统具有很多这种types的活动,则可能会加起来。