SQL Server:我应该在sys表上使用信息\u架构表吗?

SQL Server:我应该在sys表上使用信息\u架构表吗?,sql,sql-server,sql-server-2008,stored-procedures,metadata,Sql,Sql Server,Sql Server 2008,Stored Procedures,Metadata,在SQL Server中,元数据有两种模式: 信息模式 系统 我听说INFORMATION\u SCHEMA表格是基于ANSI标准的。在开发例如存储过程时,明智的做法是在sys表上使用INFORMATION\u SCHEMA表吗?我总是尝试使用INFORMATION\u SCHEMA视图而不是直接查询sys模式 这些视图符合ISO标准,因此从理论上讲,您应该能够轻松地跨不同的RDBMS迁移任何查询 然而,在某些情况下,我需要的信息在视图中是不可用的 我提供了一些链接,其中包含有关视图和查询S

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

  • 信息模式
  • 系统

我听说
INFORMATION\u SCHEMA
表格是基于ANSI标准的。在开发例如存储过程时,明智的做法是在
sys
表上使用
INFORMATION\u SCHEMA
表吗?

我总是尝试使用
INFORMATION\u SCHEMA
视图而不是直接查询
sys
模式

这些视图符合ISO标准,因此从理论上讲,您应该能够轻松地跨不同的RDBMS迁移任何查询

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

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


除非您正在编写一个应用程序,而且您知道该应用程序实际上需要可移植,或者您只需要非常基本的信息,否则我将首先默认使用专有的SQL Server系统视图

Information\u Schema
视图仅显示与SQL-92标准兼容的对象。这意味着即使是索引这样的非常基本的构造也没有信息模式视图(这些在标准中没有定义,只作为实现细节),更不用说任何SQL Server专有功能了

此外,它并不是人们可能认为的便携性的万灵药。系统之间的实现仍然不同。Oracle根本没有“开箱即用”地实施它,并表示:

SQL Server 2000(也遵循该标准)的用户可能会注意到 非常相似。但是,MySQL省略了许多不可用的列 与我们的实现无关,并添加了 特定于MySQL。一个这样的柱是发动机中的发动机柱 信息\u SCHEMA.TABLES表

即使对于简单的SQL构造(如外键约束),
信息模式
视图的使用效率也可能大大低于
sys.
视图,因为它们不公开允许高效查询的对象ID

e、 g.参见问题和执行计划

信息模式

系统

信息模式
更适合于可能需要与各种数据库接口的外部代码。一旦你开始在数据库中编程,可移植性就消失了。如果您正在编写存储过程,这说明您已承诺使用特定的数据库平台(无论是好是坏)。如果您已承诺使用SQL Server,那么请务必使用
sys
视图。

我不再重复其他一些答案,而是添加一个性能透视图。正如Martin Smith在回答中提到的,信息模式视图并不是最有效的信息源,因为它们必须公开必须从多个底层源收集的标准列。从这个角度来看,sys视图可以更高效,因此如果您有高性能需求,并且不必担心可移植性,那么您可能应该使用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时,第一个查询有4个对sysschobjs和sysclsobjs的逻辑读取,而第二个查询没有。另外,第一个执行两个非聚集索引查找和一个键查找,而第二个仅执行一个聚集索引查找。根据查询计划,第一个成本比第二个高约3倍。如果您必须在大型系统中多次执行此操作(例如部署时间),这可能会导致性能问题。但这实际上只适用于重载系统。大多数IT业务线系统都没有这些级别的性能问题


同样,与大多数系统中的其他查询相比,这些查询的总体成本非常小,但如果您的系统有大量此类活动,则可能会增加。

是的,我同意-只要您需要/希望在数据库之间“可移植”。如果您100%地使用SQL Server,我通常会使用“sys.”目录视图,因为这些视图更完整、更简洁、组织更好(在我看来)-完全清楚这些查询在DB2或MySQL上不起作用…@Marc_s-是的,我真的应该强调这一点。如果您确实确定它不需要迁移到其他任何地方,那么使用
sys
模式就可以了。很好的评论“……事实上,您知道需要可移植……”——请记住,每一个新版本的SQL Server都是一个端口。未来验证是一种判断,例如,SQL Server团队是否更有可能放弃标准信息模式视图或修改其专有的sys表?这确实是一个大问题。但是如果你使用列名的话,微软承诺会保持sys视图向后兼容。。。他们保留添加列的权利。在新版本的SQL Server中,sys和information_架构都将保护您不受基础系统表更改的影响。资源数据库是一个只读数据库,包含SQL Server中包含的所有系统对象。SQL Server系统对象(如sys.objects)在物理上持久化在资源数据库中,但它们在逻辑上显示在每个数据库的sys架构中