在分析生成的SQL语句时,我问自己,如果结果中的一列重复,它是否会消耗不必要的内存。该框架根据需要重复了一些列。这些值是通过索引访问的,所以如果这是一个真正的问题,应该加以解决。
所以,如果你确定,请提供你对这个问题的看法。
示例:
SELECT myTable.ID, myTable.Name, myTable.ID, myTable.name FROM MyTable myTable
与SELECT myTable.ID, myTable.Name FROM MyTable myTable
,还是内部实现了将每一列虚拟地映射到包含实值的单个特定列?
这个问题只针对Oracle12,因为它是我们正在使用的。
没有,事实上这很容易自己测试。
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确实会进行某种形式的压缩,但在某些情况下,当同一列在连续行中具有相同值时。例如
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
的另一个副本只会添加几个字节。)