請問如何加速查詢的速度 |
答題得分者是:T.J.B
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
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 發送簡訊給我 |
我貼一下目前困擾我的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 發送簡訊給我 |
ㄚ達: 提供一個做法參考看看
從你的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 發送簡訊給我 |
試一下這樣看看..
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 發送簡訊給我 |
除了 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 發送簡訊給我 |
感謝各位前輩的指導,本來想要一口氣看看能否用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,你救了我一命呢!
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |