数据库服务器提供对使用 ANSI 连接语法的子集的支持:
有关此 ANSI 连接语法的更多信息,请参阅 GBase 8s SQL 指南:语法。
如果在 ON 子句中对基础内表指定了连接过滤器,那么数据库服务器可在连接前和扫描内表数据的过程中应用该过滤器。ON 子句中基础从表的过滤器可提供以下附加性能优势:
有关在 ON 子句中对外表指定连接过滤器时所发生情况的信息,请参阅 GBase 8s SQL 指南:语法。
WHERE 子句中的过滤器可以减少数据库服务器需要扫描的行数,还减少返回给用户的行数。
术语连接后过滤器指的是这些 WHERE 子句过滤器。
执行使用符合 ANSI 的 LEFT OUTER 语法以用来指定连接表和嵌套循环连接的分发查询时,将查询发送到每个参与的数据库服务器以对这些服务器的本地表执行操作。
例如,演示数据库中的 customer 表和 cust_calls 表可以跟踪客户呼叫服务部门的情况。假设某个呼叫代码在过去出现多次,而您希望了解此类呼叫是否已减少。 要了解客户是否不再进行该呼叫代码的呼叫,可使用外连接列出所有客户。
图: ANSI 连接的 SET EXPLAIN ON 输出
QUERY: ------ SELECT c.customer_num, c.lname, c.company, c.phone, u.call_dtime, u.call_code, u.call_descr FROM customer c LEFT JOIN cust_calls u ON c.customer_num = u.customer_num ORDER BY u.call_dtime Estimated Cost: 14 Estimated # of Rows Returned: 29 Temporary Files Required For: Order By 1) virginia.c: SEQUENTIAL SCAN 2) virginia.u: INDEX PATH (1) Index Keys: customer_num call_dtime (Serial, fragments: ALL) Lower Index Filter: virginia.c.customer_num = virginia.u.customer_num ON-Filters:virginia.c.customer_num = virginia.u.customer_num NESTED LOOP JOIN(LEFT OUTER JOIN)
图: ANSI 连接中连接过滤器的 SET EXPLAIN ON 输出
QUERY: ------ SELECT c.customer_num, c.lname, c.company, c.phone, u.call_dtime, u.call_code, u.call_descr FROM customer c LEFT JOIN cust_calls u ON c.customer_num = u.customer_num AND u.call_code = 'I' ORDER BY u.call_dtime Estimated Cost: 13 Estimated # of Rows Returned: 25 Temporary Files Required For: Order By 1) virginia.c: SEQUENTIAL SCAN 2) virginia.u: INDEX PATH Filters: virginia.u.call_code = 'I' (1) Index Keys: customer_num call_dtime (Serial, fragments: ALL) Lower Index Filter: virginia.c.customer_num = virginia.u.customer_num ON-Filters:(virginia.c.customer_num = virginia.u.customer_num AND virginia.u.call_code = 'I' ) NESTED LOOP JOIN(LEFT OUTER JOIN)
Estimated # of Rows Returned 行中的值只是估计值,并不总是反映实际返回的行数。 由于有附加过滤器,图 2 中的样本查询返回的行比图 1 中的查询返回的要少。
图: ANSI 连接中 WHERE 子句过滤器的 SET EXPLAIN ON 输出
QUERY: ------ SELECT c.customer_num, c.lname, c.company, c.phone, u.call_dtime, u.call_code, u.call_descr FROM customer c LEFT JOIN cust_calls u ON c.customer_num = u.customer_num AND u.call_code = 'I' WHERE c.zipcode = "94040" ORDER BY u.call_dtime Estimated Cost: 3 Estimated # of Rows Returned: 1 Temporary Files Required For: Order By 1) virginia.c: INDEX PATH (1) Index Keys: zipcode (Serial, fragments: ALL) Lower Index Filter: virginia.c.zipcode = '94040' 2) virginia.u: INDEX PATH Filters: virginia.u.call_code = 'I' (1) Index Keys: customer_num call_dtime (Serial, fragments: ALL) Lower Index Filter: virginia.c.customer_num = virginia.u.customer_num ON-Filters:(virginia.c.customer_num = virginia.u.customer_num AND virginia.u.call_code = 'I' ) NESTED LOOP JOIN(LEFT OUTER JOIN) PostJoin-Filters:virginia.c.zipcode = '94040'