2

我有一个 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 的数据提供程序库,结果相同。

这里发生了什么 ?Oracle - 正如我所怀疑的那样 - 真的为每行发送 4000 个字节,让客户端将它们削减到正确的长度吗?那么“varchar”中的“var”有什么意义呢?另外,Toad 是如何解决这个问题的,我该如何做同样的事情?

4

1 回答 1

1

不,Oracle 没有发送 4,000 字节。假设您确实在假脱机 Toad 中的所有记录。Toad 所做的只是获取记录并将它们打印到屏幕上的网格中?你的代码在做什么?SQL 可能同时运行,但您的代码正在执行其他一些增加时间的处理。

要真正了解发生了什么,您需要做一两件事。

首先,进行 SQLNet 客户端跟踪。如果这不能提供答案,您需要为您的会话进行服务器跟踪。

于 2013-01-09T20:25:45.753 回答