2014-01-09 77 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