SQL Server: should I use information_schema tables over sys tables?
在SQL Server中,有两种元数据模式:
- INFORMATION_SCHEMA
- SYS
我听说
除非您正在编写一个您知道的应用程序需要可移植的应用程序,或者您只需要非常基本的信息,否则我将默认使用专有的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构造(例如外键约束),
例如查看SQL查询从1秒到11分钟减慢的问题 - 为什么?和执行计划。
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
我不会重复其他一些答案,而是添加一个性能视角。正如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业务系统都没有这些级别的性能问题。
同样,与大多数系统中的其他查询相比,它们的总体成本非常小,但如果您的系统有很多此类活动,则可能会增加。