求助~~~怎样优化查询语句啊...数据一多就慢...桑心...

fqc0924 2012-05-15 02:16:37
数据库中两张表,其中一张是tbChar,记录着所有的字符,另一张是tbLearn记录着所有字符对应的特征值(每个字符可能有梅朵个特征值,所以我分两个表来记录),表的设计是这样的。我查询的语句大致意思是这样的,先从tbChar中查找出各个字符,将他们存放在一个List里面,然后再根据这个List中的字符,一个个在tbLearn中找过来~~必须这样找,因为我希望可以归类,同一个字符在tbLearn中的特征值可能有很多个,我要进行同类比较的。。。不知道大家懂了没....没懂的话,直接回复,我继续讲解....多谢各位了...贴上图和代码




//搜索tbChar中已经存储的字符
DbOper.DbCmd.CommandText = "select AutoId,LearnCharacter from tbChar order by LearnCharacter";
OleDbDataReader ddrChar = DbOper.DbCmd.ExecuteReader();

while (ddrChar.Read())
{
if (!ddrChar.IsDBNull(1))
LearnCharacter.Add(ddrChar.GetString(1));
}
ddrChar.Close();


//每个字符依次识别
for (int i = 0; i < LearnCharacter.Count; i++)
{
//按照频率从高到低的顺序查找出已存储字符的所有信息
DbOper.DbCmd.CommandText = string.Format("select AutoId,LearnCharacter,Eigenvalue,Frequency from tbLearn where LearnCharacter = '{0}' order by Frequency", LearnCharacter[i].Replace("'", "''"));
OleDbDataReader ddrLearn = DbOper.DbCmd.ExecuteReader();

Suited suited = new Suited(LearnCharacter[i], 0.0);
Template template = new Template();
int Itemplate = 0;
int chosenTemplateNum = 0; //被选中的tempalte编号(即该字符与需要识别的字符间特征向量距离最小的template)

while (ddrLearn.Read())
{
//判断数据库表中的各列,即特征值列是否为null
if (!ddrLearn.IsDBNull(0) && !ddrLearn.IsDBNull(1) && !ddrLearn.IsDBNull(2) && !ddrLearn.IsDBNull(3))
{
template = new Template(GetEigenvalueList(ddrLearn.GetString(2)), ddrLearn.GetFloat(3), ddrLearn.GetInt32(0));
suited.template[Itemplate] = template;
Itemplate++;
}
//随着查找比对的进行,
if (progressRecognition.Value < progressRecognition.Maximum)
progressRecognition.Value += 1;
}
ddrLearn.Close();
...全文
171 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
余山水 2012-05-18
  • 打赏
  • 举报
回复
LearnCharacter字段建立索引了吗,需要建立索引
test2050 2012-05-18
  • 打赏
  • 举报
回复
你这不就是A表中字段1
a,
b,
c
三行数据
B表中字段1,字段2
a,t1
a,t2
b,t3
c,t4

select B.* from A,B where A.字段1=B.字段1 order by B.字段1
Hatake 2012-05-18
  • 打赏
  • 举报
回复
我看都是数据库操作的,能否用SQL直接得出结果?

这又是数据库查询,又是LIST遍历的操作的,看着麻烦啊!
fqc0924 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

sql写成视图..
[/Quote]

试试看,可能会有帮助哈,多谢啊
加旋仔 2012-05-15
  • 打赏
  • 举报
回复
sql写成视图..
fqc0924 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

联合查询,不用中间list,直接遍历联合查询的数据
[/Quote]

那样,我怎么知道现在取的是哪个字符的特征值,因为我需要把同字符的特征值,以数组的形式存到一个类中。。。我不知道联合查询后,怎么判断现在去的字符和上一个是同一个字符,以便我能够存到同一个或者不同的类的对象中?
fqc0924 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

联合查询 你这样会执行很多次数据库操作
首先select AutoId,LearnCharacter from tbChar order by LearnCharacter 执行一次
查出数据N条
之后执行了N次select AutoId,LearnCharacter,Eigenvalue,Frequency from tbLearn where LearnCharacter = '{……
[/Quote]

那样,我怎么知道现在取的是哪个字符的特征值,因为我需要把同字符的特征值,以数组的形式存到一个类中。。。我不知道联合查询后,怎么判断现在去的字符和上一个是同一个字符,以便我能够存到同一个或者不同的类的对象中?
China_yuanli 2012-05-15
  • 打赏
  • 举报
回复
联合查询 你这样会执行很多次数据库操作
首先select AutoId,LearnCharacter from tbChar order by LearnCharacter 执行一次
查出数据N条
之后执行了N次select AutoId,LearnCharacter,Eigenvalue,Frequency from tbLearn where LearnCharacter = '{0}' order by Frequency"
  • 打赏
  • 举报
回复
联合查询,不用中间list,直接遍历联合查询的数据

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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