日期:2014-05-17  浏览次数:21329 次

三表Full Join,求SQL优化。
三张表,各在千万数量级。关键字段都已经建好索引。

现在用相同的查询条件查询各个表,每个表都返回一个1000条左右的记录,每次查询在1s左右。
两两Full Join查询,每次查询同样返回1000条左右的记录,每次查询在5 ~ 30 s。
现在想三表一起Full Join,每次估计返回的记录也在1000条左右,但速度就慢的没法忍受。

表的结构如下:
表A三个字段 sample_id, gene_id, data_a
表B三个字段 sample_id, gene_id, data_b
表C三个字段 sample_id, gene_id, data_c
其中sample_id, gene_id都已经建好索引。

查询条件是一组gene_id,

我现在的查询语句如下:

SELECT COALESCE(A.SAMPLE_ID, B.SAMPLE_ID, C.SAMPLE_ID) AS SAMPLE_ID,
    COALESCE(A.GENE_ID, B.GENE_ID, C.GENE_ID) AS GENE_ID, 
    A.DATA_A, B.DATA_B, C.DATA_C
FROM A FULL JOIN B ON A.SAMPLE_ID = B.SAMPLE_ID AND A.GENE_ID = B.GENE_ID
    FULL JOIN C ON COALESCE(A.SAMPLE_ID, B.SAMPLE_ID) = C.SAMPLE_ID 
        AND COALESCE(A.GENE_ID, B.GENE_ID) = C.GENE_ID
WHERE GENE_ID IN (317781, 11202);


有没有办法把最终的查询结果控制在5 ~ 10s左右。

谢谢。

------解决方案--------------------
给出执行计划
------解决方案--------------------
PL工具

------解决方案--------------------
plsql developer--新建SQL窗口--输入SQL语句--F5,把结果贴出来看看
------解决方案--------------------
SELECT COALESCE(A.SAMPLE_ID, B.SAMPLE_ID, C.SAMPLE_ID) AS SAMPLE_ID,
       COALESCE(A.GENE_ID, B.GENE_ID, C.GENE_ID) AS GENE_ID,
       A.DATA_A,
       B.DATA_B,
       C.DATA_C
  FROM A
  FULL JOIN B
    ON A.SAMPLE_ID = B.SAMPLE_ID
   AND A.GENE_ID = B.GENE_ID
  FULL JOIN C
    ON B.SAMPLE_ID = C.SAMPLE_ID
   AND  B.GENE_ID = C.GENE_ID
 WHERE COALESCE(A.GENE_ID, B.GENE_ID, C.GENE_ID) IN (317781, 11202);
这样行不行,试试。条件GENE_ID已经确认了,感觉没必要用FULL JOIN,用JOIN就可以了