好的 - 我在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环境中最好的解决方案,如果是第一个解决方案,最好的方法是什么?全局临时表/光标/子选择/什么?
答案 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中的数据是可信的,因为两个游标都存在注入漏洞。