如何在Qt中更快地读取数据?

5

Qt读取数据库比C#慢吗?我觉得我漏掉了什么!为了比较读取速度,我在Qt中编写了以下内容:

QElapsedTimer t;
t.start();
int count = 0;
QString cs = "Driver={SQL Server}; Server=EMON;Database=FAODB;User=Test;Password=Test";
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC",cs);
db.setDatabaseName(cs);
db.open();
QSqlQuery query(db);
query.setForwardOnly(true);
query.exec("SELECT * FROM FAOCropsLivestock");
while(query.next()){
    if(query.value("Country").toString() == "\"Bangladesh\"")
        count++;
}
db.close();
qDebug()<< QString::number(count) + " elapsed ms " + QString::number(t.elapsed());

以及在C#中

Stopwatch s = new Stopwatch();
s.Start();
int count = 0;
string cs = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
string query = "SELECT * FROM FAOCropsLivestock";
using(SqlConnection con = new SqlConnection(cs)){
      using(SqlCommand cmd = new SqlCommand(query, con)){
            con.Open();
            SqlDataReader rd = cmd.ExecuteReader();
            while (rd.Read()){
                  if(rd["Country"].ToString() == "\"Bangladesh\"")
                        count++;                       
            }
      }
}
s.Stop();
Console.WriteLine(count + " elapsed ms " + s.ElapsedMilliseconds);

无论是C#还是Qt都支持x86架构,并且在发布模式下运行。

在Qt的情况下,结果为"63653 elapsed ms 68213",而在C#中为"63653 elapsed ms 14210"。


对于Qt版本,我已经进行了替换。

QString cs = "Driver={SQL Server}; Server=EMON;Database=FAODB;User=Test;Password=Test";
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC",cs);
db.setDatabaseName(cs);

by

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC" /*QODBC3*/);
db.setDatabaseName("Driver={SQL Server Native Client 11.0};"\
                   "Server=EMON;Database=FAODB;Uid=Test;Pwd=Test;");

结果在58秒至71秒之间。


3
我会先计时更多的事情以缩小范围。也许 qt 的 "Open" 调用由于某种原因需要 54 秒... 尝试分别计时 while 循环,以验证执行查询本身是占用 68 秒大部分时间的原因。 - Quantic
在这种情况下,Qt的最佳表现是54秒,而C#则为13秒 - user6283344
你在两种模式下都运行了吗? - Thomas Ayoub
正如提到的一样,是的 @ThomasAyoub - user6283344
1个回答

0
对于您的C#版本,您没有显示连接字符串。您是否同时使用相同的驱动程序?我不是这方面的专家,但我的同事是,他说“SQL Server”驱动程序非常古老且缓慢。您可能想尝试“SQL Native Client”或类似的东西。无论如何,请确保测试使用相同的SQL驱动程序。

这与编写string cs = "Server=EMON;Database=FAODB;user=Test;password=Test";相同。我不确定C#正在使用哪个驱动程序。我只需要添加using System.Data.SqlClient;来访问MS SQL Server。 - user6283344
1
我不确定.NET在System.Data.SqlClient中使用哪个驱动程序,但我怀疑这就是区别所在。尝试使用当前的驱动程序更新你的C++代码并重新测试。 - goug
我已经尝试过使用QODBC3SQL Server Native Client 11.0,但结果没有改变。我已经在我的帖子@goug中添加了代码。 - user6283344
你有没有找到解决办法? - Luke101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接