在谓词推送中,优化器将相关谓词从包含的查询块“推送”到视图查询块。
对于未合并的视图,此技术改进了未合并视图的子计划。数据库可以使用推入谓词访问索引或用作过滤器。
例如,假设您创建一个表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
。该视图是通过使用UNION
set运算符的查询定义的,如下所示:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
目录