我试图创建视图的参数来动态获取数据。
查询查询运行速度比直接查询慢 - 在Oracle
对于这一点,我写了返回我所需要的数据,Oracle对象类型的程序(WHERE条件的select语句本身的变化基于参数我不能使用)。
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秒获得相同的数据。
任何想法为什么有这么大的差异来查询相同的数据。
请问veiw比普通查询需要更多时间吗?
一个完全可重复的测试案例在这里会有很大的帮助。通常只要在某个东西上添加'select * from'就没有关系。我们需要确切知道它是什么使你的案例变得特别。 –
@jonearles:正如Guntram Blohm所说,当我从视图查询时,它正在执行全表扫描,其中直接查询使用基表的所有索引来更快地获取数据。 –
这很有帮助,但我们还没有找到问题的根源。我想知道*为什么*它使用FTS而不是索引。 –