数百个别名/同义词与数据库表的完全限定名称

时间:2010-11-25 02:23:54

标签: sql sql-server database oracle db2

在多个模式中给出数百个数据库表,在创建存储过程和视图时,您是否建议使用别名/同义词或完全限定名称?给出一些schema.table,如此,

Orders.OrderHeader, Production.LineThroughput, Sales.Opportunities

我希望使用限定名称可以略微提高性能但是如果必须将Orders.Customers等表移到Sales.Customers,我要么必须改变引用Orders.Customers的现有视图/过程或使用提前做出此类行动的同义词。我看到使用同义词将代码移动到测试中的价值,但同时我也可以创建我的生产环境的副本来测试/ dev并且不需要同义词。

SQL Server Books Online建议始终使用完全限定名称。一些朋友建议为数百个表中的每个表创建一个同义词,并仅使用同义词。虽然我更喜欢使用完全限定的名称(更易读和自解释的代码,知道什么引用的对象属于什么模式,以及输入schema.table的习惯),您观察到的重要性能,操作或可读性(dis)优势使用同义词与完全限定的表名?

6 个答案:

答案 0 :(得分:3)

代码(SQL或存储过程)应保留在数据库外部的源代码管理系统中。如果你无法准确地搜索和替换,那么你就会遇到严重的问题,所以应该首先解决这个问题。

如果表的数量很大,则确实需要使用前缀。不是Sales.Customer而是REF_Customer。

dot指定它位于单独的数据库(MS和Sybase)或模式(DB2和Oracle)中。这是一个单独的恢复单元,因此它们是单独维护的,每次跨越边界时服务器都必须切换上下文。因此,您需要正确地收集表,并使用一些数据库/模式,而不是很多。例如。将参考表分开,这些参考表不经常更新,并且通常从其他dbs /模式中引用。

始终在SQL代码中使用完全限定名称。不作为列名的前缀,而是作为每个WHERE和FROM子句。在将数据库/模式或环境,DEV转移到UAT或PROD时,这将非常有用。

答案 1 :(得分:2)

我总是在查询中使用别名,一个主要原因是查询更容易阅读。反复重复整个表名只会使代码混乱。

大多数情况下,表名是超级的,显而易见的只是它们来自的字段名称。但是,您应始终指定从哪个表中获取字段,这样可以使查询更易于维护,并且对数据库中的更改变得不那么敏感。

查询通常只使用几个表,因为它们是相关的,所以很容易跟踪所使用的表。如果没有,那么确定别名的含义只是另一个步骤,并且信息在查询中可用。

如果需要将表移动到其他数据库,别名也很有帮助。由于完整的表名仅在查询中指定一次,因此更容易更改。

如果指定相同字段的不同方式之间的性能存在任何差异,那么只会在解析查询的过程中,因此这将是最小的。查询运行时,根本没有性能差异。

答案 2 :(得分:2)

这是一种“依赖于”的情况。

就个人而言,在一个分布在多个模式中的表的应用程序中,我宁愿不在我的代码中的任何地方硬编码模式名称;为此,我将为每个具有代码的模式创建私有同义词。

这样,如果一个表从一个模式移动到另一个模式,或者(更糟糕的是)重命名模式),我只需要更新指向它的同义词,而不是遍历所有代码和视图。

另一方面,在某些情况下,我更喜欢编写明确引用模式的代码 - 它是数据迁移项目的代码,它必须在多个模式中引用同一个表,然后我们“锁定” “模式名称使得它可以在DEV / TEST / etc中工作,而不需要很多同义词。

答案 3 :(得分:1)

我的两分钱......

就个人而言,我所在的公司使用了完全限定的对象名称,即使在引用同一模式中的对象时也是如此。在我们确实将表移动到另一个模式的极少数情况下,我们通常在旧位置设置一个视图(不是同义词)以实现向后兼容,主要是因为我们过去曾因重新验证问题而被烧毁。

性能方面,至少在Oracle中,有报告称同义词的性能略有下降,因为数据库必须首先解析同义词的名称,然后解析目标对象的名称(表/视图/包/等) )。公共同义词的性能略高(非公共同义词的2倍)。但是,这有点争议;有关详细信息,请参阅this Ask Tom article。但是,除非您将数据库推到极限,否则我不担心。

答案 4 :(得分:0)

如果您预计表格确实会移动,那么请使用完全合格的名称。

答案 5 :(得分:0)

任何问题都有答案。这就是为什么“它取决于”总是正确的答案。我发现,当你坚持自己的意图并最终设计出来时,你就会前进。

架构是为名称空间隔离而设计的。例如,在设计SaaS系统时,可以非常有效地使用模式来分离多个租户的关注点。模式还可用于将测试与生产或一个应用程序数据分开。它不仅适用于表,还适用于存储过程和所有其他数据库对象。

DB2提供了一个名为CURRENT SCHEMA的特殊寄存器,它允许您编写非限定对象名称,但只需设置CURRENT SCHEMA特殊寄存器即可切换到正确的模式:

SET CURRENT SCHEMA =  'Production'

在我看来,这比使用同义词要好得多。