|
6
|
| Ryan Bigg Andrés Bonilla · 技术社区 · 18 年前 |
|
|
1
10
不要浪费时间分析。时间总是在数据库操作中。尽量少做。只是插入的最小数量。 三件事。 一不要反复选择以符合日期、主机名和人员维度。将所有数据一次性提取到Python字典中并在内存中使用。不要重复进行单例选择。使用Python。 二不要更新。 具体来说,不要这样做。这是一个糟糕的代码,有两个原因。
它可以替换为一个简单的SELECT COUNT(*)FROM。从不更新以增加计数。只需使用SELECT语句对其中的行进行计数。[如果无法使用简单的SELECT COUNT或SELECT COUNT(DISTINCT)进行此操作,则会丢失一些数据--您的数据模型应始终提供正确的完整计数。永远不要更新。]
SQL永远不会改变。绑定的值会更改,但SQL永远不会更改。这要快得多。永远不要动态构建SQL语句。从不 |
|
|
2
3
在sql语句中使用绑定变量而不是文字值,并为 每个sql语句都是唯一的,因此下次使用该语句时无需重新分析。从python db api文档:
始终使用绑定变量。 |
|
|
3
3
在for循环中,您重复地插入到“chats”表中,因此您只需要一个带有绑定变量的sql语句,就可以用不同的值执行。所以你可以把它放在for循环之前:
然后,代替执行的每个sql语句,将以下内容放在适当的位置:
这将使事情运行得更快,因为:
注意:我使用的绑定变量语法是特定于Oracle的。您必须查看psycopg2库的文档以了解确切的语法。 其他优化:
|
|
|
4
2
正如Mark所建议的,使用绑定变量。数据库只需准备每条语句一次,然后为每次执行“填空”。作为一个很好的副作用,它将自动处理字符串引用问题(您的程序没有处理)。
您的log\u主机名、log\u person和log\u date函数正在表上进行不必要的选择。使适当的表属性主键或唯一。然后,不要在插入前检查密钥的存在,只需执行插入即可。如果person/date/hostname已经存在,则插入将因违反约束而失败。(如上所述,如果使用具有单个提交的事务,这将不起作用。) 或者,如果您知道只有您一个人在程序运行时插入表,那么在内存中创建并行数据结构,并在执行插入时在内存中维护它们。例如,在程序开始时,将表中的所有主机名读入关联数组。当您想知道是否要执行插入时,只需执行数组查找。如果未找到条目,请执行插入操作并相应地更新数组。(此建议与事务和单个提交兼容,但需要更多的编程。不过速度会快得多。) |
|
|
5
1
除了@Mark Roddy给出的许多好建议外,请执行以下操作:
批处理插入将暂时占用更多内存,但如果不将整个文件读入内存,这应该没问题。 |
|
|
Johnny T · 基于当前值的SQL合并表[重复] 1 年前 |
|
|
Peter Schofield · 类型转换Postgresql 1 年前 |
|
|
Kevin Smeeks · Pyspark JDBC分区读取 1 年前 |
|
|
Andrus · 如何在sql中查找第二个匹配项 1 年前 |