首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

SQL_SERVER查询速度,该怎么处理

2012-03-30 
SQL_SERVER查询速度在SQL_SERVER里有两个表,第一个表里有70万条数据,第二个表里有10万条数据,这两个表分别

SQL_SERVER查询速度
在SQL_SERVER里有两个表,第一个表里有70万条数据,第二个表里有10万条数据,这两个表分别用两个ADOTABLE连接,用了两个循环,对查询到的数据进行比对,速度很慢,就是不比对,仅仅完成这个循环就要很长时间,请问有没有快点的方法?代码如下:

var
  I,K,L,Count_No:Integer;
  Mt_No,Base_No:String;
begin
  ADOTable_MT.First;
  ProgressBar.Max:=ADOTable_MT.RecordCount-1;
  for I := 0 to ADOTable_MT.RecordCount-1 do
  begin
  ProgressBar.Position:=ProgressBar.Position+1;
  Application.ProcessMessages;
  Mt_No:=ADOTable_MT.FieldByName('MT_No').AsString;
  //=========================================================================
  ADOTable.First;
  ProgressBar1.Max:=ADOTable.RecordCount-1;
  for K := 0 to ADOTable.RecordCount-1 do
  //for K := 0 to 100 do
  begin
  ProgressBar1.Position:=ProgressBar1.Position+1;
  Base_No:=ADOTable.FieldByName('28recd').AsString;

  //#######################################################################
  {比对的过程}
  //#######################################################################
  ADOTable.Next;
  end;
  //=========================================================================
  ADOTable_MT.Next;
  end;

end;


[解决办法]
查询的速度,
也要根据网络速度和电脑配置来决定的
[解决办法]
楼主,一个表里有70万条数据,第二个表里有10万。
循环对比,这不就是一个笛卡尔积么? 70W*10W,不慢才怪啊。
即使索引做的再好,你依然要遍历两个表N次。

从业务逻辑优化吧,楼主说说业务逻辑。
基本思路就是减少表中的遍历,减小循环。
[解决办法]
使用sql函数实现 两个字符串的相似度 比较函数
直接在sql里比较
但是这样也要比较70万x10万次!

所以,最好能发明一个新的 字符串取特征函数,返回一个整型
先对70万、10万条记录生成对应的特征值,建立索引
再比较就飞快了

[解决办法]
ProgressBar.Position:=ProgressBar.Position+1;
Application.ProcessMessages;
可以优化为每100行才执行一次

越循环越慢,是不是因为70万行全部加载到客户端的内存里,就慢了?
机器多少内存,程序最多会占多少内存?

[解决办法]
10万级循环,多一行代码,效率就降低很多,如果无法在SQL内部完成(存储过程或者扩展存储过程),那么就研究这段代码的本身的效率,可以照楼上说的,改成100次执行一次

大体上讲,可以将10万的小库直接缓存到内存中,然后关闭,基本上可以大大提高效率了,

ADOTable 换成只有一个字段的AdoQuery,
然后
Mt_No:=ADOTable_MT.FieldByName('MT_No').AsString;
就可以换成
ADOQuery_MT.Fields[0].AsString;
这样效率上肯定会提高的,至于能否流畅,没底,呵呵.

如果你够大胆,可以考虑2线程,一个从数据库组件读字符串到内存池,另一个线程负责比较,不过在控制同步时就非常非常讲究了,否则达不到效果.
[解决办法]

探讨
大体上讲,可以将10万的小库直接缓存到内存中,然后关闭,基本上可以大大提高效率了,

[解决办法]
呵呵,不慢才怪呢,必须写成存储过程,另外,你要做物化视图,这样可以提前就做对比,而不是你相对比的时候才进行对比分析
[解决办法]
探讨
引用:
大体上讲,可以将10万的小库直接缓存到内存中,然后关闭,基本上可以大大提高效率了,

注意这个关键

[解决办法]
不用table,用query能好些。
[解决办法]
小的那个表载入内存并hash,保证飞快。
[解决办法]
70万循环什么都不做本来就慢
[解决办法]
sql server里自定义一个比较函数,用select 内联查询
[解决办法]
你的做法循环确实多!能不能这样做:


1、首选将10万条数据,也就是数据最少的那个表中的数据都查询出来,做为循环!
2、循环10万条数据,每条数据到数据库中查询一次(就是比较相近的字符串),或者是执行一个SQL的函数或存储过程来实现这个比对算法。
3、将70万数据库要比对的字符串做索引,查询用这个字符串应该会快一些!

这样只循环10万次就可以,但是消耗效率的地方应该在比对这里了。

这样我觉得应该比你双层循环快一些,因为第二个不是循环,只是做一个查询。

当然这只是一个想法,具体还要看你是如何比对字符串的!

[解决办法]

探讨
你的做法循环确实多!能不能这样做:
1、首选将10万条数据,也就是数据最少的那个表中的数据都查询出来,做为循环!
2、,循环10万条数据每条数据到数据库中查询一次(就是比较相近的字符串),或者是执行一个SQL的函数或存储过程来实现这个比对算法。
3、将70万数据库要比对的字符串做索引,查询用这个字符串应该会快一些!

这样只循环10万次就可以,但是消耗效率的地方应该在比对这里了。

……

热点排行