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




