Вызов Oracle SP с TableAdapter очень медленный - PullRequest
3 голосов
/ 09 декабря 2008

У меня есть запрос, который выполняется очень быстро при выполнении в редакторе SQL (оракул): 1 мс.

Тот же запрос (как и хранимая процедура) при выполнении DataSet-TableAdapter занимает 2 секунды. Я просто получаю 20 строк.

Поскольку я использую TableAdapter, возвращаемые значения сохраняются в указателе ссылки.

Если бы я выбирал 2 000 строк, я мог бы понять, что для построения DataSet требуется некоторое время, но 2 секунды только для 20 строк кажутся мне слишком большими.

Есть лучший способ выполнить SP на Oracle или это единственный способ? Что я мог попытаться сделать, чтобы улучшить выступления?

Спасибо за вашу помощь!


Поиск в гугле, похоже, проблема с рефкурсором. Другие люди сталкивались с той же проблемой производительности, но решения не было предоставлено.

Ответы [ 4 ]

2 голосов
/ 10 декабря 2008

Каким провайдером данных вы пользуетесь?

Вы ссылаетесь на System.Data.OracleClient или используете odp.net (поставщик данных Oracle для соединения приложений .NET с Oracle) или используете поставщика devart (ранее известного как corelab).

У меня хороший опыт работы с odp.net в сочетании с Oracle 9. Вы можете бесплатно скачать odp.net на сайте оракула. Смотри: http://www.oracle.com/technology/tech/windows/odpnet/index.html

Вы можете использовать последнюю версию (11.1.0.6.20) для подключения к базе данных Oracle 9.

0 голосов
/ 12 декабря 2008

Хорошо. Я нашел в чем проблема.

Сначала я думал, что это проблема DataProvided, но это не так. Я обнаружил ту же проблему в SQLServer 2000 ....

Поиск в гугле Я кое-что узнал о плане выполнения. Поступив таким образом, я увеличил производительность запросов на 50%.

Краткое резюме проблемы заключается в том, что при выполнении SP по коду СУБД имеет некоторые проблемы с планом выполнения и не использует индексы ...

Лучший ответ в этом посте: Анализ параметров (или спуфинг) в SQL Server

Надеюсь, это поможет вам.

0 голосов
/ 10 декабря 2008

Убедитесь, что вы устанавливаете CommandType на CommandType.StoredProcedure.

Например (от MSDN ):

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "COUNT_JOB_HISTORY";
cmd.CommandType = CommandType.StoredProcedure;
0 голосов
/ 09 декабря 2008

Сколько времени занимает использование устройства чтения данных вместо TableAdaptor? Я бы попробовал datareader. Я никогда не сталкивался с проблемами с устройством чтения данных.

...