全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1291
推到 Plurk!
推到 Facebook!

关于数据库的执行效率

答題得分者是:Stallion
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-11 20:31:21 IP:222.184.xxx.xxx 訂閱
for i := 0 to 15 do
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select round(sum(单项累计),2)as 金额 from 表A where 票据号 >= ''' kspjh '''and 票据号<=''' jspjh '''');
ADOQuery1.SQL.Add(' and 项目类型 =:项目类型');
ADOQuery1.Parameters.ParamByName('项目类型').Value := Tot_Name[i] ;
ADOQuery1.Open;
end;

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select 其它内容 from 表A where 票据号 >= ''' kspjh '''and 票据号<=''' jspjh '''');
ADOQuery1.Open;
上面取了两个例子,实际中可能要有五六次这样的查询,后面的票据号条件肯定是一样的,其它的条件和查询内容有一定的区别,我在想,这个数据是不断增长的,有可能会达到数十万条,如果这样查询下来会不会很慢,要不要先把满足票据号条件的记录先写到一个临时表里,然后其它的附加不同条件的查询从这个临时表里再查询?这样会不会快一点。但我以前在哪个地方看到一个资料,好象有这个说法,在进行数据库查询时,电脑本身已经会把第一次查询的资料提到内存中,再执行类似条件的查询就已经会加快了,所以用不用临时表都一样了?
------
我的编程起步于ktop,我将永远支持ktop
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-12 12:25:23 IP:61.67.xxx.xxx 未訂閱
我有看沒有懂你的程式, 但我發現你的sql語法並沒有做任何改變, 你用這樣的寫法不斷讓資料庫重置sql語法, 筆數一多一定使效能大幅滑落, 把 sql 提到外部來, 這樣會比較好
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select round(sum(单项累计),2)as 金额 from 表A where 票据号 >= :kspjh and 票据号<= :spjh and 项目类型 =:项目类型');
for i := 0 to 15 do
begin
ADOQuery1.Close;
ADOQuery1.Parameters.ParamByName('kspjh').Value := ...
ADOQuery1.Parameters.ParamByName('spjh').Value := ...
ADOQuery1.Parameters.ParamByName('项目类型').Value := Tot_Name[i] ;
ADOQuery1.Open;
end;


===================引 用 ntjrr 文 章===================
for i := 0 to 15 do
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select round(sum(单项累计),2)as 金额 from 表A where 票据号 >= ''' kspjh '''and 票据号<=''' jspjh '''');
ADOQuery1.SQL.Add(' and 项目类型 =:项目类型');
ADOQuery1.Parameters.ParamByName('项目类型').Value := Tot_Name[i] ;
ADOQuery1.Open;
end;

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select 其它内容 from 表A where 票据号 >= ''' kspjh '''and 票据号<=''' jspjh '''');
ADOQuery1.Open;
上面取了两个例子,实际中可能要有五六次这样的查询,后面的票据号条件肯定是一样的,其它的条件和查询内容有一定的区别,我在想,这个数据是不断增长的,有可能会达到数十万条,如果这样查询下来会不会很慢,要不要先把满足票据号条件的记录先写到一个临时表里,然后其它的附加不同条件的查询从这个临时表里再查询?这样会不会快一点。但我以前在哪个地方看到一个资料,好象有这个说法,在进行数据库查询时,电脑本身已经会把第一次查询的资料提到内存中,再执行类似条件的查询就已经会加快了,所以用不用临时表都一样了?
編輯記錄
P.D. 重新編輯於 2007-09-12 12:26:19, 註解 無‧
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-12 17:14:34 IP:222.184.xxx.xxx 訂閱
我再细述一下,循环是其中的一种,不是所有,我说的意思如下:
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段一 from 表A where 条件一');
adoquery1.open;
将结果记录下来备用;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select sum(字段一) from 表A where 条件一');
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段二 from 表A where 条件一');
adiqyert1.sql.add( 'and 条件二');
adoquery1.open;

