最近两天学习优化. 有一个问题很困惑呀. 求各位大侠帮助.按照一般的解析顺序的说明,应该是
先FROM
再WHERE
再SELECT的那假设有多个关系的时候,用最差的情况是 FROM 做了两个关系的笛卡尔积。
按理说这个时候 已经解析了新关系的全部属性呀. 那么问题来了!用select * 和 用select 属性名的性能不是一样吗!!! 是你们在骗我嘛吗? 还是有别的梗我还不知道的.
先FROM
再WHERE
再SELECT的那假设有多个关系的时候,用最差的情况是 FROM 做了两个关系的笛卡尔积。
按理说这个时候 已经解析了新关系的全部属性呀. 那么问题来了!用select * 和 用select 属性名的性能不是一样吗!!! 是你们在骗我嘛吗? 还是有别的梗我还不知道的.
又来看了下, 你是说写*的话, 解析出来的字段有变化,调用这段sql的程序会报错吧.但不写星的话,如果基表的字段名称变化, sql就报错啦... 结果不是一样的. 所有效果上也没区别呀...
另外你说笛卡尔积和属性有啥关系,在看数据库系统概念的时候,有一个原理需要补充下.
如果你的from语句后面跟两个表,举个例子。select *
from instructor,course;
按照解析顺序应该是先求两个表的笛卡尔积,作为一个新表给输入给select 语句。
情况应该是驱动表的所有列加上被驱动表的所有列,然后返回所有行,这就是新表了。
这时再去看select的限定条件。
这里*和 所有列名的性能应该是一致的, 因为按照上面来说, 不管是*还是所有列名,该做的解析在from语句那一步已经做了
在这一步仅仅是展示筛选而已。
所有优化的重点是from语句后面的表,而不是select语句是不是该写星。 这就是前两天的疑问。
但是貌似现实中很少看到有人在from上做优化的,大部分都是直接写表名了。
比如一共有 50 列,写 * 就是返回50 列, select col1, col2, col3 ,这个写法,都是写一部分列, 可能只是 10 列,也可能是 5 列,楼主可以用客户端返回不同的列数,看看响应时间,是不一样的,尤其是有 LOB 字段时,差距还是很大的。
可能我上面没说的那么明白. 我想讨论的是同样的条件下.性能是不是一样.
举个例子,比如一共有50列, *的话毫无疑问是返回50列,而我直接写50个列名当然也返回50列. 此时的性能应该是一致的吧.而且一开始的开贴子的原因在于,其实性能差距是在FROM语句造成的.而select 语句应该对最终语句执行时间的影响不大.