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

請問如何加速查詢的速度

答題得分者是:T.J.B
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-06 15:45:43 IP:211.21.xxx.xxx 未訂閱
我使用的是Sql Server,在建立查詢的時候, 總會因為join的關係需要花很多時間, 但是不用join又不行,所以想問問看有什麼辦法可以讓有join的select 速度快些
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-06 16:00:20 IP:210.58.xxx.xxx 未訂閱
Hi pprayer 兄您好: 1.試著建立Index看看 2.將SQL指令放到SQL Server的SQL Analyzer裡, 使用(Ctrl-L) [顯示評估的執行計劃]先分析調整 Good Luck 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-06 16:34:46 IP:61.220.xxx.xxx 未訂閱
1: 如果資料量大的話 (超過6~7萬筆資料) 盡量不要用subsql(子查詢) 也就是將子查詢獨立出來 再用程式下去做 2:在SQL中 'WHERE'後面先接要SELECT的條件然後 'AND' 後面再接要JOIN TABLE的欄位 會比 'WHERE'後面先接要JOIN TABLE的欄位 然後 'AND' 後面再接要SELECT的條件 要來的有效率 例如 :(假設資料有20萬筆) SQL: (效率高) SELECT A.ORDERNO,A.ITEMNO,B.PRODNO,B.QTY,B.AMOUNT FROM AAA A ,BBB B WHERE (B.PRODNO>='15000' AND B.PRODNO<='20000')<==(先找5000筆資料) AND (A.ORDERNO=B.ORDERNO ) <== (再把5000筆資料JOIN起來) SQL: (效率低) SELECT A.ORDERNO,A.ITEMNO,B.PRODNO,B.QTY,B.AMOUNT FROM AAA A ,BBB B WHERE (A.ORDERNO=B.ORDERNO ) <== (先把20萬筆資料JOIN起來) AND (B.PRODNO>='15000' AND B.PRODNO<='20000')<==(再找5000筆資料) 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2003/01/06 16:42:16
------
天行健
君子當自強不息~~@.@
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-06 17:07:22 IP:211.21.xxx.xxx 未訂閱
我貼一下目前困擾我的SQL select top 100 percent tb_sku.配次代碼 , tb_typ.商品類別名稱, tb_sku.商品代碼,sum(tb_ordd.訂購數量) 訂購總計, sum(tb_ordd.訂購數量)*tb_sku.出貨單價 出貨金額, sum(tb_ordd.訂購數量)*tb_sku.進貨單價 成本金額 , sum(tb_ordd.訂購數量)*tb_sku.出貨單價 - sum(tb_ordd.訂購數量)*tb_sku.進貨單價 毛利額 ,sum(tb_adjd.驗收數量) 修正數,sum(tb_adjd.驗收數量)*tb_sku.進貨單價 修正額 from tb_typ join tb_sku on tb_sku.商品類別代碼 = tb_typ.商品類別代碼 join tb_ordd on tb_sku.商品代碼 = tb_ordd.商品代碼 left outer join tb_adjd on tb_ordd.訂購單號 = tb_adjd.訂購單號 where tb_ordd.單據日期 = '20021120' group by tb_sku.配次代碼, tb_typ.商品類別名稱, tb_sku.商品代碼,tb_sku.出貨單價,tb_sku.進貨單價 order by 1,2,3 各table的index之前都已經建立過了,而Sql Server 我沒辦法把 where 子句放在 join那串的前面。 主要是慢在 left outer join tb_adjd on tb_ordd.訂購單號 = tb_adjd.訂購單號 這行。因為必須左右兩邊都要出來,所以這行一定要有。 另外也曾經試過view ,建立view很快,但是select view又慢了,結果還是一樣。 因為現在每次查詢都要六七秒,使用者嫌太慢,實在不知該怎麼處理才好。
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-07 10:45:42 IP:61.220.xxx.xxx 未訂閱
ㄚ達: 提供一個做法參考看看 從你的sql看起來 tb_typ這個table只用到一個欄位(tb_typ.商品類別名稱) 把它當做from後的主table較不理想 是否該用 tb_ordd 較好 把tb_typ拿掉 然後tb_typ.商品類別名稱 用lookup欄位去做 下面是修改的sql 參考看看 select top 100 percent tb_sku.配次代碼 , tb_typ.商品類別名稱, tb_sku.商品代碼,sum(tb_ordd.訂購數量) 訂購總計, sum(tb_ordd.訂購數量)*tb_sku.出貨單價 出貨金額, sum(tb_ordd.訂購數量)*tb_sku.進貨單價 成本金額, sum(tb_ordd.訂購數量)*tb_sku.出貨單價 - sum(tb_ordd.訂購數量)*tb_sku.進貨單價 毛利額 ,sum(tb_adjd.驗收數量) 修正數,sum(tb_adjd.驗收數量)*tb_sku.進貨單價 修正額 from tb_ordd join tb_sku on (tb_sku.商品類別代碼 = tb_ordd.商品代碼) left outer join tb_adjd on (tb_ordd.訂購單號 = tb_adjd.訂購單號) where tb_ordd.單據日期 = '20021120' group by tb_sku.配次代碼,tb_sku.商品代碼,tb_sku.出貨單價,tb_sku.進貨單價 order by 1,2,3 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-07 14:27:38 IP:211.74.xxx.xxx 未訂閱
試一下這樣看看.. SELECT tb_typ.商品類別名稱,B.* FROM tb_typ, ( SELECT tb_sku.配次代碼,tb_sku.商品代碼, tb_sku.出貨單價,tb_sku.進貨單價, sum(tb_ordd.訂購數量) 訂購總計, sum(tb_ordd.訂購數量) *tb_sku.出貨單價 出貨金額, sum(tb_ordd.訂購數量) *tb_sku.進貨單價 成本金額, sum(tb_ordd.訂購數量) *tb_sku.出貨單價 - 訂購總計*tb_sku.進貨單價 毛利額, sum(tb_adjd.驗收數量) 修正數, sum(tb_adjd.驗收數量) *tb_sku.進貨單價 修正額 FROM tb_sku,tb_ordd,tb_adjd WHERE tb_ordd.單據日期 = '20021120' AND tb_ordd.訂購單號 = tb_adjd.訂購單號 ANF tb_ordd.商品代碼 = tb_sku.商品類別代碼 group by tb_sku.配次代碼,tb_sku.商品代碼, tb_sku.出貨單價,tb_sku.進貨單價 ) B WHERE B.商品代碼=tb_typ.商品類別代碼 ORDER BY 1,2,3 TRY TRY SEE 發表人 - chih 於 2003/01/07 15:32:57
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-08 09:49:19 IP:163.29.xxx.xxx 未訂閱
除了 Improve Index 的調整外. Create View 應該也可考慮,DB Server 可省去 Build Query Plan的時間. 可惜 MS Sql 沒有像 Oracle "Materialized View / SnapShot" 可用. 看起來你的 SQL 效率應該已經相當不錯, 能精進的空間不大, 如果資料結構允許變動, 相關 Key Column 改用 int datatype 可能會好一些. /* 使用中文很辛苦,中華男兒當自強 */ 發表人 - Mickey 於 2003/01/08 10:12:28
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-01-08 18:17:54 IP:211.21.xxx.xxx 未訂閱
感謝各位前輩的指導,本來想要一口氣看看能否用SQL就作出結果來, 後來還是照TJB說的方式。 多擺一個TQuery 原先的TQuery (qryMaster)Sql如下 select top 100 percent tb_sku.配次代碼 , tb_typ.商品類別名稱, tb_sku.商品代碼, sum(tb_ordd.訂購數量) 訂購總計, sum(tb_ordd.訂購數量)*tb_sku.出貨單價 出貨金額, sum(tb_ordd.訂購數量)*tb_sku.進貨單價 成本金額 , sum(tb_ordd.訂購數量)*tb_sku.出貨單價 - sum(tb_ordd.訂購數量)*tb_sku.進貨單價 毛利額 from tb_typ join tb_sku on tb_sku.商品類別代碼 = tb_typ.商品類別代碼 join tb_ordd on tb_sku.商品代碼 = tb_ordd.商品代碼 where tb_ordd.單據日期 = '20021120' group by tb_sku.配次代碼, tb_typ.商品類別名稱, tb_sku.商品代碼,tb_sku.出貨單價,tb_sku.進貨單價 order by 1,2,3 新增的TQuery(qrySub) Sql如下 select top 100 percent tb_sku.配次代碼 , tb_typ.商品類別名稱, tb_sku.商品代碼, sum(tb_adjd.驗收數量) 修正數, sum(tb_adjd.驗收數量)*tb_sku.進貨單價 修正額 from tb_typ,tb_sku,tb_adjd where tb_adjd.單據日期 = '20021120' group by tb_sku.配次代碼, tb_typ.商品類別名稱, tb_sku.商品代碼,tb_sku.出貨單價,tb_sku.進貨單價 order by 1,2,3 在qryMaster新增兩個LooUpField,這樣的速度會比較快沒錯。 TJB,你救了我一命呢!
系統時間:2024-05-14 17:31:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!