【问题标题】:C# How to get all data in Oracle databaseC#如何获取Oracle数据库中的所有数据
【发布时间】:2017-06-21 01:24:44
【问题描述】:

我在 Oracle 11g 中有 21 个表,我需要使用 JOIN 子句来显示它们。但是查询太慢了,抛出了System.OutOfMemoryException

我当前的代码:

   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. 如何提高查询执行性能?

【问题讨论】:

  • 您希望从数据库返回多少行?
  • 每个表大约有 150,000 行。将添加更多数据
  • 为什么需要一次获取所有数据?
  • 你有更好的主意吗?我想一次探索所有数据。我应该使用分页吗?示例:一页 10,000 行
  • 将它们导出到什么位置?一份文件?您无需一次将所有数据加载到内存中。

标签: c# sql database oracle


【解决方案1】:

您可以查看关键字段上的索引以加快查询速度,但如果您返回很多行,您将在某处遇到一些内存上限。

如果可以的话,我建议实现一些分页:Paging with Oracle

这将让您恢复较小的数据块,使其更快且不太可能达到任何内存限制。

【讨论】:

  • 您好,我尝试了您的建议“使用 Oracle 进行分页”,但仍然给我这个错误:System.OutofMemory
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2017-11-04
  • 2016-08-08
  • 1970-01-01
相关资源
最近更新 更多