Oracle客户端似乎正在为每一行传输所有4000个varchar字符

时间:2013-01-09 19:43:39

标签: c# .net sql oracle

我有一个Oracle数据库,我通过一个有点慢的网络链接连接到该数据库。在那里,我有一个简单的表,类似于这个:

create table EMPLOYEES (
    employee_id INTEGER PRIMARY KEY,
    first_name VARCHAR2(4000)
);

我正在使用一个相当无聊的查询从中检索所有行:

select employee_id, first_name from EMPLOYEES

到目前为止一切顺利。但是,我注意到当我要求Toad导出该查询产生的所有行时,大约需要4秒钟。在我的.NET应用程序中,需要130秒。经过一段时间的黑客攻击后,我注意到FIRST_NAME列中最长的值是50个字符,所以我改变了我的查询,如下所示:

select employee_id, substr(first_name, 1, 50) from EMPLOYEES

现在,Toad和我的C#/ .NET程序都非常快。我使用Microsoft和Oracle的数据提供程序库尝试了这一点,结果相同。

这里发生了什么?甲骨文 - 正如我怀疑的那样 - 真的每行发送4000个字节,留给客户端将它们缩减到合适的长度吗?那么“varchar”中的“var”有什么意义呢?另外,Toad如何解决这个问题,我怎么能做同样的事情呢?

1 个答案:

答案 0 :(得分:1)

不,Oracle不发送4,000个字节。让我们假设你真的假冒了Toad中的所有记录。所有Toad正在做的是获取记录并将它们打印到屏幕上的网格中?你的代码在做什么? SQL可以在同一时间运行,但是您的代码正在进行一些其他处理,这会增加时间。

要真正知道发生了什么,你需要做一两件事。

首先,执行SQLNet客户端跟踪。如果没有提供答案,则需要为您的会话执行服务器跟踪。