TQuery執行(新增或刪除)時,能夠獲知目前處理的筆數嗎? |
答題得分者是:syntax
|
evans0494
一般會員 發表:8 回覆:9 積分:8 註冊:2006-11-09 發送簡訊給我 |
|
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
|
canvas
一般會員 發表:6 回覆:21 積分:10 註冊:2004-01-25 發送簡訊給我 |
|
canvas
一般會員 發表:6 回覆:21 積分:10 註冊:2004-01-25 發送簡訊給我 |
在 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 發送簡訊給我 |
謝謝各位大大提供的方法
目前我在測試的作法先做一筆一筆的新增, 每新增一筆,就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 發送簡訊給我 |
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 發送簡訊給我 |
這個問題,其實沒有那麼難解決,似乎大家都想太多,有點鑽到牛角尖去了
首先,思考一下,為何要顯示目前進度,即是顯示目前進度的意義何在? 當然是,因為作業時間過久,而人都不喜歡等,想要知道「還要多久啊?」,所以我們顯示進度,來減低使用者的不耐,並公告「程式還活著」 所以到底多久是很久? 由於是資料庫作業,所以時間會因為資料的大小與筆數有關 一筆一筆新增,與使用 Timer ,如此為了顯示進度而犧牲效能之巨,個人認為是極不值得 同時,資料庫每筆資料都會有 open...close的動作,但不見得都是低階 I/O ,依據資料庫的設定,有可能都只有在記憶體運作 所以我們不必去管資料庫端的時間消耗,資料庫自有最佳化方法 這裡只要管,每新增一次的傳輸量,與總時間 應該是:連線前置花費 傳輸資料花費 連線後置花費 其中傳輸時間花費,只要總量不變,就不變更,而連線後置花費雖然很低,但還是考慮一下好了 如果不是常設連線(Connected),則還必須加入連線時間與斷線時間 所以我們可以採取,固定筆數上傳一次,並顯示進度,這樣看你切割的方式 40 萬筆,建議可以使用每 1000 筆更新一次 然後測試一下,如果很久就降低,如果很快,就加大 因為是貴公司的設計,所以單筆傳輸量你應該可以推算出 或是乾脆設計為動態的程式: 1. 計算平均單筆資料大小 2. 推算單筆時間 3. 取得總筆數 4. 取得設定的忍耐時間 5. 計算出合適的分割大小 6. 一該大小為回圈, Update 並顯示進度 |
canvas
一般會員 發表:6 回覆:21 積分:10 註冊:2004-01-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |