- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在从事一个涉及大量 sql 查询的 Qt(C++) 项目。基本上它是一个被调用 ~1000 次的函数 update()
。在我的系统中,每次调用大约需要 25 - 30 毫秒,导致总执行时间长达 30 秒。我相信这个例程可以优化,从而减少时间消耗,但不知道如何优化。这是函数-
void mediaProp::update(){
static QSqlQuery q1, q2, q3;
static bool firstCall = true;
static QString stable;
QString table = this->type+"s";
if(firstCall){
stable = table;
q1.prepare("SELECT id FROM titles WHERE lower(title)= lower(:a) AND type = :b COLLATE NOCASE");
q2.prepare("INSERT INTO " + table + "(pic_id, score) VALUES (0, 0)");
q3.prepare("INSERT INTO titles (id, type, title) VALUES (:a, :b, :c)");
firstCall = false;
}
else if(stable != table){
stable = table;
q2.prepare("INSERT INTO " + table + "(pic_id, score) VALUES (0, 0)");
}
q1.bindValue(":a", this->title);
q1.bindValue(":b", dbEnums(this->type));
q1.exec();
q1.last();
int size = q1.at() + 1;
if( size > 0){
q1.first();
this->id = q1.value("id").toInt();
}
else if( !this->title.trimmed().isEmpty() ){
q2.exec();
this->id = q2.lastInsertId().toUInt();
q3.bindValue(":a", this->id);
q3.bindValue(":b", dbEnums(this->type));
q3.bindValue(":c", this->title);
q3.exec();
}
else{
this->id = 0;
}
任何建议或帮助都会非常棒!谢谢:)
编辑-根据 Yohan Danvin 的建议,我对函数进行了更改并在上面进行了更新。
编辑2-Yohan Danvin 的概念很聪明,我也相信使用准备好的语句作为静态变量可以优化例程。但它并没有像我们预期的那样工作。整个例程没有花费更少的时间,而是花费了更多的时间。奇怪的是,准备好的陈述让事情变得更糟!但是经过大量挖掘,我发现了为什么会这样-
THE PROCEDURE TOOK 25 MILLISECONDS IN AVERAGE
AFTER USING Yohan's STATIC PREPARED STATEMENT MAPPING PROCEDURE- IT TOOK 27ms IN AVG
郑重声明,我使用文件作为我的数据库而不是内存。每次执行 INSERT 查询时,QSqlQuery 都会创建一个临时转储文件并将其附加到主数据库文件中。与内存相比,访问文件非常耗时,导致 25 毫秒/插入速率缓慢。我想当我使用 Yohan 的概念时,由于函数开销等原因花费了更多时间。如果我错了请告诉我!最后我遇到了http://www.sqlite.org/pragma.html并更改了一些编译指示参数-
QSqlQuery("PRAGMA journal_mode = OFF");
QSqlQuery("PRAGMA synchronous = OFF");
这非常有效!执行速度从每次例程调用 25 毫秒下降到每 3 次例程调用 1 毫秒。这是一个巨大的差距!基本上设置 pragma journal_mode = OFF
告诉 SQLITE 不要创建单独的临时转储文件,并且 PRAGMA synchronous = OFF
在执行所有查询后将更改应用于数据库。可能是,通过使用临时内存数据库。如果我提出的观点有误,请告诉我。
我很高兴例程现在快 145 倍!
最佳答案
您只想准备
每个查询/语句一次,而不是更多。否则DBMS每次都要重新计算执行计划,非常耗时。
也许您应该实现一种方法来确保对应用程序中的所有查询/语句都完成此操作,如下所示:
QSqlQuery& prepareQuery(const QString& query)
{
static QMap<QString, QSqlQuery> queries;
if (!queries.contains(query))
{
// not found, insert the query in the map and "prepare" it
queries[query].prepare(query);
}
return queries[query];
}
有了这个,现在你的例子中的选择看起来像这样:
QSqlQuery& q = prepareQuery("SELECT id FROM titles WHERE lower(title)= lower(:a) AND type = :b COLLATE NOCASE");
q.bindVariable...
对 2 个插入也执行此操作(即使是具有可变表名的插入,也会为每个不同的表名自动创建和准备一个 SqlQuery)。
[注意:请注意,如果在多线程环境中工作,您必须确保同一个 QSqlQuery 对象不会同时被 2 个不同的线程使用]
关于c++ - 如何优化涉及大量sql查询的Qt代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17479426/
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个在 ab 时间内运行的算法,其中 a 和 b 都是单独的输入。 我的算法还是多项式时间复杂度算法还是nn?我认为 nn 不是多项式,但我仍然不确定。 我看到 n 算法的阶乘仍然评估为 nn 复
这个问题在这里已经有了答案: Logical operators (AND, OR) with NA, TRUE and FALSE (2 个回答) 1年前关闭。 由于“is.na(NA)”返回真,“
假设我有一个具有以下结构的 Pandas 数据框: df = pd.DataFrame(dict(a=["x", "x", "y"], b=[0, 1, 1], c=[1, 2, 2])) 我想按 a
谁能帮我处理一些相当复杂的 Django 查询? 这些是我的模型: class County(models.Model): name = models.CharField(max_length
我想从某个表中选择一行并根据另一个表对结果进行排序。 这是我的表: lang1_words: word_id - word statuses: word_id - status 在每个表中 word_
我是单元测试的新手,所以请对我宽容一些。我有一些查询 RESTful API 的模块。我发现在每个测试套件中,我都使用几行代码来启动一个简单的 ExpressJS Web 服务器,以模拟一些我可以从测
假设我有以下代码: var blinker = function(element){ if(stopped){ return; } else { var sampleMappi
我正在用 JavaScript 制作一个选择你自己的冒险风格的游戏,在本节中: evade = prompt("Go out of your way to avoid them, just in ca
我的代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Events1 extends
我正在使用 scipy ode 来解决钟摆问题。 from scipy import * import matplotlib.pyplot as plt from scipy.integrate im
我有一个 Google 表格,用于收集客户的注册数据。收集的数据包括学生的姓名、学生选择参加的类(class)以及信用卡号。提交后,我会收到通知。收到通知后,我会转到我的 Google 表格并从信用卡
我需要定义一个操作的两个版本,定义略有不同。它是一系列包含Nat指数的成分。 open import Data.Nat data Hom : ℕ → ℕ → Set where id : (
我正在研究游戏引擎 http://ducttape-dev.org使用 boost 作为依赖项之一。有一天,当我正在编写一个链接到我的游戏引擎的测试应用程序时,OgreProcedural 的 Ext
我正在 Android 中制作一个表达式计算器,所以我想在实际计算答案之前检查字符串是否符合有效表达式的条件。 我在 Java 中试过这个正则表达式: ^\s*([-+]?)(\d+)(?:\s*([
我有以下 postgresql 查询(为便于阅读而简化): select * from a_view where a in (select * from a_function(a_input))
我开始更好地掌握 PostgreSQL 索引,但我遇到了 OR 条件的问题,我不知道如何优化我的索引以加快查询速度。 我有 6 个条件,当单独运行时,它们的成本似乎很小。下面是修剪查询的示例,包括查询
有谁知道为什么下面的代码接受诸如123-123-1234这样的答案: [1-9]\\d{2}-[1-9]\\d{2}-\\d{4} 我想到了代码,它只接受先接受 2 个数字,再接受 2 个数字,然后再
在使用 Java 1.8u40 打开带有提示类型和附加的 StringConverter 的组合框时,我遇到了以下错误。这可以追溯到执行 FXML 的团队留下的示例字符串,与 Controller 中
在 MySQL 中,我有三个不同的数据库 - 我们将它们称为 A、B 和 C。 是否可以执行涉及所有三个数据库(A、B、C)中的表的事务? (所有数据库都在同一服务器上) 最佳答案 是的,你可以。这是
我是一名优秀的程序员,十分优秀!