從INTERBASE 中取數死機(沒回映) |
尚未結案
|
SY_Huang
一般會員 發表:17 回覆:31 積分:9 註冊:2003-10-24 發送簡訊給我 |
各位大大:SQl語句如下:
select Att_date,staff_code,L1_Code,L2_Code,L3_Code,L4_Code,Given_Name,DESCRIPTION2,act_abs_integer, Rec_Mt_start,Rec_Mt_End,Rec_T1_Start,Rec_T1_End,Rec_T2_Start,Rec_T2_end, Act_Mt_start,Act_Mt_End,Act_T1_Start,Act_T1_End,Act_T2_Start,Act_T2_end, IRR_MT_START,IRR_MT_END,IRR_T1_Start,IRR_T1_END,IRR_T2_Start,IRR_T2_END, Act_OT1_integer,Act_OT2_integer from Em_mast,ta_job,em_att_data where em_att_data.staff_code=em_mast.staff_code and ta_job.job_code=em_mast.job_code and em_att_data.Att_date >='2004/11/04' and att_date<='2004/11/04' order by staff_code' 數據大概5000-6000 用Tquery 控件做的﹐是不是Interbase 不支持如此大的查詢》
有沒有更好的方法...........HELP.....HElp......
|
SY_Huang
一般會員 發表:17 回覆:31 積分:9 註冊:2003-10-24 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ SQL敘述部分有些問題
staff_code和job_code此兩個欄位是用于關聯資料庫之作用﹐job_code在查詢的回傳部分(Select ...省略點的位置)沒有出現﹐故無關緊要﹐但staff_code在查詢的回傳部分有出現(Select Att_date, staff_code...)中有出現﹐既然是關聯欄位﹐其它的某個資料表中一定也有此欄位﹐故在Select時﹐資料庫不知要回傳哪個資料表的staff_code﹒記住這里有一個原則﹐在多資料表的關聯查詢中﹐如果查詢的欄位分別是各個資料表獨有的﹐在欄位名稱前就可不必加上資料表名﹐如果查詢的欄位在超過一個資料表中具有﹐就需要在欄位名稱前加上資料表名稱﹐根据這個原則修改您的欄位名稱部分﹐應該就可以了﹒所以應將您的SQL改成如下﹕
select Att_date,em_att_data.staff_code,L1_Code,
L2_Code,L3_Code,L4_Code,Given_Name,DESCRIPTION2,
act_abs_integer,Rec_Mt_start,Rec_Mt_End,Rec_T1_Start,Rec_T1_End,
Rec_T2_Start,Rec_T2_end,Act_Mt_start,Act_Mt_End,Act_T1_Start,Act_T1_En
d,Act_T2_Start,Act_T2_end,IRR_MT_START,IRR_MT_END,IRR_T1_Start,IRR_T1_
END,IRR_T2_Start,IRR_T2_END, Act_OT1_integer,Act_OT2_integer from
Em_mast,ta_job,em_att_data where em_att_data.staff_code=
em_mast.staff_code and ta_job.job_code=em_mast.job_code and
em_att_data.Att_date>='2004/11/04' and att_date<='2004/11/04'
order by em_att_data.staff_code
當然﹐其中可能還有一些欄位是超過一個資料表中具有的﹐故請您自己再做一個檢查﹐找出有此問題的欄位名稱﹐在其之前加上資料表名稱﹐建議您使用資料表別名的方法在每個欄位名稱前皆加上資料表別名﹐有利用查看﹒ 另外還有一個問題﹐就是效率方面的﹐一般來講﹐我們在做SQL查詢時﹐資料表之間的關聯欄位敘述我們都會放在SQL語句中Where語句的最后面﹐就您的例子來講﹐先做Where 欄位關聯會查詢出很多資料﹐再做Where 欄位值>=條件來查詢符合條件的資料一定會比先做Where 欄位值>=條件來查詢符合條件的資料﹐再做Where 欄位關聯的效率慢了很多﹐所以再把您的SQL改善如下﹕
select Att_date,em_att_data.staff_code,L1_Code,
L2_Code,L3_Code,L4_Code,Given_Name,DESCRIPTION2,
act_abs_integer,Rec_Mt_start,Rec_Mt_End,Rec_T1_Start,Rec_T1_End,
Rec_T2_Start,Rec_T2_end,Act_Mt_start,Act_Mt_End,Act_T1_Start,Act_T1_En
d,Act_T2_Start,Act_T2_end,IRR_MT_START,IRR_MT_END,IRR_T1_Start,IRR_T1_
END,IRR_T2_Start,IRR_T2_END, Act_OT1_integer,Act_OT2_integer from
Em_mast,ta_job,em_att_data where em_att_data.Att_date>='2004/11/04' and att_date<='2004/11/04' and em_att_data.staff_code=
em_mast.staff_code and ta_job.job_code=em_mast.job_code
order by em_att_data.staff_code 參考看看﹗ =========================
我是您的朋友﹐有您真好﹗
=========================
------
忻晟 |
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
SY_Huang
一般會員 發表:17 回覆:31 積分:9 註冊:2003-10-24 發送簡訊給我 |
1.按cashxin2002兄 做了﹐但是還是很慢(在任務管理中查看 其執行沒有回應).
2.按hahalin 做了﹐有效果.但是我如何知道一個RecordCount 呢?進度條必須知道記錄總數. 程序執行到
如:
....
ProgressBar1.Max:= trec.recordcount ;
trec.close ;
...
時死機﹐程序沒有回應。。。等了一個小時還是沒有回應.
另: 我的Data.gdb 為 855M .此Tquery大概取到5000-6000 數據.是不是
Interbase 數據庫不支持大量數據操作.(經測試在137M,以前的備份資料庫上
代碼完全可以順利執行). HElp.............HElp.............HElp............. 各位大大﹐是否有一個工具可以隊Interbase 資料庫瘦身呢??
謝謝!!!
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
chinyu
高階會員 發表:12 回覆:157 積分:153 註冊:2002-06-14 發送簡訊給我 |
引言: 1.按cashxin2002兄 做了﹐但是還是很慢(在任務管理中查看 其執行沒有回應). 2.按hahalin 做了﹐有效果.但是我如何知道一個RecordCount 呢?進度條必須知道記錄總數. 程序執行到 如: .... ProgressBar1.Max:= trec.recordcount ; trec.close ; ... 時死機﹐程序沒有回應。。。等了一個小時還是沒有回應. 另: 我的Data.gdb 為 855M .此Tquery大概取到5000-6000 數據.是不是 Interbase 數據庫不支持大量數據操作.(經測試在137M,以前的備份資料庫上 代碼完全可以順利執行). HElp.............HElp.............HElp............. 各位大大﹐是否有一個工具可以隊Interbase 資料庫瘦身呢?? 謝謝!!!我用firebird時遇到客戶用了2年多的資料庫,在做某個查詢時變慢了(本來5秒內變為30秒),也查不出來原因,後來把資料庫backup再restore後就正常了,給你參考看看。 |
SY_Huang
一般會員 發表:17 回覆:31 積分:9 註冊:2003-10-24 發送簡訊給我 |
|
chinyu
高階會員 發表:12 回覆:157 積分:153 註冊:2002-06-14 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi SY_Huang 你好: Backup :
使用IBConsole, 先將資料庫打開, 在資料庫上按滑鼠右鍵-->Backup/Restore-->Backup-->Garbage Collection 設為False-->Alias隨便取個名稱-->左下Grid FileName先隨便給個檔名例如: C:\abc.gdb-->點選OK Backup 完成 Restore :
將外層Backup展開, 選到你剛剛Alias填的名稱-->OverWrite設為True-->點選OK 這動作有一點修復的能力, 並且將多於保留空間清除, 資料庫會變的比較小, 效率小小增加, 建議你先將Table的Index設定看看, 將SQL貼到IBConsole點選Prepare....像一頁筆記的圖案, 看看資料是否都是Plan還是有用到Index. 我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |