2017-06-21 181 views
0

我在Oracle 11g中有21個表,我需要使用JOIN子句顯示它們。但查詢速度太慢引發System.OutOfMemoryExceptionC#如何獲取Oracle數據庫中的所有數據

我當前的代碼:

try 
     { 
      //string ConString; 
      using (OracleConnection con = new OracleConnection(ConString)) 
      { 
       //string query = "SELECT PAX.CREATION_DATE,PAX.PNR,PAX.PAX_NMBR,PAX.UPDATE_LEVEL_MOD,PAX.PAX_NAME,PAX.CHANGE_OR_CANCEL_IND,PAX_SEATS.LEG_NMBR,PAX_SEATS.INSTANCE_NMBR,pax_seats.ssr_cd,pax_seats.carrier_cd,pax_seats.seat_nmbr,pax_seats.previous_status_codes FROM PAX INNER JOIN PAX_SEATS ON PAX.PNR = PAX_SEATS.PNR"; 
       string query1 = "SELECT PNR FROM HISTORY_LEGS"; 
       string query2 = "SELECT PAX.CREATION_DATE,PAX.PNR,PAX.PAX_NMBR,PAX.UPDATE_LEVEL_MOD,PAX.PAX_NAME,PAX.CHANGE_OR_CANCEL_IND,PAX_SEATS.LEG_NMBR,PAX_SEATS.INSTANCE_NMBR,pax_seats.ssr_cd,pax_seats.carrier_cd,pax_seats.seat_nmbr,pax_seats.previous_status_codes,PAX_SSRS.SSR_NMBR,PAX_TKT.TKTNMBR,PAX_TKT.ISSUING_AIRLINE, PAX_TKT.ISSUING_OFFC_NMBR, PAX_TKT.ISSUING_COUNTER_CD, PAX_TKT.ISSUING_AGNT_NMBR, PAX_TKT.TKT_IND, PAX_TKT.TKT_STATUS, PAX_TKT.TARIFICATION_IND,PAX_TKT.S_IND,PAX_TKT.ISSUANCE_DATE FROM PAX INNER JOIN PAX_SEATS ON PAX.PNR = PAX_SEATS.PNR RIGHT JOIN PAX_SSRS ON PAX.PNR = PAX_SSRS.PNR RIGHT JOIN PAX_TKT ON PAX.PNR = PAX_TKT.PNR"; 
       //string query4 = "SELECT * FROM PAX"; 
       //string query3 = "SELECT PAX.PAX_NMBR,PAX.PAX_NAME,RES_LEGS.ARNK_IND,RES_LEGS.CARRIER_CD1,RES_LEGS.CARRIER_CD2,RES_LEGS.FLT_NMBR,RES_LEGS.CLASS_CD,RES_LEGS.DAY_OF_WEEK,RES_LEGS.FLT_DATE,RES_LEGS.LEG_ORIGIN_CD,RES_LEGS.LEG_DES_CD,RES_LEGS.CURRENT_STATUS_CD,RES_LEGS.NUMBER_IN_PARTY,RES_LEGS.DP_TIME,RES_LEGS.AR_TIME,RES_LEGS.DATE_CHANGE_IND,RES_LEGS.FLT_IRREGULARITY_IND,RES_LEGS.LEG_TXT,RES_LEGS.PREVIOUS_STATUS_CODES,RES_LEGS.MESSAGE FROM RES_LEGS INNER JOIN PAX ON RES_LEGS.PNR = PAX.PNR"; 
       OracleCommand cmd = new OracleCommand(query2, con); 
       OracleDataAdapter oda = new OracleDataAdapter(cmd); 
       DataSet ds = new DataSet(); 
       oda.Fill(ds); 
       //dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; 
       //dataGridView1.RowHeadersVisible = false; 
       if (ds.Tables.Count > 0) 
       { 
        dataGridView1.DataSource = ds.Tables[0].DefaultView; 
       } 

      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

問題:

  1. 如何獲得的所有數據?
  2. 如何防止System.OutofMemory?
  3. 如何加快查詢執行的性能?
+1

您希望從數據庫中返回多少行? – LordBaconPants

+0

每張桌子大約有150,000行。更多數據將被添加 – Sambuu

+0

爲什麼你需要一次獲得所有數據? – mason

回答

0

您可以查看關鍵字段上的索引以加快查詢的速度,但是如果您得到很多行,您會在某處找到一些內存上限。

如果可以的話,我會建議實施一些分頁:Paging with Oracle

這樣可以讓您恢復更小的數據塊,使其更快,更不可能達到任何內存限制。

+0

謝謝你回覆,我會嘗試與Oracle分頁 – Sambuu

+0

你好,我試過你的建議「與Oracle分頁」,仍然給我這個錯誤:System.OutofMemory – Sambuu

相關問題