線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2222
推到 Plurk!
推到 Facebook!

TQuery執行(新增或刪除)時,能夠獲知目前處理的筆數嗎?

答題得分者是:syntax
evans0494
一般會員


發表:8
回覆:9
積分:8
註冊:2006-11-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-02 16:23:47 IP:61.219.xxx.xxx 訂閱
因為要每月更新總公司所含的分店銷售資料,但是分店的資料主檔加明細檔
大概都要快四十萬筆,所以想要在做從分店抓取資料insert到總部的資料庫時
能夠知道目前新增到第幾筆了(用TQuery下去做ExecSQL)
因為可以得知要新增的筆數,是有想過在固定每隔一段時間,就去撈一次目前總公司
要新增的table有幾筆了,這樣定時顯示出目前新增資料的進度為多少,
不知道大大們有沒有更好的辦法? ^^
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-02 17:32:26 IP:203.73.xxx.xxx 訂閱
var 
Rowi:integer;
begin
Rowi:= Query1.RowsAffected;
end;
------
What do we live for if not to make life less difficult for each other?
canvas
一般會員


發表:6
回覆:21
積分:10
註冊:2004-01-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-03 00:08:35 IP:220.132.xxx.xxx 訂閱
這個...不好意思, RowsAffected 好像要等整個 Query 敘述整理完才能傳回 數值

===================引 用 christie 文 章===================
var
Rowi:integer;
begin
Rowi:= Query1.RowsAffected;
end;
canvas
一般會員


發表:6
回覆:21
積分:10
註冊:2004-01-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-03 00:45:49 IP:220.132.xxx.xxx 訂閱
在 Insert 資料當中, 如果逐筆 Insert, 那倒還方便, 用 RecordCount 就可以取得資料總筆數了.

但如果是用 INSERT INTO....SELECT 敘述(整批讀取分店資料然後整批新增進總公司資料庫), 那就麻煩一些, 因為在敘述執行完期間, 中間不可能有任何中斷點可以加入任何指令, 除非全部執行完畢(用 ExecSQL).

有一個變通的方法就是加掛 timer

試試看這樣行不行, 不過就我所知, Loading 可能會加重一些.

1. (總店)另開一個 Query, 裡面 SQL 寫 SELECT Count(*) as nCount from [table] where [分店號碼欄位]=分店號碼(建議 table 最好是主檔, Loading 會輕一點).
2. 設 denominator 變數為分店要更新的筆數
3. 掛一個 Timer, timer 先不要開啟, timer 內容是每個格幾秒或是幾分鐘去抓資料庫目前的筆數(步驟 1), 如果有進度的數字或者是 Progress bar, 順便更新
4. 執行 Insert 前先執行一次步驟 1 取得總店原有的分店資料筆數, 設為 base
5. 執行 insert (就是由總公司從分店抓取分店資料)前先開啟 timer, 執行後再關閉
6. 進度百分比為 (timer 中取得的資料比數-base)/denominator*100%
7. Progress Bar 設起點為零, 終點為分店要增加的比數, timer 中去變動 Step

以上. 看不懂的話照步驟做一次就知道了, Loading 若太重, 把 timer.interval 間隔加大, 建議至少為十秒(10000),

希望會有所幫助
===================引 用 evans0494 文 章===================
因為要每月更新總公司所含的分店銷售資料,但是分店的資料主檔加明細檔
大概都要快四十萬筆,所以想要在做從分店抓取資料insert到總部的資料庫時
能夠知道目前新增到第幾筆了(用TQuery下去做ExecSQL)
因為可以得知要新增的筆數,是有想過在固定每隔一段時間,就去撈一次目前總公司
要新增的table有幾筆了,這樣定時顯示出目前新增資料的進度為多少,
不知道大大們有沒有更好的辦法? ^^
evans0494
一般會員


發表:8
回覆:9
積分:8
註冊:2006-11-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-04 14:01:23 IP:61.219.xxx.xxx 訂閱
謝謝各位大大提供的方法
目前我在測試的作法先做一筆一筆的新增,
每新增一筆,就update 畫面上新增筆數的label caption
然後再來看它花費的時間和實際一次整個異動資料做insert into會不會有很大的差距

