当前位置: 首页 > 面试题库 >

使用NOT IN时PostgreSQL查询速度很慢

尉迟远
2023-03-14
问题内容

我有一个PostgreSQL函数,可以将查询结果返回到pgadmin结果网格中。在内部,这是一个简单的函数,使用adblink连接到另一个数据库并返回查询,以便我可以简单地运行

SELECT * FROM get_customer_trans();

它的运行就像基本的表查询一样。

问题是当我使用该NOT IN子句时。因此,我想运行以下查询,但它要花很多时间:

SELECT * FROM get_customer_trans()
WHERE user_email NOT IN 
    (SELECT do_not_email_address FROM do_not_email_tbl);

我怎样才能加快速度?有什么比NOT IN这种情况下的子句快的吗?


问题答案:

get_customer_trans()不是表-可能是一些存储过程,因此查询并不是很简单。您需要查看此存储过程的实际作用,以了解为什么它可能运行缓慢。

但是,不管存储过程的行为如何,添加以下索引都会有很大帮助:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

该索引使NOT IN查询可以快速返回答案。但是,NOT IN已知在较旧的PostgreSQL版本中存在问题-因此请确保您至少运行PostgreSQL
9.1或更高版本。

更新 。尝试将查询更改为:

SELECT t.*
FROM get_customer_trans() AS t
WHERE NOT EXISTS (
    SELECT 1
    FROM do_not_email_tbl
    WHERE do_not_email_address = t.user_email
    LIMIT 1
)

此查询不使用NOT IN,并且应该可以快速运行。我认为,在PostgreSQL 9.2中,此查询的运行速度应与其中的一样快NOT IN



 类似资料:
  • 问题内容: 我正在使用Google BigQuery,并且正在从PHP执行一些简单的查询。(例如,从电子邮件中的SELECT * WHERE email='mail@test.com‘)我只是在检查表中是否存在该电子邮件。 表“电子邮件”目前为空。但是,PHP脚本仍然需要大约4分钟的时间来检查一个空表上的175封电子邮件。.如我希望将来该表将被填充,并且将有500 000封邮件,那么我想请求时间会

  • 问题内容: 这是查询(最大的表约有40,000行) 如果运行此命令,它将很快执行(大约.05秒)。它返回13行。 当我在查询末尾添加一个子句(按任意列排序)时,查询大约需要10秒钟。 我现在正在生产中使用此数据库,并且一切正常。我所有其他查询都很快。 有什么想法吗?我在MySQL的查询浏览器中并从命令行运行了查询。两个地方都死了。 编辑: Tolgahan ALBAYRAK解决方案有效,但是谁能解

  • 执行此操作后: 结果是:T0:5.971µs T1:26.69574ms 为什么第二个新的Arc::慢,如果我们克隆c0之前? 编辑: 我用以下方法测试了它: < li>Windows 10,rust 1.44.1调试版 < li>Linux,rust 1.47-夜间发行版 < li>Linux,rust 1.18 < li>MacOS,rust 1 . 44 . 0-夜间发布 T1的时间随向量大

  • 问题内容: 我有一个MySQL查询(Ubu 10.04,Innodb,Core i7、16Gb RAM,SSD驱动器,优化的MySQL参数): 表em_link_data有大约700万行,em_link有数千行。此查询大约需要 18秒 才能完成。但是,如果我替换子查询的结果并执行以下操作: 那么查询将在不到1毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。 如果我将查

  • 问题内容: 可以说我有这样的第一张桌子 分支表 第二张桌子是这样的 余额表 我想查询余额表,其中每一行包含分支表的名称。例如分支表中的“ 123456ABC”,我想从余额表中获取“ ABC”行 我怎样才能做到这一点?到目前为止,我还没有尝试过这个查询 有什么建议吗? 问题答案: 你应该 转换 了的名称模式: 联接看起来更易读:

  • `public class Main{private static Connection connect=null;private static Statement PreparedStatement=null;private static ResultSet ResultSet=null;