2017-06-21 259 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

相关问题