【发布时间】:2013-12-30 20:26:06
【问题描述】:
我尝试使用参数创建视图以动态获取数据。
(我不能使用 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 * FROM TABLE(get_data(12345, 'MYTAB'));
这会在 不到 1 秒内为我提供数据。
对于相同的选择语句,我创建了一个视图
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 而不是索引。
标签: sql performance oracle view object-type