在db上插入空值或测试它是否为null而不是插入是否更快?

时间:2014-07-01 00:38:10

标签: python postgresql

我正在使用python和postgresql。我有很多colums默认为null。插入空值是否更快或测试rhe值是否为null并且仅在这种情况下插入?该查询是一个大查询,它将一次插入一个包含500多列的表中。一些colums将为null,而其他colums将不会。我是否应该只包含非空的查询列,或者我可以使用所有列的查询,其中一些是null?

由于

2 个答案:

答案 0 :(得分:1)

为了绝对确定,我建议实现这两种类型 - 可能使用命令行选项或环境变量 - 然后基准结果。

但是,如果将 INSERT 构造为 SELECT ,则可以以纯 Postgres 方式组合这两者。

即。形式的东西:

INSERT INTO foo
SELECT bar
FROM baz
WHERE bar IS NOT NULL;

这几乎肯定会比两个单独的查询更快,例如 psycopg2 ,一个用于查看是否为NULL,另一个用于执行插入。

重新阅读你的帖子,你提到有很多列,其中一些可能是NULL,而另一些则不是。您可以基于每个列构建动态SQL客户端,并且只能 INSERT 这些列。如果您拥有所有这些值(即您不需要进行额外的数据库查询来获取它们),那么构建动态包含这些列的INSERT可能会有所帮助。但是,目前尚不清楚是否值得进行额外的编码工作。

更大的权衡是 INSERT INSERT 。因此,如果所有你有几列并且可以检查它们是否为null以避免 INSERT ,那可能会更好。例如,检查500列,考虑到需要进行多少比较,这一点就不太清楚了。

我建议专门针对500列案例:

使用 INSERT 的值执行 INSERT ,无论它们是否为NULL,并评估性能。如果性能可以接受,那么就不需要进一步优化。如果性能不是很好,那么值得采取一些步骤进行优化,可能从客户端动态构造查询过滤掉 INSERT 中的NULL值。

暂时不说:一张桌子有500列?这可能表明某些规范化是有序的。 (或者500列是特定 de - 标准化的结果?)

答案 1 :(得分:0)

我希望指定所有列的速度更快。这样你就可以PREPARE一次声明,并重复使用它。

那就是说,Ken是对的:基准,看看

你知道你的uncomfortably close to PostgreSQL's column count limit正确吗?在达到限制之前,请考虑设计更改以现在规范化您的数据。