我对查询性能有一点疑问。基本上,我有一张超过1C记录的表。 sl_id
是该表中的主键。目前,我正在使用status
将表格列true
更新为false
(默认sl_id
)。
在我的程序中,我将在阵列中有200个独特的sl_id
。我通过使用每个status
更新true
到sl_id
(总是)。
我怀疑:
我应该通过在where条件中指定每个qazxsw poi来更新状态来使用单独的更新查询吗?
(要么)
我应该使用sl_id
运算符并将所有200个唯一的IN
放在一个查询中吗?
哪一个会更快?
按从粗到慢的粗略顺序:
sl_id
或WHERE ... IN (...)
的1大疑问WHERE EXISTS (SELECT ...)
条款中使用INNER JOIN
进行的1大查询VALUES
值列表到临时表,索引它,以及临时表上的COPY
。如果你使用了数百个值,我真的建议加入JOIN
条款。对于成千上万的值,VALUES
到临时表并索引然后加入它。
连接值子句的示例。鉴于此COPY
查询:
IN
与SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
相当的是:
VALUES
但请注意,使用qazxsw poi这种方式是PostgreSQL扩展,而qazxsw poi或使用临时表是SQL标准。
看到这个相关的问题:
SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
当然你应该使用VALUES
运算符。进行200次查询比一次查询慢得多。请记住,当您向数据库发送查询时,服务器和数据库之间需要额外的时间进行通信,这会破坏您的性能。
肯定IN更强大,但是再次检查IN的匹配数量会导致性能问题。
因此,我建议使用IN但使用BATCH,如果你有200条记录要更新,然后分成50条,然后进行4次UPDATE查询,或类似的东西。
希望能帮助到你...!!