Массовый сбор из Oracle и заполнение DataTable в C # - PullRequest
1 голос
/ 30 декабря 2011

В моем проекте мне нужно получить более 10 000 000 записей из базы данных Oracle для повышения эффективности.Я пишу SP и использую BULK COLLECT, BULK COLLECT быстро выбирается, не так ли?Ниже приведена процедура:

create or replace type type_bulk as TABLE OF number(10);
/
create or replace PROCEDURE getbulk(returns OUT type_bulk) 
is
BEGIN
SELECT origseq BULK COLLECT
   INTO returns
   FROM Indicationinfo;
end;
/

Затем я могу выполнить SP, как показано ниже в PL / SQL:

declare
    origbulk type_bulk;
begin
    getbulk(returns => origbulk);
    dbms_output.put_line(origbulk.count);
end;

Работает нормально.

origbulk - это таблица (или массив).Итак, вопрос:

1.Как выполнить SP, как указано выше в C #;2.Как извлечь оригбулк в приложение C #;

Я пытаюсь сделать это, как показано ниже (я использую драйвер OleDb, а поставщик - "OraOLEDB.Oracle.1")

 string commText = 
"DECLARE ? type_bulk;\n" + 
"BEGIN\n" + 
"getbulk(returns => ?);\n" + 
"END;"; //here is right?
 myAccessCommand = new OleDbCommand(commText, myAccessConn);
 myAccessCommand.CommandType=CommandType.Text;
 OleDbParameter pout = new OleDbParameter("origseqbulk", ???what type, no OleDbType.Array, 10);

Есть совет?Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 декабря 2011

Re: advice - считывание 10 миллионов строк данных в память не является способом «более эффективного».Это будет очень медленно, потому что базе данных потребуется время, чтобы вернуть 10-метровые строки, и потому, что потребуется еще много времени (и много памяти), чтобы втиснуть эти значения в элемент управления, если вы этим занимаетесь.Чтобы дать вам представление о том, что я имею в виду, я просто прочитал 100 тысячу строк из одной из наших больших таблиц и обнаружил, что это заняло около 26 секунд.Ничего сложного, просто

SELECT A_COLUMN FROM MY_TABLE WHERE ROWNUM <= 100000

ОК, это один процент от ваших 10 миллионов строк.Теперь я никогда не буду утверждать, что наша база данных обладает высокой производительностью, но если она представляет вашу ситуацию и если время доступа линейно масштабируется, это займет что-то порядка 40 минут или около того, чтобы прочитать ваши 10 миллионов строк.Я полагаю, что если это большой пакетный процесс, возможно, все будет в порядке.С другой стороны, если у вас есть пользователь, ожидающий увидеть некоторые данные, он, вероятно, сдастся до того, как эти данные появятся на его экране.

Поделитесь и наслаждайтесь.

...