在分析生成的SQL语句时,我问自己,如果结果中的列重复,它是否会消耗不必要的内存。该框架根据需要重复一些列。这些值是通过索引访问的,所以如果这是一个真正的问题,应该解决它。
因此,如果您确切知道,请就此问题提出您的意见。
示例:
SELECT myTable.ID, myTable.Name, myTable.ID, myTable.name FROM MyTable myTable
与之相比,此示例消耗的内存是两倍
SELECT myTable.ID, myTable.Name FROM MyTable myTable
或者是内部实现的,它会将每个列虚拟映射到包含实际值的单个特定列?
问题仅适用于Oracle 12,因为它正是我们正在使用的。
答案 0 :(得分:0)
它没有,这实际上很容易为自己测试。
SQL> create table foo(bar varchar2(4000));
Table created.
SQL> insert into foo(bar) values(rpad('x',4000,'x'));
1 row created.
SQL> commit ;
Commit complete.
SQL> set autotrace traceonly statistics
SQL> select bar from foo;
Statistics
----------------------------------------------------------
...
4549 bytes sent via SQL*Net to client
SQL> select bar,bar from foo;
Statistics
----------------------------------------------------------
...
8617 bytes sent via SQL*Net to client
SQL> select bar,bar,bar,bar from foo;
Statistics
----------------------------------------------------------
...
16765 bytes sent via SQL*Net to client
现在我从未见过这个实际上很重要的场景 - 上面的测试非常极端。
话虽这么说,Oracle确实做了某种形式的压缩,但是对于(某些)情况,当相同的列在连续的行中具有相同的值时。 e.g。
SQL> select bar from foo
union all select bar from foo
union all select bar from foo;
Statistics
----------------------------------------------------------
...
8608 bytes sent via SQL*Net to client
(添加bar
的另一个副本只会增加几个字节。)