码农家园

关闭
导航

SQL Server:我应该在sys表上使用information_schema表吗?


metadatasqlsql-serversql-server-2008stored-procedures

SQL Server: should I use information_schema tables over sys tables?

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

  • INFORMATION_SCHEMA
  • SYS

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

相关讨论

  • 资源数据库是一个只读数据库,其中包含SQL Server附带的所有系统对象。 SQL Server系统对象(如sys.objects)在物理上保留在Resource数据库中,但它们逻辑上出现在每个数据库的sys模式中


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

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

此外,它可能不是人们可以假设的便携性的灵丹妙药。实现在系统之间仍然存在差异。 Oracle根本没有"开箱即用"地实现它,MySql文档说:

Users of SQL Server 2000 (which also follows the standard) may notice
a strong similarity. However, MySQL has omitted many columns that are
not relevant for our implementation, and added columns that are
MySQL-specific. One such column is the ENGINE column in the
INFORMATION_SCHEMA.TABLES table.

即使对于面包和黄油SQL构造(例如外键约束),Information_schema视图的工作效率也明显低于sys.视图,因为它们不会公开允许有效查询的对象ID。

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

INFORMATION_SCHEMA

Plan

SYS

Plan

相关讨论

  • "......你知道一个事实需要是可移植的......" - 请记住,每个新版本的SQL Server都是一个端口。面向未来的是一种判断呼叫,例如: SQL Server团队是否更有可能抛弃Standard Information_Schema VIEW或修改其专有的sys表?
  • 这确实是个大问题。但是如果使用列名,MS确实承诺将sys视图保持为向后兼容......他们保留添加列的权利。 sys& information_schema可以保护您免受新版SQL Server中底层系统表的更改。


我总是尝试使用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

相关讨论

  • 是的,我同意 - 只要您需要/希望在数据库之间"可移植"。如果你100%的SQL Server工作,我通常使用"sys"。目录视图,因为那些更完整,更简洁,更有条理(在我看来) - 完全知道这些查询不适用于DB2或MySQL ...
  • @Marc_s - 是的,我应该真的指出这一点。如果您确定不需要在其他任何地方迁移它,那么您可以使用sys架构。好评


Information_schema更适合可能需要与各种数据库连接的外部代码。一旦你开始在数据库中编程,可移植性就会消失。如果您正在编写存储过程,那就告诉我您已经致力于特定的数据库平台(无论好坏)。如果您已经提交到SQL Server,那么请务必使用sys视图。


我不会重复其他一些答案,而是添加一个性能视角。正如Martin Smith在他的回答中提到的那样,information_schema视图不是这种信息的最有效来源,因为它们必须暴露必须从多个底层源收集的标准列。从这个角度来看,sys视图可以更高效,因此如果您有高性能要求,并且不必担心可移植性,那么您应该使用sys视图。

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

1
2
3
4
5
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业务系统都没有这些级别的性能问题。

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


    Copyright ©  码农家园 联系:[email protected]