希望这个问题不是太开放......简而言之:我正在寻找一种快速但易于访问数据库的脚本或编程语言(PostgreSQL
)。
我希望将PostgreSQL
数据库中某些表的查询结果用作某些R
分析的输入。查询是简单的SELECT
请求(请求中可能存在改进的空间,但是现在我不是这样看的 - 我已经做过一段时间了),但是在第一次查询结果的循环中。表包括数字和字符串,如果不是数十万行,则数千个,因此查询总数可能非常大。
显然,我首先使用R
编写了RPostgreSQL
脚本。但是,使用起来需要花费太多时间(我希望能够随时修改并重新运行)。我已经非常有效地优化了这个脚本,''system.time''告诉我,大部分时间花在循环中的数据库查询上。
然后,正如我所知,如果我使用文本文件作为R
的输入会更快,我决定将此R
脚本翻译为python
,使用{{ 1}}。不幸的是,psycopg2
脚本并不比python
脚本快得多。
最后我开始使用R
编写C++
程序,但我停下来,因为我发现它不够灵活(我的意思是,我必须乘以我的代码行数)通过至少3或4来处理查询。)
因此,我想知道哪种语言(或者可能是其他libpq-fe
或R
库?)会在速度和灵活性之间提供最佳折衷(就查询结果而言:列表,数组,字符串操作) ...)用于数据库访问(即python
)。也就是说,它需要比PostgreSQL
+ R
和RPostgreSQL
+ python
快得多,而且几乎就像“灵活”一样。
感谢您的建议(该语言必须是Linux友好的)。
更新:以下是在使用Ryan建议的psycopg2
问题的代码进行更正之后,仅使用前500个检索到的元素的旧代码与新代码的典型时间,并且:
N+1
1000个第一个检索到的元素相同:
> system.time(source("oldcode.R"));
user system elapsed
3.825 0.052 49.363
> system.time(source("newcode.R"));
user system elapsed
1.920 0.140 3.551
可能确实值得改变。 ; - )
答案 0 :(得分:2)
使数据库的任何接口快速进行;优化数据库查询。正如您使用R
发现的优化代码所发现的那样,大部分时间都花在数据库上。所以你应该选择你最熟悉和最熟悉的编程语言;因为就前端而言,这是最快的。
然而,无论您使用何种编程语言,总体结果(就感知性能而言)都是相同的。没有库可以提高查询速度,因为这纯粹是数据库的一个功能。允许您执行的所有库/语言都是将多个查询组合到一个事务中,但查询的结果仍然取决于您的数据库布局和优化。
诸如列上缺少索引之类的简单事情会产生很大的影响。
首先在查询上运行EXPLAIN ANALYZE
,然后将结果粘贴到this tool,以查看数据库正在执行的操作,以便了解从何处开始优化。