全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3845
推到 Plurk!
推到 Facebook!

如何增加查詢效率,增加index??

答題得分者是:yubad2000
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-22 09:59:46 IP:61.218.xxx.xxx 訂閱
如何增加查詢效率,增加index??
主要table有二個:table_a,table_b
次要table有二個:table_x,table_y
table_a
主要欄位有a_pk,b_pk,x_pk,y_pk.......
主鍵是a_pk
大約有50個欄位,30萬筆資料
table_b
主要欄位有b_pk,c_pk........
主鍵是b_pk
大約有25個欄位,500筆資料
table_x
主要欄位有x_pk,x_name........
主鍵是b_pk
大約有5個欄位,10筆資料
table_y
主要欄位有y_pk,y_name........
主鍵是y_pk
大約有5個欄位,10筆資料
目前查詢sql語法大約是(sql語法1)
select table_a.a_pk,x_name,y_name
from table_a,table_x,table_y
where table_a.x_pk=table_x.x_pk
and table_a.y_pk=table_y.y_pk
and table_a.b_pk=參數
現在要加入table_b(sql語法2)
select table_a.a_pk,x_name,y_name
from table_a,table_x,table_y,table_b
where table_a.b_pk=table_b.b_pk
and table_a.x_pk=table_x.x_pk
and table_a.y_pk=table_y.y_pk
and table_b.c_pk=參數
sql語法2查詢時,速度很慢,有時會有逾時之問題,
把table_a的b_pk欄位加一個index,
table_b的c_pk欄位加一個index
速度沒有差很多49.94%:50.06%(用query analyzer的顯示評估的執行計劃,算出來的數據)
但sql語法1在table_a的b_pk欄位加一個index後
速度差很多,0.35%:99.65%
請問一下,有方法可以改善sql語法2的效率嗎????

------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-22 13:21:53 IP:122.116.xxx.xxx 訂閱
用 JOIN 或 LEFT JOIN, 請參考
http://www.wretch.cc/blog/sky4s&article_id=2250385

我用慣了 ORACLE, 如下
select table_a.a_pk,x_name,y_name
from table_a,table_x,table_y,table_b
where table_a.b_pk=table_b.b_pk( )
and table_a.x_pk=table_x.x_pk( )
and table_a.y_pk=table_y.y_pk( )
and table_b.c_pk=參數

意思是, 以 TABLE_A 為主檔, 其餘的全部 JOIN (參考)進來,
以使用 ORACLE 的經驗而言, 速度差很多


------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-02-22 13:26:01, 註解 無‧
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-22 14:02:52 IP:61.218.xxx.xxx 訂閱
改用join
select table_a.a_pk,x_name,y_name
from table_a join table_b on table_a.b_pk=table_b.b_pk
join table_x on table_a.x_pk=table_x.x_pk
join table_y on table_a.y_pk=table_y.y_pk
where table_b.c_pk=參數
速度一樣
但還是感謝st33chen兄的建議

用sql profiler的追蹤,執行sql語法2
把追蹤的結果用索引微調精靈
會在table_a加上index,把select出來的欄位都建立索引
加上索引後之速度,變快很多,
但只要select的欄位加上未在索引裡面的欄位
速度又慢下來了,
table_a有50個欄位,這個程式會捉出table_a 20個欄位,
要把這麼多個欄位都拉進來作index????
索引微調精靈產生的sql語法裡面有一句
CREATE STATISTICS [hind_1012198656_1A_4A] ON [dbo].[table_b] ([b_pk], [c_pk])
請問一下,這是作什麼的??
thanks
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-22 14:32:52 IP:211.75.xxx.xxx 訂閱
以MS-SQL 來說
除了叢集式索引外
一般索引必須包含select 的所有欄位及where 條件的所有欄位才有效
否則會以scan table的方式進行
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
yubad2000
中階會員


發表:0
回覆:44
積分:78
註冊:2007-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-02-23 13:21:32 IP:66.171.xxx.xxx 未訂閱
Try the following things:
1. table_a
(i) CREATE INDEX table_a_index2 ON table_a ( a_pk,b_pk,x_pk,y_pk );
(ii) ALTER TABLE table_a
ADD FOREIGN KEY b_pk references table_b
ADD FOREIGN KEY x_pk references table_x
ADD FOREIGN KEY y_pk references table_y;
2. table_b
(i) CREATE INDEX table_b_index2 ON table_b ( b_pk,c_pk )
(ii) ALTER TABLE table_b
ADD FOREIGN KEY c_pk references table_c;
===================引 用 jackiemi2_seed 文 章===================
如何增加查詢效率,增加index??
主要table有二個:table_a,table_b
次要table有二個:table_x,table_y
table_a
主要欄位有a_pk,b_pk,x_pk,y_pk.......
主鍵是a_pk
大約有50個欄位,30萬筆資料
table_b
主要欄位有b_pk,c_pk........
主鍵是b_pk
大約有25個欄位,500筆資料
table_x
主要欄位有x_pk,x_name........
主鍵是b_pk
大約有5個欄位,10筆資料
table_y
主要欄位有y_pk,y_name........
主鍵是y_pk
大約有5個欄位,10筆資料
目前查詢sql語法大約是(sql語法1)
select table_a.a_pk,x_name,y_name
from table_a,table_x,table_y
where table_a.x_pk=table_x.x_pk
and table_a.y_pk=table_y.y_pk
and table_a.b_pk=參數
現在要加入table_b(sql語法2)
select table_a.a_pk,x_name,y_name
from table_a,table_x,table_y,table_b
where table_a.b_pk=table_b.b_pk
and table_a.x_pk=table_x.x_pk
and table_a.y_pk=table_y.y_pk
and table_b.c_pk=參數
sql語法2查詢時,速度很慢,有時會有逾時之問題,
把table_a的b_pk欄位加一個index,
table_b的c_pk欄位加一個index
速度沒有差很多49.94%:50.06%(用query analyzer的顯示評估的執行計劃,算出來的數據)
但sql語法1在table_a的b_pk欄位加一個index後
速度差很多,0.35%:99.65%
請問一下,有方法可以改善sql語法2的效率嗎????

------
===波士頓夜未眠===
What a wonderful world!!
Jazz up the world with jazz!!
==================

When I am not programming...
you can find me here:
http://www.holy-war.de/EN/World3/bin/?advertiser=63190
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-02-25 10:12:16 IP:61.218.xxx.xxx 訂閱
感謝yubad2000兄的幫忙
加上index及FOREIGN KEY後,大約只要1/4的時間而以
thanks
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
系統時間:2024-05-17 3:40:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!