我有一个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如何解决这个问题,我怎么能做同样的事情呢?
答案 0 :(得分:1)
不,Oracle不发送4,000个字节。让我们假设你真的假冒了Toad中的所有记录。所有Toad正在做的是获取记录并将它们打印到屏幕上的网格中?你的代码在做什么? SQL可以在同一时间运行,但是您的代码正在进行一些其他处理,这会增加时间。
要真正知道发生了什么,你需要做一两件事。
首先,执行SQLNet客户端跟踪。如果没有提供答案,则需要为您的会话执行服务器跟踪。