【问题标题】:postgres fast check if attribute combination also exists in another tablepostgres快速检查属性组合是否也存在于另一个表中
【发布时间】:2017-08-22 06:01:55
【问题描述】:

我想检查两个不同的表中是否存在相同的两个属性值。如果 table_a 中的组合在 table_b 中不存在,则应将其插入到 select 语句表中。现在我有以下查询,它正在工作:

CREATE TABLE table_a (
attr_a integer,
attr_b text,
uuid character varying(200),
CONSTRAINT table_a_pkey PRIMARY KEY (uuid)
);

CREATE TABLE table_b (
attr_a integer,
attr_b text,
uuid character varying(200),
CONSTRAINT table_b_pkey PRIMARY KEY (uuid)
);


SELECT * FROM table_a
        WHERE (table_a.attr_a::text || table_a.attr_b::text) != ALL(SELECT (table_b.attr_a::text || table_b.attr_a::text) FROM table_b)

但是,执行时间相当长。所以我想问一下是否有更快的解决方案来检查。

【问题讨论】:

  • 与性能无关,但(table_a.attr_a, table_a.attr_b) != all (select table_b.attr_a, table_b.attr_b ..) 会更正确。这可以利用(attr_a, attr_b) 上的索引。查看where not exists 查询是否更快。
  • Edit您的问题并为有问题的表(包括所有索引)添加create table语句以及使用explain (analyze, verbose)生成的执行计划Formatted textno screen shots

标签: sql postgresql select


【解决方案1】:

您的where 子句使用attr_a 的操作(将其转换为文本并与attr_b 连接),因此无法使用索引。为什么不尝试直接使用exists 运算符,而不是这种连接?

SELECT *
FROM   table_a a
WHERE  NOT EXISTS (SELECT *
                   FROM   table_b b
                   WHERE  a.attr_a = b.attr_a AND
                          b.attr_b = b.attr_b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2021-02-11
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2020-08-11
    相关资源
    最近更新 更多