具有29个Oracle varchar2列的表的性能

时间:2011-03-22 23:28:14

标签: oracle

对于我所处的奇怪情况的奇怪问题。

选择包含29个varchar(255)列的表的所有列时,是否存在明显的性能差异?

如果改为varchar(50),性能会提高吗?

如果重要的话,列中的大多数数据实际上少于30个字符。

2 个答案:

答案 0 :(得分:5)

取决于。

如果您只是在没有网络流量的PL / SQL块中查询数据,那么在两种情况下假设数据实际上都是相同的大小也无关紧要。如果将数据提取到PL / SQL变量中,您可以使用稍微多一点的PGA内存,但不太可能在性能方面产生任何明显的差异。

但是,如果您要通过网络获取数据,那么它可能会产生重大影响。许多驱动程序最终会根据结果集的潜在大小来分配空间(即255个字节或255个字符,具体取决于字符集,NLS_LENGTH_SEMANTICS和其他全球化的乐趣),这可能意味着你要分配5倍以上客户端计算机上的RAM不必要(这里“客户端计算机”可能指的是三层应用程序的中间层)。反过来,这最终会影响绩效。

根据您的用户名,我倾向于怀疑您使用的是Java和JDBC。如果您使用的是Type 4 JDBC驱动程序,我倾向于下注您只根据数据的实际大小来分配空间。另一方面,如果您正在使用JDBC-ODBC桥,我倾向于下注ODBC驱动程序根据列的最大大小分配空间。这显然取决于你正在使用的驱动程序 - 这是我个人受过教育的猜测,不是基于实际分析各种驱动程序的内存使用情况。

答案 1 :(得分:1)

29列乘以30个字符,每行少于1kB。在很多情况下,您最终可能会在数据库中使用1kB行而不会遇到性能问题。

由于性能取决于varchar列中存储的数据量,而不是列的最大大小,因此缩短列不会提高性能(除非你这样做时截断数据。)