根据两列的长列表选择行。

问题描述 投票:0回答:1

假设我有以下表格

CREATE TABLE IF NOT EXISTS "PROPS" (
   "O_TYPE_ID"  UUID NOT NULL,
   "O_ID"       UUID NOT NULL,
   "R_TYPE_ID"  UUID NOT NULL,
   "NAME"       VARCHAR NOT NULL,
   "VALUE"      VARCHAR,

   CONSTRAINT PK_PROPS  PRIMARY KEY ("O_ID", "R_TYPE_ID", "NAME")
    );

现在我有一个列表,这是我想用来查询Postgres的列表。这意味着我有一个列表

List((O_ID.type, NAME.type))

我想把所有具有这两种类型组合的记录都列出来,一个单子列表我可以用in操作符,在上面的情况下如何查询list os列表值?一个天真的实现是用两个等价子句和and操作符做一个where,但是在我的情况下如果列表太大,那就意味着太多IO,你如何处理这种情况,以一种非常优化的方式处理列表的列表,而不会有太多的IO。使用9.4以上的Postgres。

postgresql postgresql-9.4
1个回答
1
投票

许多可能的方法之一:传递两个数组,一个数组为 O_ID姑且称之为 o_id_arr),一个阵列的 NAME 姑且称之为 name_arr);然后并行解嵌并加入。

SELECT p.*
FROM   (o_id_arr, name_arr) AS t("O_ID", "NAME")
JOIN   "PROPS" p USING ("O_ID", "NAME");

在Postgres 9.4中引入了并行嵌套多个数组的功能,所以对你来说应该适用。

或者,特别是对于大表和非常长的列表,创建一个临时表,将你的数据插入其中,可选择地 ANALYZE 的索引,然后连接到它。

CREATE TEMP TABLE tmp ("O_ID" UUID, "NAME" VARCHAR);

INSERT INTO tmp VALUES (..., ...), (..., ...);

ANALYZE tmp;

SELECT p.*
FROM   tmp
JOIN   "PROPS" p USING ("O_ID", "NAME")

通常情况下,你应该有一个多列的索引在上面 "PROPS" ("O_ID", "NAME") 为性能。但看到 "O_ID" 是类型 uuid,奇数PK指数在 ("O_ID", "R_TYPE_ID", "NAME") 可能做的工作。为什么说 "奇怪"?两个UUID和一个varchar列似乎太臃肿了,对于一个好的PK ...

相关的。

旁白:去掉那些繁琐且容易出错的双引号标识符。使用合法的、小写的标识符,不用双引号。请看。

你的未引用的约束名 PK_PROPS 被保存为 pk_props ...

© www.soinside.com 2019 - 2024. All rights reserved.