--- sql 1:
SELECT *
  FROM (SELECT A.*
        FROM (
             select T1.*,U.User_Name
             from(
                 select T.*,
                       I.BULLETIN_TITLE,
                       I.CREATE_DATE CALENDAR,
                       I.STATUS 
                 from(
                     SELECT PK_ID,
                         READ_STATUS,
                         FK_BULLETION_ID,
                         FK_USER_ID
                     FROM T_BULLETIN_EVENT  where FK_USER_ID = '1' 
                 )T join T_BULLETIN_INFO I on I.PK_ID = T.FK_BULLETION_ID and I.STATUS = '0'
             )T1 join T_SYS_USER U on T1.FK_USER_ID=U.USER_ID             
      ) A ORDER BY A.READ_STATUS ASC, A.CALENDAR DESC
) B
WHERE Rownum >= 1
AND Rownum <= 10;
   
   
-- sql2:
SELECT *
  FROM (SELECT ROWNUM R, A.*
          FROM (SELECT T.PK_ID,
                       T.READ_STATUS,
                       T.FK_BULLETION_ID,
                       U.USER_NAME,
                       I.BULLETIN_TITLE,
                       I.CREATE_DATE CALENDAR,
                       I.STATUS
                  FROM T_BULLETIN_EVENT T, T_SYS_USER U, T_BULLETIN_INFO I
                 
WHERE U.USER_ID = T.FK_USER_ID
                   AND I.PK_ID = T.FK_BULLETION_ID
                   AND I.STATUS = '0'
                   and T.FK_USER_ID = '1' 
                 ORDER BY T.READ_STATUS ASC, I.CREATE_DATE DESC) A) B
 WHERE R >= 1
   AND R <= 10;我在执行计划里面看,两者的cost都是7!
问下,这2句sql,那个效率要高些啊?

解决方案 »

  1.   


    在plsql里面的执行计划里面看,两者的执行效率是cost值是一样的都是7.
      

  2.   

    大伙都给点意见啊,这样的sql语句,你们平常都是如何写的啊?
      

  3.   

    个人认为层数和效率没有必然联系。
    select * from (
    select * from (
    select * from (
    select * from tab)))和select * from tab 
    是一样的啊。只是从语句的可读性上,第二个更好。
      

  4.   

    个人认为:sql语句中不要出现*,而应该用具体的字段代替,尽量不用嵌套语句,性能也较好。三张表直接用关联不是很好的嘛,为何要用嵌套语句呢?避免全表扫描就ok了。
      

  5.   

    一样的,只不过一个用了join的写法,一个用了=
    用=的语法简洁
      

  6.   


    那2者的效率如何算呢?那个比较高,hebo2005平常用哪个啊?