adoquery1.sql.clear;
adoquery1.sql.add('select 字段二 from 表A where 条件一');
adiqyert1.sql.add( 'and 条件二 条件三');
adoquery1.open;
........


我说的意思就是象上面的这样,反复地在执行查询,其中有一个条件一是共有的,是每个查询都用到的,我的想法是在数据量大的时候是否需要将条件一的记录从几十万条里先选出来,这样通常只有几条数据了,然后其它的条件查询从这几条里再查,而不要再次从几十万条里查询,不知道这想法对不对?
------
我的编程起步于ktop,我将永远支持ktop
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-13 11:12:20 IP:61.67.xxx.xxx 未訂閱
恕在下眼拙, 還是看不懂你的程式, 我猜想
>>其中有一个条件一是共有的,是每个查询都用到的,我的想法是在数据量大的时候是否需要将条件一的记录从几十>>万条里先选出来
指的是這段SQL吧, 這樣做是OK的, 不過我不知知道你把這段是放在那裡運作, 一個原理, 儘量減少SQL的語法重置(SQL.CLEAR, SQL.ADD...)
>>adoquery1.close;
>>adoquery1.sql.clear;
>>adoquery1.sql.add('select 字段一 from 表A where 条件一');
>>adoquery1.open;
>>将结果记录下来备用;
但接下來你希望從上段已過濾出來的記錄(可能只有幾筆, 再去做SUM)
我的疑問就是你還是使用同一個ADOQUERY1啊, 而且也重置語法, 那無疑還是從幾十萬筆中去撈記錄, 那與上段有何差別, 這就是我一直看不懂的地方?
===================引 用 ntjrr 文 章===================
我再细述一下,循环是其中的一种,不是所有,我说的意思如下:
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段一 from 表A where 条件一');
adoquery1.open;
将结果记录下来备用;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select sum(字段一) from 表A where 条件一');
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段二 from 表A where 条件一');
adiqyert1.sql.add( 'and 条件二');
adoquery1.open;

adoquery1.sql.clear;
adoquery1.sql.add('select 字段二 from 表A where 条件一');
adiqyert1.sql.add( 'and 条件二 条件三');
adoquery1.open;
........
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-13 13:40:20 IP:222.184.xxx.xxx 訂閱
如果按照我的另一个想法写就是这样写了:
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * into #temp from 表A where 条件一 ');//从几十万条中取得想要的结果
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段一 from 表#temp where 条件二 ');//从下面开始就只在十几条中选择了
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select sum(字段二) from 表#temp where 条件二 ');
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段二 from 表#temp where 条件二 条件三 ');
adoquery1.open;
我想知道这种想法比原来的好不好,效率能否提高




------
我的编程起步于ktop,我将永远支持ktop
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-13 14:15:43 IP:211.22.xxx.xxx 未訂閱
我個人覺得這樣無庸置疑吧?既然第一次的查詢是共通的!(但必須保證條件一與表一的資料不會增減),將共通性的資料先塞入臨時表中,這樣少了一次查詢(以你的需求條件應該是兩次),速度效能上當然比較好!
===================引 用 ntjrr 文 章===================
如果按照我的另一个想法写就是这样写了:
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * into #temp from 表A where 条件一 ');//从几十万条中取得想要的结果
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段一 from 表#temp where 条件二 ');//从下面开始就只在十几条中选择了
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select sum(字段二) from 表#temp where 条件二 ');
adoquery1.open;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select 字段二 from 表#temp where 条件二 条件三 ');
adoquery1.open;
我想知道这种想法比原来的好不好,效率能否提高




P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-09-14 11:25:15 IP:61.67.xxx.xxx 未訂閱
補充一點,如果您一開始用這樣的方式闡述我就可以了解了,另外你也可以考慮使用 create view 的方式建立類似temp的資料庫

create view 新資料表 as select * from 原資料表 where 條件

這種方式是會在資料庫中建立一個真實存在的table, 所以不能重覆建立,除非先 drop table
編輯記錄
P.D. 重新編輯於 2007-09-14 11:27:13, 註解 無‧
系統時間:2024-05-21 16:42:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!