3
|
devoured elysium · 技术社区 · 14 年前 |
![]() |
1
3
我想是吧
|
![]() |
2
5
首先假设这两个查询只是表。你可以这样做:
可以用查询(称为内嵌视图)替换每个表:
如果一个查询可能为另一个查询不返回数据的生产者返回数据,则可能需要将我的“join”更改为“full outer join”。我还倾向于按如下方式重新构造查询,对外部联接到2个子查询的生产者进行主查询(除去生产者):
(正是这种类型的查询测试了下面的性能)。 我对Oracle中的标量子查询和内联视图(由Performancedba请求)的相对性能的说明现在在这里离线,而不是用OP可能不感兴趣的信息来膨胀此答案: Notes on Performance |
![]() |
3
4
如果每个查询中不存在每个生产者,您可能希望将联接更改为完全外部联接。 |
![]() |
4
3
2010年11月28日修订还是我做错了什么? 对。你知道两个简单的集合,你专注于从这两个集合中产生第三个集合。
尝试这种方法,它是一种面向集的方法,用于操作关系数据库,直接从数据(1)生成新的单集,而不考虑两个已知集。然后,它以直接、简单、逻辑的方式使用SQL语言(2)来获得这一需求。是的,这正好是两个标量子查询(返回单个值):
比较2010年11月29日本节仅适用于对托尼和我参与的测试感兴趣的人及其结论。 托尼报告说Oracle在2秒内执行了他的查询,而我的查询在5秒内执行,这让我很不安。我不能认同这样一个观点:代码的长度是原来的两倍;它使用的集数是原来的三倍,可以运行得更快。 我在Sybase上进行了测试。我已经有了一个基准结构,它允许非常相似的代码被测试(我的表上的测试不需要连接两个表,但我将其包括在内,以便尽可能接近OP的问题)。200万客户交易(动物)遍布100家客户(生产商)。也就是说,这两个查询都从2.0m数据点或100 x 20000个标量生成相同的结果集(100个客户(生产者)乘以3列)。让我们准确地识别它们,以便更好地理解和比较它们。首先是所用结构的DDL: 1_set_scalar_子查询 为可用的基准结构呈现的与上面代码完全相同的代码:
Link to 1_Set_Scalar_Subquery Code & Timings
3_set_inline_查询 与Tony代码完全相同的代码,用于可用的基准结构:
Link to 3_Set_Inline_Query Code & Timings
当然,在繁忙的服务器上,70%的差异会被夸大。 3_set_inline_query_improved
由于OP提供的原始集合效率很低,也就是说,它可以很容易地改进,2 x
这样做的目的是测试我的语句的准确性,即Sybase以相同的效率执行标量子查询和内联查询。至少现在我们比较了两个好的代码段,每个代码段的结构完全不同,而不是一个好的代码段和一个差的代码段。 Link to 3_Set_Inline_Query_Improved Code & Timings
除了甲骨文,由于它的特殊性和局限性,人们必须避免这种情况,并且使用已知不会表现糟糕的结构。 比较2010年12月1日托尼公布了他的测验结果。他们自言自语,结案了。 然而,他提出了一个问题,即尽管在这个特定的情况下(这个问题),Oracle执行1_set_scalar_子查询的速度几乎是3_set_inline_查询的两倍,因为count()是从索引服务的,而不访问表,通常Oracle执行inline q查询比标量子查询好得多,并测试sum(),以检查访问表的效果。 因此,我在Sybase中运行了相同的测试,count()改为sum()。与Oracle一样,count()是一个覆盖的查询,但是sum()现在要求访问表。
1_set_scalar_subquery_sum 与1_set_scalar_subquery_sum相同,count()改为sum()。 Link to 1_Set_Scalar_Subquery_SUM Code & Timings
3_设置_inline_查询_和 与3_set_inline_query相同,count()改为sum()。 Link to 3_Set_Inline_Query_SUM Code & Timings
当然,在繁忙的服务器上,38%的差异会被夸大。 3_set_inline_query_improved_sum 与改进的3_set_inline_query_相同,count()改为sum()。 Link to 3_Set_Inline_Query_Improved_SUM Code & Timings
|
![]() |
5
1
我认为这应该是一个单独的答案,因为它与你最初的问题有关,而不是你所说的问题。我接受你的 还是我做错了什么? 在另一个地方。 由于我和托尼一起练习,这需要检查你的两套原稿,所以很明显,它们效率很低,可以根据我之前的答案(1),(2)加以改进。考虑和关注Oracle的障碍,您需要解决这些障碍,干扰和抑制解决查询的面向集方法。
我怀疑它会比您最初的查询更快,尽管我听说Oracle不能很好地处理标量子查询,因为这样可以避免处理大的集合;但是我不能在Oracle上测试它。
如果这对你有用,那自然会得到你所说问题的答案:
如果你被空值和spinster困扰,那么mcha的答案是最好的。 |
![]() |
6
0
这就是你要的? |
![]() |
7
0
据我所知,您需要一个查询,它将向您显示:
您可以尝试如下操作:
当然,你可以优化它,这只是一个想法:) |
![]() |
8
0
你想把桌子联合起来吗?(把桌子放在一起)
union和join都可以生成您想要的输出格式,但是它们是非常不同的。 由于它们的列不匹配,您需要插入空位置保持器以进行联合。 |
![]() |
9
0
在不详细讨论查询的情况下,我认为以下内容可能会有所帮助。
|
![]() |
blogger13 · 视频租赁店数据库的规范化 4 月前 |
![]() |
ì¤ì¤í · 为什么LEFT INNER JOIN被弃用? 5 月前 |
![]() |
relatively_random · 确保两个表之间一致的共同参考 6 月前 |
|
Grenish Rai · Firestore错误“用户文档不存在” 9 月前 |
![]() |
Saijo-Shi · PLpgsql中的更新触发器 9 月前 |
![]() |
Dante · Django::配置不当:池不支持持久连接 10 月前 |
![]() |
YouLocalRUser · 删除重复行,保留第一行 11 月前 |