對於大大提供的方法,我有個小問題~
因為如果做整批insert into的話,我是做完後才下資料庫的commit
那這樣如果另timer定時去做query目前總公司的資料庫新增到第幾筆時,
因為是用不同的query去做,是不是會有不同的session,
那這樣在我未下commit時,不就查不到目前cache update到哪了?
是不是要拉個session來當做insert into 和select 的共同session?
因為目前還在做方法一(一筆一筆新增)的測試,方法二(整批新增,再用timer去看筆數)還未實作
故先將疑問po上來,若有後續結果再po文囉! 感謝!!!
canvas
一般會員


發表:6
回覆:21
積分:10
註冊:2004-01-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-06 02:15:41 IP:220.132.xxx.xxx 訂閱
1. 沒必要拉個 session 來共用, 因為 session 都是用 TDATABASE 的 session (除非你沒拉 TDatabase, 建議拉一個)
2. 如果你採用逐筆新增的方式, 這個嘛, 鐵定會慢很多, 因為這樣每筆資料都會有 open...close(低階 I/O 啦)的動作, 而整批新增的動作, 是開始時 open, 結束時才 close, 省了很多這類的動作, 相較之下前者比較方便得知資料筆數但犧牲了速度, 後者卻是比較快速, 但失去了對資料筆數的控制, 斟酌一下吧, 我比較喜歡後者, 雖然複雜了些..

===================引 用 evans0494 文 章===================
謝謝各位大大提供的方法
目前我在測試的作法先做一筆一筆的新增,
每新增一筆,就update 畫面上新增筆數的label caption
然後再來看它花費的時間和實際一次整個異動資料做insert into會不會有很大的差距

對於大大提供的方法,我有個小問題~
因為如果做整批insert into的話,我是做完後才下資料庫的commit
那這樣如果另timer定時去做query目前總公司的資料庫新增到第幾筆時,
因為是用不同的query去做,是不是會有不同的session,
那這樣在我未下commit時,不就查不到目前cache update到哪了?
是不是要拉個session來當做insert into 和select 的共同session?
因為目前還在做方法一(一筆一筆新增)的測試,方法二(整批新增,再用timer去看筆數)還未實作
故先將疑問po上來,若有後續結果再po文囉! 感謝!!!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-06 07:58:56 IP:61.64.xxx.xxx 訂閱
這個問題,其實沒有那麼難解決,似乎大家都想太多,有點鑽到牛角尖去了

首先,思考一下,為何要顯示目前進度,即是顯示目前進度的意義何在?
當然是,因為作業時間過久,而人都不喜歡等,想要知道「還要多久啊?」,所以我們顯示進度,來減低使用者的不耐,並公告「程式還活著」
所以到底多久是很久?

由於是資料庫作業,所以時間會因為資料的大小與筆數有關
一筆一筆新增,與使用 Timer ,如此為了顯示進度而犧牲效能之巨,個人認為是極不值得

同時,資料庫每筆資料都會有 open...close的動作,但不見得都是低階 I/O ,依據資料庫的設定,有可能都只有在記憶體運作

所以我們不必去管資料庫端的時間消耗,資料庫自有最佳化方法

這裡只要管,每新增一次的傳輸量,與總時間

應該是:連線前置花費 傳輸資料花費 連線後置花費
其中傳輸時間花費,只要總量不變,就不變更,而連線後置花費雖然很低,但還是考慮一下好了
如果不是常設連線(Connected),則還必須加入連線時間與斷線時間

所以我們可以採取,固定筆數上傳一次,並顯示進度,這樣看你切割的方式
40 萬筆,建議可以使用每 1000 筆更新一次

然後測試一下,如果很久就降低,如果很快,就加大
因為是貴公司的設計,所以單筆傳輸量你應該可以推算出

或是乾脆設計為動態的程式:
1. 計算平均單筆資料大小
2. 推算單筆時間
3. 取得總筆數
4. 取得設定的忍耐時間
5. 計算出合適的分割大小
6. 一該大小為回圈, Update 並顯示進度
canvas
一般會員


發表:6
回覆:21
積分:10
註冊:2004-01-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-07 02:28:37 IP:220.132.xxx.xxx 訂閱
的確, 這卻是一個好方法

不可否認的, 我一開始就被原有的需求限制住了思維, 而忽略了系統的效能

真正一個好的設計, 是要顧及到順暢, 而不是光在效果上做花俏的

樓煮決定了嗎, 建議用以上這個作為結案答案
系統時間:2024-05-17 19:04:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!