谁来帮帮我啊,oracle查询好慢呢

request 发布于 2013/04/22 16:26
阅读 373
收藏 0

求高手不惜赐教,问题是这样的,做一个oracle分页查询,news_data是新闻表,news_type新闻类型,news_image是个新闻图片表,一条新闻可能有多张图片,要求只取一张图片对应一条新闻,然后分页 现在情况是新闻类型多,数据多 这样查询比较慢的,在线等啊~~急急急

select*from(select rownum rn,a.* from(select i.img_id,i.img_url,t.news_id,t.news_title,t.news_detail,t.news_date,t.match_type from news_data t left join(select x.img_id,x.news_id,x.img_url from news_image x where not exists(select 1 from news_image y where x.news_id = y.news_id and x.img_id > y.img_id)) i on t.news_id = i.news_id where t.news_type = 3 orderby t.news_date desc) a where rownum <= 10 ) where rn > 0

 

 

加载中
0
IdleMan
IdleMan
这个子查询不慢才怪,语句表达的含义是什么?取相同newid下最小的一个img_id?
SELECT X.IMG_ID, X.NEWS_ID, X.IMG_URL
  FROM NEWS_IMAGE X
 WHERE NOT EXISTS (SELECT 1
          FROM NEWS_IMAGE Y
         WHERE X.NEWS_ID = Y.NEWS_ID
           AND X.IMG_ID > Y.IMG_ID);

换成下面的试试,并尝试在 NEWS_IMAGE(NEWS_ID,IMG_ID)上创建索引
SELECT *
  FROM NEWS_IMAGE
 WHERE (IMG_ID, NEWS_ID) IN
       (SELECT NEWS_ID, MIN(IMG_ID) FROM NEWS_IMAGE GROUP BY NEWS_ID);

再加一个hint试试
SELECT /*+first_rows_10*/
 *
  FROM (SELECT ROWNUM RN, A.*
          FROM (SELECT I.IMG_ID,
                       I.IMG_URL,
                       T.NEWS_ID,
                       T.NEWS_TITLE,
                       T.NEWS_DETAIL,
                       T.NEWS_DATE,
                       T.MATCH_TYPE
                  FROM NEWS_DATA T
                  LEFT JOIN (SELECT X.IMG_ID, X.NEWS_ID, X.IMG_URL
                              FROM NEWS_IMAGE X
                             WHERE NOT EXISTS
                             (SELECT 1
                                      FROM NEWS_IMAGE Y
                                     WHERE X.NEWS_ID = Y.NEWS_ID
                                       AND X.IMG_ID > Y.IMG_ID)) I
                    ON T.NEWS_ID = I.NEWS_ID
                 WHERE T.NEWS_TYPE = 3
                 ORDER BY T.NEWS_DATE DESC) A
         WHERE ROWNUM <= 10)
 WHERE RN > 0;

 
 其他索引考虑
NEWS_DATA(NEWS_ID,NEWS_TYPE)



request
request
谢谢,很受用,按照你说的弄 快多了,哈哈!灰常感谢
0
久欠幸福
久欠幸福
你这能不能先把这个sql格式化一下再发上来啊,看见这么一坨谁都没心情去优化啊
request
request
哦 哈哈 第一次发代码呀,忘记格式化了 弄好了,帮我看看呗 谢谢
0
dedenj
dedenj
看查询计划
request
request
好的
JustForFly
JustForFly
回复 @zz20101210yn : 建议你导一份全的数据来测试,并且先确定慢的语句是那一块,这样才好去优化。
request
request
测试环境下数据少
0
amonxu
amonxu

1.sql没格式化

2.sql很多地方都写到一起了

3.left join,not exists这些都影响效率。

4.看一下执行计划

request
request
为了实现需要的查询结果,不用不行啊,有好的办法吗?说说嘛
0
肥添
肥添

这个不知道行不行

SELECT *
FROM   (SELECT n.*,
               rownum rn
        FROM   news_data n
               LEFT JOIN (SELECT *
                          FROM   news_imgs
                          GROUP  BY newid ) i
                      ON i.newid = n.newid
        WHERE  t.news_type = 3
               AND rn <=? ) t
WHERE  t.rn >?

request
request
group by 不能这么用的,不过还是谢谢你的回答
返回顶部
顶部