Q1: 根据关系代数运算的优化规则,总是提倡再做连接操作之前尽量提早对关系进行选择和投影操作,以减少进一步操作需要进行处理的数据量。
---这是正确的,是优化的基本原则。属于逻辑优化方式中的基于启发式规则的优化。在逻辑优化阶段就完成“条件下推”以利于在执行器执行的时候能得到较少的数据参与连接操作。
Q2: 那如果要提早进行选择和投影操作的话似乎必须要引入子查询才能完成,然后才能把结果集传给后续的操作。
---这句话有错误。这句话可能有2种理解。
---第一种,进行选择和投影操作不会“引入子查询才能完成”。
---第二种,子查询是用户写在SQL语句中的,在这种情况下,优化器优先执行的子查询的消除,即子查询优化。
---如果子查询能被优化,则更好;如果子查询不能被优化,则SQL中存在子查询。不管原SQL中的子查询是否能被优化,都不影响选择和投影的执行.
---“然后才能把结果集传给后续的操作”,想要表达什么?
Q3: 但是根据课程上调优的原则又基本上建议是把子查询给消除,尽量用表连接的方式来代替,这样的话又如何利用关系代数的优化规则呢?
---可以在写SQL语句的时候,避免写带有子查询的SQL(假设语义允许的话)。
---表之间的连接方式,依然可以进行“选择和投影操作”的优化。如:
---SELECT a.col,b.col FROM a,b WHERE a.col=1 AND b.col=1;
---这样的SQL,因“a.col,b.col”可做投影,因“a.col=1 AND b.col=1”可推知a表上可提前做“a.col=1”且b表上可提前做“b.col=1”,这都是做选择操作的过滤。
---这是正确的,是优化的基本原则。属于逻辑优化方式中的基于启发式规则的优化。在逻辑优化阶段就完成“条件下推”以利于在执行器执行的时候能得到较少的数据参与连接操作。
Q2: 那如果要提早进行选择和投影操作的话似乎必须要引入子查询才能完成,然后才能把结果集传给后续的操作。
---这句话有错误。这句话可能有2种理解。
---第一种,进行选择和投影操作不会“引入子查询才能完成”。
---第二种,子查询是用户写在SQL语句中的,在这种情况下,优化器优先执行的子查询的消除,即子查询优化。
---如果子查询能被优化,则更好;如果子查询不能被优化,则SQL中存在子查询。不管原SQL中的子查询是否能被优化,都不影响选择和投影的执行.
---“然后才能把结果集传给后续的操作”,想要表达什么?
Q3: 但是根据课程上调优的原则又基本上建议是把子查询给消除,尽量用表连接的方式来代替,这样的话又如何利用关系代数的优化规则呢?
---可以在写SQL语句的时候,避免写带有子查询的SQL(假设语义允许的话)。
---表之间的连接方式,依然可以进行“选择和投影操作”的优化。如:
---SELECT a.col,b.col FROM a,b WHERE a.col=1 AND b.col=1;
---这样的SQL,因“a.col,b.col”可做投影,因“a.col=1 AND b.col=1”可推知a表上可提前做“a.col=1”且b表上可提前做“b.col=1”,这都是做选择操作的过滤。