最近两天学习优化. 有一个问题很困惑呀. 求各位大侠帮助.按照一般的解析顺序的说明,应该是
先FROM
再WHERE
再SELECT的那假设有多个关系的时候,用最差的情况是 FROM 做了两个关系的笛卡尔积。
按理说这个时候 已经解析了新关系的全部属性呀. 那么问题来了!用select * 和 用select 属性名的性能不是一样吗!!! 是你们在骗我嘛吗? 还是有别的梗我还不知道的.

解决方案 »

  1.   

    你在说解析属性还是说查询效率,笛卡尔积和属性有啥关系。select * 和 用select 属性名 ,性能差别基本上微乎及微,建议还是属性名,因为你写了*,如果字段变化了可能会导致程序报错。
      

  2.   


    又来看了下, 你是说写*的话, 解析出来的字段有变化,调用这段sql的程序会报错吧.但不写星的话,如果基表的字段名称变化, sql就报错啦... 结果不是一样的. 所有效果上也没区别呀...
    另外你说笛卡尔积和属性有啥关系,在看数据库系统概念的时候,有一个原理需要补充下.
    如果你的from语句后面跟两个表,举个例子。select * 
    from instructor,course;
    按照解析顺序应该是先求两个表的笛卡尔积,作为一个新表给输入给select 语句。
    情况应该是驱动表的所有列加上被驱动表的所有列,然后返回所有行,这就是新表了。
    这时再去看select的限定条件。
    这里*和 所有列名的性能应该是一致的, 因为按照上面来说, 不管是*还是所有列名,该做的解析在from语句那一步已经做了
    在这一步仅仅是展示筛选而已。
    所有优化的重点是from语句后面的表,而不是select语句是不是该写星。 这就是前两天的疑问。
    但是貌似现实中很少看到有人在from上做优化的,大部分都是直接写表名了。
      

  3.   

    用select * 和 用select 属性名的性能不是一样吗!!! 
    比如一共有 50 列,写 * 就是返回50 列, select col1, col2, col3 ,这个写法,都是写一部分列, 可能只是 10 列,也可能是 5 列,楼主可以用客户端返回不同的列数,看看响应时间,是不一样的,尤其是有 LOB 字段时,差距还是很大的。
      

  4.   

    嗯. 版主大人. 
    可能我上面没说的那么明白. 我想讨论的是同样的条件下.性能是不是一样.
    举个例子,比如一共有50列, *的话毫无疑问是返回50列,而我直接写50个列名当然也返回50列. 此时的性能应该是一致的吧.而且一开始的开贴子的原因在于,其实性能差距是在FROM语句造成的.而select 语句应该对最终语句执行时间的影响不大.
      

  5.   

    对于正常的SQL来讲(就是不理会笛卡尔积,或者出现BUG等情况),排除返回数据到客户端这个步骤,在数据库端,影响性能最大的是SQL执行计划,怎么样访问SQL中包含的对象,是走索引,还是走表扫描?是走nested loops,还是走hash join…… 当然,并发的高低也会影响整库的性能,从整库角度出发,单独语句执行时间比较低的SQL,在高并发的情况下,不一定单独执行时候执行时间较长的SQL好。