一个非常大的 IN (ids) 语句的性能问题

Shimu

我有这样的声明:

select qulified_name
from table
inner join references_table on references_table.id = table.ref_id
where references_table.type = 'x' and table.value in (... +110 000 ids)

这是非常缓慢的。(Web应用程序崩溃并且没有结果。我在rom-rb的帮助下创建了我的语句,它使用了续集。但这是我在查看语句时得到的语句。

如果我像这样重写语句,与第一个版本相比,性能真的很好:

select qulified_name
from table
inner join (select unnest(array['#{references_id.join("','")}']) id ) as tmp on tmp.id = businesspartner_references.value
inner join references_table on references_table.id = table.ref_id
where references_table.type = 'x'

这样我就可以在大约 3 秒内得到结果。

有人可以向我解释为什么会这样吗?我不明白。。

卡尔蒂克

当您使用 IN 子句时,尤其是使用大量值时,数据库别无选择,只能迭代地将每个元组值与 IN 子句中的每个值进行比较,这将是低效的。

相反,当您使用子查询将其转换为派生表时,它现在变成了面向集合的连接操作,相反。

数据库非常擅长评估面向集合的操作,并且可以为您的数据找到最佳的连接算法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将一个非常大的UIView用作UIScrollView中的长时间滚动会导致资源问题吗?

我编写了一个计算collatz猜想的程序,它可以工作但不能计算非常大的数字,我该如何解决这个问题?

一个非常非常大的div

遍历一个非常大的列表

在python中打印一个非常大的整数

计算一个非常大的整数的素因子

grep / sed / awk在非常大的文件上的性能如何?

在非常大的数据帧上提高迭代性能

子集非常大的文件 - 最佳性能的python方法

Python numpy性能-在非常大的数组上进行选择

正确的方法以最大的性能存储非常大的整数?

在非常大的画布元素上绘制问题

快速分类处理非常大的数据集问题

比较三个非常大的数组并创建一个新对象

如何合并同一个非常大的项目的 2 个版本

什么是处理与SQL一个“非常大的库存最好的方法是什么?

在满足条件的非常大的内存图中获取下一个元素的索引

在UNIX shell中删除一个非常大的文件的前n个字符

如何在R包中保存一个非常大的.rda文件

在HDFS中将多个文本文件串联为一个非常大的文件

将变量分配给一个非常大的数组使其未定义

用double类型定义一个非常大的2D数组

SparkR Stage X 包含一个非常大的任务

我应该如何存储一个非常大的数据类型

如何在并行R中填充一个非常大的数组

如何从C#的末尾读取一个非常大的文件?

并行处理一个非常大的矩阵从n ^ 2 x 3到nxn的变换?

读取非常大的一个班轮文本文件

非常大阶乘的最后一个非零数字