我尝试使用参数创建视图以动态获取数据 (我不能使用WHERE条件,因为select语句本身会根据参数而改变)
为此,我编写了一个过程,它将所需的数据作为oracle对象类型返回。
FUNCTION get_data(p_pk_id NUMBER, p_tab_type VARCHAR2)
RETURN M_TYPE_DATA_TAB
AS
v_table_collection M_TYPE_DATA_TAB;
BEGIN
-- my sql query which will change based on the params
RETURN v_table_collection;
END;
我运行select查询,如下所示。
SELECT * FROM TABLE(get_data(12345, 'MYTAB'));
以小于1秒
提供数据。对于相同的select语句,我创建了一个视图
CREATE OR REPLACE VIEW my_view
AS SELECT * FROM TABLE(get_data(12345, 'MYTAB'));
如果我查询视图
SELECT * FROM my_view
超过6秒来获取相同的数据。
知道为什么查询相同数据会有很大的不同 这个视频会比正常查询花费更多时间吗?
答案 0 :(得分:2)
每个声明的执行计划将为您提供有关正在发生的事情的更多详细信息。尝试使用一些提供的oracle工具来调查每种情况下究竟发生了什么。
尝试做:
SELECT/*+gather_plan_statistics*/ * FROM TABLE(get_data(12345, 'MYTAB'));
然后做一个:
SELECT/*+gather_plan_statistics*/ * FROM my_view
这些将为您提供报表的实际执行计划。
顺便说一下,您需要在V_ $ SQL_PLAN和V_ $ SQL视图上选择以使用上面的gather_plan_statistics。
答案 1 :(得分:1)
Google提供“解释计划”,并检查两个声明的执行计划。没有完整的功能,很难说什么。但是我假设优化器在视图上做了一些“泛型优化”,当你从视图中选择时,会使用泛型优化。直接选择时,如果没有视图,优化程序也会考虑函数的内部结构。
尝试从视图中选择不同语句的解释计划。在每种情况下执行函数的“内部部分”是否相同?