我正在使用python和postgresql。我有很多colums默认为null。插入空值是否更快或测试rhe值是否为null并且仅在这种情况下插入?该查询是一个大查询,它将一次插入一个包含500多列的表中。一些colums将为null,而其他colums将不会。我是否应该只包含非空的查询列,或者我可以使用所有列的查询,其中一些是null?
由于
答案 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正确吗?在达到限制之前,请考虑设计更改以现在规范化您的数据。