2011-12-30 3 views
1

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

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.Как к exec SP, как указано выше в C#; 2.Как принести origbulk в приложение 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

Что вы собираетесь делать с десятью миллионами чисел в C#, которые вы не можете сделать в PL/SQL? – APC

+0

@ APC, приложение C# должно отображать эти записи, поэтому я думаю, что сначала должен получить их в память приложения C#. У тебя есть какой-нибудь совет? – TiFang

+0

Почему бы вам просто не получить результаты запроса: 'SELECT origseq FROM Indicationinfo' –

ответ

0

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

SELECT A_COLUMN FROM MY_TABLE WHERE ROWNUM <= 100000 

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

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

+0

да, вы правы.Есть две цели: получить записи из БД. Первый из них отображает их, в соответствии с вашими советами и над другими, которые я буду размещать на этих записях, а затем отображать их. Во-вторых, мне нужно как можно скорее отправить Msgs (составленный origseq) в другое приложение (очень важная функция отправки) как вы сказали, узким местом является получение данных из db, поэтому я думаю, что мне нужно ускорить получение данных из БД, есть ли у вас какие-либо советы? – TiFang