暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 谓词推送

原创 Asher.HU 2021-02-04
362


谓词推送中,优化器将相关谓词从包含的查询块“推送”到视图查询块。

对于未合并的视图,此技术改进了未合并视图的子计划。数据库可以使用推入谓词访问索引或用作过滤器。

例如,假设您创建一个表hr.contract_workers,如下所示:

DROP TABLE contract_workers;
CREATE TABLE contract_workers AS (SELECT * FROM employees where 1=2);
INSERT INTO contract_workers VALUES (306, 'Bill', 'Jones', 'BJONES',
  '555.555.2000', '07-JUN-02', 'AC_ACCOUNT', 8300, 0,205, 110);
INSERT INTO contract_workers VALUES (406, 'Jill', 'Ashworth', 'JASHWORTH', 
  '555.999.8181', '09-JUN-05', 'AC_ACCOUNT', 8300, 0,205, 50);
INSERT INTO contract_workers VALUES (506, 'Marcie', 'Lunsford', 'MLUNSFORD', 
  '555.888.2233', '22-JUL-01', 'AC_ACCOUNT', 8300, 0,205, 110);
COMMIT;
CREATE INDEX contract_workers_index ON contract_workers(department_id);
复制

您创建一个引用employees的视图contract_workers该视图是通过使用UNIONset运算符的查询定义的,如下所示:

CREATE VIEW all_employees_vw AS
  ( SELECT employee_id, last_name, job_id, commission_pct, department_id
    FROM   employees )
  UNION
  ( SELECT employee_id, last_name, job_id, commission_pct, department_id
    FROM   contract_workers );
复制

然后,您查询视图,如下所示:

SELECT last_name
FROM   all_employees_vw
WHERE  department_id = 50;
复制

因为视图是一个UNION集合查询,所以优化器无法将视图的查询合并到访问查询块中。相反,优化器可以通过将其谓词(WHERE子句条件)department_id=50送到视图的UNION集合查询中来转换访问语句等效的转换查询如下:

SELECT last_name
FROM   ( SELECT employee_id, last_name, job_id, commission_pct, department_id
         FROM   employees
         WHERE  department_id=50
         UNION
         SELECT employee_id, last_name, job_id, commission_pct, department_id
         FROM   contract_workers
         WHERE  department_id=50 );
复制

转换后的查询现在可以在每个查询块中考虑索引访问。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录