问题的简短版
为什么使用postgres \timeing on
测量查询执行时间与使用R测量查询执行时间有很大不同?
长版
我正在比较三种不同的数据库模式:一种是3-NF(图中的NF),一种是非规范化(NN),另一种是使用自定义访问功能(EF)。这三个都返回相同的结果。非规范化版本实际上存储了复杂交叉连接的结果,这在NF中是必需的。在EF版本中,结果结构的一些知识被用于(可能)比NF版本更快。为了模拟性能随时间的降低,所有三个模式中的数据库逐步填充,数据直到3月,6月,9月,12月,并且测量查询执行时间。在每个查询之间,我使用See and clear Postgres caches/buffers?中描述的步骤清除缓存。
我担心使用R postgresSQL-API来执行查询,因为我担心我会或多或少地测量R将结果放入df需要多长时间。所以我使用R为每个案例生成并执行一个bash脚本。在这个bash脚本中,我使用grep来获取执行查询所需的postgreSQL时间。如图所示https://dba.stackexchange.com/questions/21509/pipe-psql-timing-to-file。结果如下图所示。
除了我发现标准化结果实际上比非正规化版本快一点(如果你有想法为什么这可能让我知道)让我感到困惑这个图片非常清楚。
然而,在R timing命令中包含bash脚本的执行,我得到以下结果:
以下是具有对数比例的相同图片:
我想知道为什么时间差异如此之大。但是,我愿意把postgreSQL时代作为真正的时代。但后来我使用atop来跟踪这个过程中的内存使用情况,结果与R的时间方法更好地匹配。下图显示了免费的mem页面和颜色显示了在此期间测试的db。
你有什么想法为什么这两种方法不同,你会把它当作“真正的”执行时间。非常感谢任何帮助。