Rhy*_*oid 6 postgresql constraints data-ingestion
因为在 Debian stable 上安装非常容易,所以我决定使用 PostgreSQL 9.6 为我需要处理的一些数据构建一个数据仓库。第一步是以最少的转换将数据加载到数据库中,主要是纠正一些已知的格式错误以及布尔值的表示方式。我已经检查过这些更正是否有效:将n行写入磁盘所需的时间与n.
但是,使用 PostgreSQL 批量加载这些数据COPY FROM(无论如何;\copy或 psycopg2copy_expert或COPY FROM '/path/to/data.csv')都需要超线性的时间。渐近时间复杂度似乎比 好一些O(exp(sqrt(n)))。这就是我已经的复杂性:
READ UNCOMMITTED, 和DEFERRED.这是我看到的最严重的违规者之一,一个 17M 的行表:
禁用fsync可将进程加速 10 倍,因此 I/O 显然是一个巨大的瓶颈。然而,除此之外,时间行为并没有太大变化:
当我使用代理键而不是业务键时,这个问题就完全消失了:当我使用自动递增的整数列作为主键时,摄取又需要时间,这正是我想要的。因此,我不仅对我的问题有一个完全有效的解决方法,而且我还知道复杂的主键是罪魁祸首(业务键通常是短 VARCHAR 列的元组)。?(n)
但是,我想了解为什么 PostgreSQL 在以业务密钥为键的情况下要花这么长时间来摄取数据,以便我更好地了解我的工具。特别是,我不知道如何调试这个摄取过程,因为EXPLAIN不适用于COPY. 对于复合主键,可能将数据排序到存储中需要更长的时间,或者这是由于索引,或者主键约束实际上仍然是NOT DEFERRED; 如果解决方法不会那么有效,或者由于其他原因不受欢迎,我如何才能发现这里实际发生了什么?
| 归档时间: |
|
| 查看次数: |
1232 次 |
| 最近记录: |