2014-01-09 75 views
1
SELECT num, code, LN AS LabelName 
FROM product 
INNER JOIN link 
    ON product.seqno = link.seqno 
INNER JOIN master 
    ON link.code = master.code 

像是有沒有其他的方式來寫這個SQL?使此查詢更快?

DB layout is like this: 

1)TABLE: product 
num(key) 
ln 
seqno 

2)TABLE: link 
seqno(key) 
code(key) 

3)Table: master 
code(key) 
+0

優化SQL查詢與分析開始爲什麼他們很慢。在IBExpert中,顯示了查詢PLAN,並且還有一個像磁盤抓取,緩存抓取等操作的圖表(您自己閱讀的數字和計劃,並將問題放在我們要讀的問題中)。你應該閱讀這些內容,看看有什麼瓶頸。此外,IBExpert爲每個顯示其聲明的表格提供「腳本」選項卡 - 請將這些腳本完全包含在您使用的三個表格中。 PS:很多關於更快製作Firebird查詢的文章:http://ibase.ru/develop.htm#performance –

回答

2

你不實際使用的主表

select num,code, LN as LabelName 
from product 
inner join link on product.seqno = link.seqno 
當然

你可能已經採取了部分出你的問題 - 但我們怎麼能回答?

(NB,書面查詢可能會在主表不同的結果,因爲只有代碼將被退回。我相信這不是爲什麼它被掛)

1

書面,查詢將不會運行,因爲列code不明確 - 它可能來自master表或link表。

假設你不使用master表進行過濾,那麼你可以從查詢中刪除:

select product.num, link.code, product.LN as LabelName 
from product inner join 
    link on product.seqno = link.seqno; 

否則,查詢和索引看起來是合理的。

1

是否有product.seqno上的索引?

取決於表的大小,這可以顯着加快查詢速度。

1

既然你談到主詳細的,典型的ISAM數據庫和暗示的記錄進行手動管理的定位理念,我會讓你其實只需要一組記錄的猜測,並不是所有的整個數據庫中讀取。根據你需要什麼,然後它會去像

SELECT product.num, link.code, product.LN AS LabelName 
FROM product , master , link 
WHERE product.seqno = link.seqno 
    AND link.code = master.code 
    AND master.ID = 12345 

甚至

SELECT product.num, link.code, product.LN AS LabelName 
FROM product , master , link 
WHERE product.seqno = link.seqno 
    AND link.code = 12345 

因爲你提到德爾福你應該用參數替換12345一樣顯示在http://bobby-tables.com/delphi.html