PL / SQL新手 - 返回多个结果集问题

时间:2011-03-17 19:52:18

标签: sql database oracle plsql oracle10g

好的 - 我在SQL Server方面有很广泛的背景,但之前我只是在Oracle中捣乱。好吧,push推进了,我需要创建一个相对复杂的查询。从本质上讲,它归结为T-SQL:

SELECT Col1 
INTO #tmpTable
FROM Table1
WHERE Col3 = @paramValue

SELECT Col1
FROM #tmpTable

SELECT OtherCol
FROM Table2
INNER JOIN #tmpTable 
  ON Table1.Col1 = Table2.fkCol1

这个序列的原因是因为对Table1的初始调用非常繁重(〜5s运行时),因为它是对我们的数据仓库的高度复杂的调用。我想在Table2的单独调用中返回结果,因为Table2中的每一个都可能有5-10条记录,这使得我的前端旋转变得更容易。

我知道我可以做到

SELECT Table1.Col1, Table2.OtherCol
FROM Table1
LEFT JOIN Table2 
  ON Table1.Col1 = Table2.fkCol1

然后重新规范化前端的数据(仅处理Col1的第一条记录,然后处理所有的OtherCol记录,直到我发现新的Col1)

我不是数据库专家,所以我不确定哪种方法更好。从开发的角度来看,第一种解决方案对我来说更容易消费。它(直觉)看起来更高效,因为一个人不必返回Table2耦合到Table2的“厚”结果。 Table1将返回~1200行,宽约2kb。表2显着更精简(约20字节宽)但有更多行(6000-12000)。

所以,最终我的问题是,哪个解决方案是PL / SQL环境中最好的解决方案,如果是第一个解决方案,最好的方法是什么?全局临时表/光标/子选择/什么?

3 个答案:

答案 0 :(得分:3)

我会使用加入。编码和读取更容易,并且应该比三个单独的选择更快。如果您只选择Col1,那么完整行的“厚度”并不重要。

答案 1 :(得分:1)

如果您担心性能,您应该只测试它并比较结果。我个人会选择加入解决方案。 Oracle将在幕后做它的事情,并可能提高你的性能。

您还应该查看执行计划以查询查询。我确信您的开发环境允许您快速查看执行计划。您的查询费用可以让您了解正在发生的事情,并帮助您做出决定。

答案 2 :(得分:0)

回应您对不知道如何实施第一个解决方案的评论:

procedure get_data(p_paramValue in varchar2, 
                  c_data1 out sys_refcursor,
                  c_data2 out sys_refcursor)
is
  v_tmptable in varchar2(30);
begin
  SELECT Col1 INTO v_tmpTable
  FROM Table1
  WHERE Col3 = p_paramValue;

  open c_data1 for 'SELECT Col1 FROM '||v_temptable;

  open c_data2 for
    'SELECT OtherCol FROM Table2 INNER JOIN '||v_tmpTable|| 
    ' ON Table1.Col1 = Table2.fkCol1'; 
end get_data;

假设Table1.Col1中的数据是可信的,因为两个游标都存在注入漏洞。