sql server2k 查询的速度问题。

standlove 2003-11-14 09:39:01

在bcb 中处理大小为 700KB 的汉字文件,
文件分许多章节,需要对所有的章节做统计,
并且对整个文件做一个总的计数~。

处理的时间为: 1个小时 T.T
用单纯的c++来实现2 s 就够了, ft 不应该差这么多吧。
是不是哪里实现有问题?
多谢。


void prepareQuery(TADOQuery *query, string &cmd) {
query->Close();
query->SQL->Clear();
query->SQL->Add(cmd.c_str());
}

map<short, int> dict; // 每章的字放在 dict 做统计
while (getWord(fin, word)) {
if (word == '*') { // ‘*’ 表示每章的结束
fin.putback('*');
break;
}

// erase single-byte character
if (!((word >> 8) & 0xff)) {
continue;
}
dict[word]++;
}
typedef map<short, int>::iterator itmap;
for (itmap p = dict.begin(); p != dict.end(); ++p) {
word = p->first;
int cnt = p->second;

cmd = "select id from newp3a where word='"
+ bin2str(word) + "'"; // 这个汉字是否要做统计
prepareQuery(txtQuery, cmd);
txtQuery->Open();
if (!txtQuery->Eof) {
string strid = txtQuery->FieldByName("id")->AsString.c_str();
cmd = "insert into " + fword + "(id,fw) values('"
+ strid + "','" + int2str(cnt) + "')";
prepareQuery(txtQuery, cmd);
txtQuery->ExecSQL(); // 插入到章节统计表


// 插入总的表中
cmd = "select id from " + sfword + " where id='"
+ strid + "'";
prepareQuery(txtQuery, cmd);
txtQuery->Open();
if (!txtQuery->Eof) {
cmd = "update " + sfword + " set fw=fw+1 where id='"
+ strid + "'";
prepareQuery(txtQuery, cmd);
txtQuery->ExecSQL();
} else {
cmd = "insert into " + sfword + "(id,fw) values('"
+ strid + "',1)";
prepareQuery(txtQuery, cmd);
txtQuery->ExecSQL();
}
}
}
...全文
28 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljianq 2003-11-18
  • 打赏
  • 举报
回复
居然楼主使用单纯的c++来实现2 s 就够了,为什么不仿照呢?

把要统计的字先读取到内存中(当然也可以考虑部分常用词),

完全统计好后,一次性将结果写入,这样速度肯定会快。
chifengwatch 2003-11-17
  • 打赏
  • 举报
回复
存储过程可以快多少~, 为什么会快?
//看看SQL Server自己说的

存储过程对应用程序性能的影响
所有设计优良的 Microsoft® SQL Server™ 2000 应用程序都应当使用存储过程。不论是否将应用程序的业务逻辑写入存储过程都应如此。甚至连没有业务逻辑组件的标准 Transact-SQL 语句,在用参数打包成存储过程后也能获得性能收益。编译进存储过程的 Transact-SQL 语句在执行时可省去大量的处理。有关更多信息,请参见存储过程。

存储过程的另一个优点是客户端执行请求使用网络的效率比将等效的 Transact-SQL 语句发送到服务器高。例如,假设应用程序需要将一个大的二进制值插入 image 数据列。为使用 INSERT 语句发送数据,该应用程序必须将该二进制值转换为字符串(其大小翻倍),然后发送到服务器。服务器再将该值转换回二进制格式以存储在 image 列中。相反,应用程序可以创建下列格式的存储过程:

CREATE PROCEDURE P(@p1 image) AS INSERT T VALUES (@p1)

当客户端应用程序请求执行过程 P 时,image 参数值将一直以二进制格式发送到服务器,从而节省处理时间并减少网络流量。

如果 SQL Server 存储过程中包含业务服务逻辑,因为业务服务逻辑将处理移动到数据,而不是将数据移动到处理,因而存储过程能提供更大的性能收益。

standlove 2003-11-17
  • 打赏
  • 举报
回复

如果让 各位来做统计的话,
每个字出现的频率~~
难道还有什么高效的做法~

to matq2008:
存储过程可以快多少~, 为什么会快?
thx very much
ljianq 2003-11-15
  • 打赏
  • 举报
回复
数据库操作这么频繁,时间长一点是难免的;

可能你应该另外考虑个解决方法。
叶子哟 2003-11-14
  • 打赏
  • 举报
回复
建议用存储过程来做吧

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