一个关于解析顺序的问题

lucklover 2017-07-25 10:11:21
最近两天学习优化. 有一个问题很困惑呀. 求各位大侠帮助.

按照一般的解析顺序的说明,应该是
先FROM
再WHERE
再SELECT的

那假设有多个关系的时候,用最差的情况是 FROM 做了两个关系的笛卡尔积。
按理说这个时候 已经解析了新关系的全部属性呀. 那么问题来了!

用select * 和 用select 属性名的性能不是一样吗!!!

是你们在骗我嘛吗? 还是有别的梗我还不知道的.
...全文
345 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2017-09-12
  • 打赏
  • 举报
回复
对于正常的SQL来讲(就是不理会笛卡尔积,或者出现BUG等情况),排除返回数据到客户端这个步骤,在数据库端,影响性能最大的是SQL执行计划,怎么样访问SQL中包含的对象,是走索引,还是走表扫描?是走nested loops,还是走hash join…… 当然,并发的高低也会影响整库的性能,从整库角度出发,单独语句执行时间比较低的SQL,在高并发的情况下,不一定单独执行时候执行时间较长的SQL好。
lucklover 2017-09-12
  • 打赏
  • 举报
回复
嗯. 版主大人. 可能我上面没说的那么明白. 我想讨论的是同样的条件下.性能是不是一样. 举个例子,比如一共有50列, *的话毫无疑问是返回50列,而我直接写50个列名当然也返回50列. 此时的性能应该是一致的吧. 而且一开始的开贴子的原因在于,其实性能差距是在FROM语句造成的.而select 语句应该对最终语句执行时间的影响不大.
引用 4 楼 wmxcn2000 的回复:
用select * 和 用select 属性名的性能不是一样吗!!! 比如一共有 50 列,写 * 就是返回50 列, select col1, col2, col3 ,这个写法,都是写一部分列, 可能只是 10 列,也可能是 5 列, 楼主可以用客户端返回不同的列数,看看响应时间,是不一样的,尤其是有 LOB 字段时,差距还是很大的。
lucklover 2017-07-30
  • 打赏
  • 举报
回复
引用 1 楼 sxq129601 的回复:
你在说解析属性还是说查询效率,笛卡尔积和属性有啥关系。select * 和 用select 属性名 ,性能差别基本上微乎及微,建议还是属性名,因为你写了*,如果字段变化了可能会导致程序报错。
又来看了下, 你是说写*的话, 解析出来的字段有变化,调用这段sql的程序会报错吧. 但不写星的话,如果基表的字段名称变化, sql就报错啦... 结果不是一样的. 所有效果上也没区别呀... 另外你说笛卡尔积和属性有啥关系,在看数据库系统概念的时候,有一个原理需要补充下. 如果你的from语句后面跟两个表,举个例子。 select * from instructor,course; 按照解析顺序应该是先求两个表的笛卡尔积,作为一个新表给输入给select 语句。 情况应该是驱动表的所有列加上被驱动表的所有列,然后返回所有行,这就是新表了。 这时再去看select的限定条件。 这里*和 所有列名的性能应该是一致的, 因为按照上面来说, 不管是*还是所有列名,该做的解析在from语句那一步已经做了 在这一步仅仅是展示筛选而已。 所有优化的重点是from语句后面的表,而不是select语句是不是该写星。 这就是前两天的疑问。 但是貌似现实中很少看到有人在from上做优化的,大部分都是直接写表名了。
卖水果的net 2017-07-30
  • 打赏
  • 举报
回复
用select * 和 用select 属性名的性能不是一样吗!!! 比如一共有 50 列,写 * 就是返回50 列, select col1, col2, col3 ,这个写法,都是写一部分列, 可能只是 10 列,也可能是 5 列, 楼主可以用客户端返回不同的列数,看看响应时间,是不一样的,尤其是有 LOB 字段时,差距还是很大的。
lucklover 2017-07-25
  • 打赏
  • 举报
回复
引用 1楼sxq129601 的回复:
你在说解析属性还是说查询效率,笛卡尔积和属性有啥关系。select * 和 用select 属性名 ,性能差别基本上微乎及微,建议还是属性名,因为你写了*,如果字段变化了可能会导致程序报错。
啊,当然是查询效率… 嗯 看来是一致的
sxq129601 2017-07-25
  • 打赏
  • 举报
回复
你在说解析属性还是说查询效率,笛卡尔积和属性有啥关系。select * 和 用select 属性名 ,性能差别基本上微乎及微,建议还是属性名,因为你写了*,如果字段变化了可能会导致程序报错。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