У меня есть база данных 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 байт для каждой строки, оставляя клиенту возможность сократить их до нужной длины? Какой тогда смысл «var» в «varchar»? Кроме того, как Toad решает эту проблему и как я могу сделать то же самое?
Подробнее здесь:
https://stackoverflow.com/questions/142 ... or-each-ro