加速使用大型数据集的postgresql查询

时间:2016-02-23 20:33:10

标签: c++ postgresql qt

我有一个postgresql数据库,其中包含我目前感兴趣的2个表。第一个表是我的“文件”表,其中包含文件名,有关该文件的一些相关信息,并且序列号为主键。这是我的文件表的大致轮廓:

fileData(fileName varchar(120) unique, ... other info, id serial primary key)

然后我有另一个表,其中包含文件表中列出的文件的信息。它通过文件表的id链接到文件表。 “data”表中对应于每个文件的行数可变,行号从几百到几十万不等。以下是我的数据表的大致轮廓:

rawData(fileID integer references fileData(id), lineNum integer, data1 double, ... other info)

要使用上述内容,我有一个查询,我首先对fileData进行排序以获取每个文件的ID,以及其他一些信息。然后,我希望对与该文件相对应的原始数据进行排序,以找到“有趣”的信息。这个特定的查询用ct编写,使用Qt来处理实际的处理,但是大部分工作都是由数据库完成的(Qt只是将数据库查询作为文本查询传递,并且该查询需要匹配所有的格式sql数据库通常需要)。以下是我的查询示例:

QSqlQuery fileQuery, dataQuery;
int id;
fileQuery.prepare("SELECT id, fileType FROM fileData ORDER BY id");
if (!fileQuery.exec()){
    //error
    return;
}
while (fileQuery.next()){
    id = fileQuery.value(0).toInt();
    dataQuery.prepare("Select lineNum, data1, ...other info "
                      "FROM rawData WHERE fileID = ? and data1 < ? "
                      "ORDER BY fileID, lineNum");
    dataQuery.addBindValue(id);
    dataQuery.addBindValue(num);
    if (!dataQuery.exec()){
        return;
    }
    while (dataQuery.next()){
      //code to load pertinant info into my program to handle later
    }
}

这个程序大约需要2个小时才能运行到最近,加载了1400个文件,大约有一百万行数据。但是,我只获得了更多的数据,现在最多有1650个数据文件,拥有1.3亿行数据,而且我的程序已经慢慢爬行了。过去需要花费两个小时的时间现在已超过6个,只能通过我现有的1/4文件,而我的调试输出告诉我,我仍在处理以前运行过这个程序的文件,而不是还有任何新数据。检查我的任务管理器,我可以看到我的程序几乎没有工作,而postgresql正在使用整个核心来给我我要求的数据,所以我知道当前的保持是在我的sql命令中,而不是我的内容在此期间处理数据。

最后,目前,在问题上投入更多硬件并不是我能做的事情。话虽如此,有什么我可以做的来优化我的查询,以提高我访问这些数据的速度?或者我是否已经正确地做了事情,并且由于我正在使用的数据集的大小而不得不把它搞砸并处理缓慢的问题?

2 个答案:

答案 0 :(得分:1)

您可能只能执行一次查询。

1)文件表太小了,您可以将其加载到内存映射中并使用它完成

2)数据表上的查询,按fileType过滤并按文件ID排序,不应该花费很长时间(当然你有一个关于fileID + lineNum的索引,对吗?)

答案 1 :(得分:0)

有没有理由不将这两个查询合并为一个?

SELECT id, fileType, lineNum, data1, ...other info 
FROM fileData LEFT JOIN rawData on fileData.id = rawData.fileID
WHERE data1 < ? 
ORDER BY fileID, lineNum

此外,因为你说num是函数中的常量,而不是将它绑定到可替换参数,我只是用它的值构造查询字符串。确保两个表上都有正确的索引也是必不可少的。