什么时候不适合使用派生表?
Posted
技术标签:
【中文标题】什么时候不适合使用派生表?【英文标题】:When is it not appropriate to use Derived tables? 【发布时间】:2011-03-10 05:40:30 【问题描述】:SO post 详细介绍了派生表与临时表在性能方面的一些优势。
除了性能之外,还有哪些情况不适合派生表。
每个帖子的一个答案和一个例子会很有帮助。
【问题讨论】:
那个question is tagged for SQL Server,所以信息应该被视为特定于它而不是所有数据库。 【参考方案1】:如果您必须在多次查询中访问临时表中的数据,避免重复生成临时数据的成本可能会更低:
CREATE TEMPORARY TABLE foo AS SELECT ...;
SELECT ... FROM foo WHERE ...conditions...;
-- sometime later
SELECT ... FROM foo WHERE ...different conditions...;
【讨论】:
【参考方案2】:我更愿意在临时表上进行自联接,而不是派生表。
CREATE TEMPORARY TABLE foo AS SELECT ...;
SELECT ... FROM foo f1 JOIN foo f2 ON ...conditions...;
与使用派生表相比,您必须将整个查询编写两次:
SELECT ...
FROM (SELECT ...)
JOIN (SELECT ...) ON ...conditions...;
但另一种解决方案是使用与派生表略有不同的通用表表达式:
WITH foo AS (SELECT ...)
SELECT ... FROM foo f1 JOIN foo f2 ON ...conditions...;
只要您使用支持此语法的品牌数据库(Microsoft、Oracle、IBM、PostgreSQL)。
【讨论】:
【参考方案3】:范围可能是一个。我认为临时表可以被其他事务/进程等访问。派生表仅限于声明它们的块。
【讨论】:
以上是关于什么时候不适合使用派生表?的主要内容,如果未能解决你的问题,请参考以下文章