求一条多表联查SQL语句的优化。恳请SQL达人进。谢谢。

姑妄听之 发布于 2012/06/21 08:14
阅读 463
收藏 0
OSCHINA的朋友们,大家好!


我在工作中遇到一个问题,恳求大家的帮助。



先说说表的情况。我有个查询,涉及到这几个表格:

1)patient 表, 记录共 707832 条。
2)case_event 表, 记录共 2975352 条。
3)case_main 表, 记录共 2975056 条。
4)orders 表, 记录共 3043243 条。


我有一个几个表联查的语句。是这样的:

SELECT pa_nhi FROM patient WHERE pa_pno IN (SELECT cs_pno FROM case_main WHERE cs_serial IN (SELECT ce_cs_serial FROM case_event WHERE ce_serial IN (SELECT or_event_serial FROM orders WHERE or_accession_no = '809862')));

能达到目的,但是速度上不是很快。根据7次查询平均值(\timing测算出来的)是1494.57ms


根据同事的建议,我把它改成了另外一种写法:

SELECT pa_nhi FROM patient, case_main, case_event, orders WHERE or_event_serial = ce_serial AND ce_cs_serial = cs_serial AND cs_pno = pa_pno AND or_accession_no = '809862';

速度上有所提高,但是并不显著。根据7次查询平均值是1461.86ms

两者相差32.71ms。

现在这几个表格是已经固定的了,从改进表结构的角度,下手比较难。

请问大家,还有没有比较好的建议,针对这种几个表联查的情况,可以显著提高速度的?   



恳请大家提些意见,谢谢大家!
加载中
0
吴中兴
最好把表关系搞出来
0
William
William
主鍵索引鍵哪個?
0
RickyFeng
RickyFeng
SELECT p.pa_nhi
FROM patient as p
INNER JOIN case_main  as cm ON cm.cs_pno = p.pa_pno
INNER JOIN case_event as ce ON ce.ce_cs_serial = cm.cs_serial
INNER JOIN orders as o ON o.or_event_serial =  ce.ce_serial
WHERE o.or_accession_no = '809862';

记得第个连接的Key要做Index

0
IdleMan
IdleMan
索引:
patient .pa_pno
case_main.cs_serial
case_event.ce_serial
orders.or_accession_no
如果可能把这些表转为簇表也不会影响应用
返回顶部
顶部