二进制查询比文本查询慢+用Postgresql转换?

时间:2012-12-11 00:28:47

标签: postgresql binary libpq

搜索这个的高低,并没有设法找到明确的答案。我刚开始构建一个应用程序,我们决定将Postgresql用于我们的数据库,将C用于服务器。然而,一些初步测试显示出一些令人困惑的数字。看起来好像通过文本字符串访问数据库是最快的方法,这对我来说似乎很直观。当然数据库在内部存储整数和浮点数作为二进制文件并且必须将它们转换为将它们呈现为文本,然后我必须将其转换回二进制才能使用。似乎更快的方法是将所有内容保留为二进制,但到目前为止,我似乎无法获得二进制访问以显示此优势。

这是一个简单的测试用例,我用它来展示我所看到的内容(架构+代码)

http://pastebin.com/1AhB8avx

我看到的时间是这样的:

开始迭代0 ... 迭代0:在35秒内通过PQparamExec获取50000个二进制记录 迭代0:在34秒内通过PQexecf获取50000个二进制记录 迭代0:在25秒内通过PQexec获取50000条文本记录

其他迭代只是或多或少地重复该模式。我也尝试使用libpq直接使用类似的结果,但没有将它们移植到这个测试用例中。

这是否符合您的经验,或者我只是在某处愚蠢?

谢谢!

1 个答案:

答案 0 :(得分:1)

似乎没有理由这样做,事实上在我的ubuntu桌面上运行你的代码时,我没有那么大的差异:

Starting iteration 0...
Iteration    0: fetched 50000 binary records via PQparamExec in 13 seconds
Iteration    0: fetched 50000 binary records via PQexecf in 13 seconds
Iteration    0: fetched 50000 text records via PQexec in 12 seconds

Starting iteration 1...
Iteration    1: fetched 50000 binary records via PQparamExec in 13 seconds
Iteration    1: fetched 50000 binary records via PQexecf in 14 seconds
Iteration    1: fetched 50000 text records via PQexec in 12 seconds

Starting iteration 2...
Iteration    2: fetched 50000 binary records via PQparamExec in 12 seconds
Iteration    2: fetched 50000 binary records via PQexecf in 13 seconds
Iteration    2: fetched 50000 text records via PQexec in 11 seconds

Starting iteration 3...
Iteration    3: fetched 50000 binary records via PQparamExec in 12 seconds
Iteration    3: fetched 50000 binary records via PQexecf in 12 seconds
Iteration    3: fetched 50000 text records via PQexec in 12 seconds

Starting iteration 4...
Iteration    4: fetched 50000 binary records via PQparamExec in 13 seconds
Iteration    4: fetched 50000 binary records via PQexecf in 12 seconds
Iteration    4: fetched 50000 text records via PQexec in 12 seconds

请注意,由于代码调用time()两次以测量经过的时间,因此其准确度为2秒,在此上下文中有点高。您应该在gettimeofday()上考虑clock_gettime(),甚至更好CLOCK_PROCESS_CPUTIME_ID