C# 优化SQL选择

C# 优化SQL选择,c#,sql,visual-studio-2010,performance,oracle11g,C#,Sql,Visual Studio 2010,Performance,Oracle11g,大家好,我使用visual studio和C#和oracle 11g数据库 我有一个应用程序,它有一个按钮,显示datagrid中按某个日期列排序的所有数据。问题是这需要太长的时间,20到30秒。我曾想过用SQL中的TOP限制搜索,但这不是一个理想的解决方案,所以我想知道你们是否可以帮忙 我的问题在于这种方法: public List<Adress> ListOprema() { string connectionString = "provider=ORAO

大家好,我使用visual studio和C#和oracle 11g数据库

我有一个应用程序,它有一个按钮,显示datagrid中按某个日期列排序的所有数据。问题是这需要太长的时间,20到30秒。我曾想过用SQL中的TOP限制搜索,但这不是一个理想的解决方案,所以我想知道你们是否可以帮忙

我的问题在于这种方法:

public List<Adress> ListOprema()
    {
        string connectionString = "provider=ORAOLEDB.ORACLE; data source=ORCL; password=****; user id=****;";
        oleCon = new OleDbConnection(connectionString);
        List<Adress> _adressStore = new List<Adress>();


        try
        {
            oleComd = new OleDbCommand();
            oleComd.Connection = oleCon;
            oleComd.CommandText = "Select Oprema.Opr_Id, Oprema.Naziv, Oprema.Datum_Nabavke, Oprema.Datum_Zaduzenja, Oprema.Dobavljac, Oprema.Jedinica_Mjere,"+
            " Oprema.Zaduzio, Oprema.Vrijednost, Oprema.Kolicina_Nabavna, Oprema.Kolicina_Otpisana, Oprema.Kolicina_Trenutna, Oprema.Status, Oprema.Konto, "+
            " Oprema.KontoIsp, Oprema.Broj_Naloga, Oprema.Sifra_Objekta, Oprema.Sifra_Prostora, Dobavljaci.Naziv AS DobNaz, Radnik.Rad_Prez, Objekti.Objekat_ID"+
            " from OPREMA Oprema, DOBAVLJACI Dobavljaci, RADNIK Radnik, OBJEKTI Objekti"+
            " WHERE Oprema.Dobavljac=Dobavljaci.Dob_Id(+) AND Oprema.Zaduzio=Radnik.Rad_Id(+) AND Oprema.Sifra_Objekta=Objekti.Objekat_ID(+)"+
            " ORDER BY Oprema.Datum_Nabavke DESC";
            oleCon.Open();
            OleDbDataReader Reader = oleComd.ExecuteReader();

           while (Reader.Read())
            {


                int ix = Reader.GetOrdinal("DATUM_NABAVKE");
                int iy = Reader.GetOrdinal("DATUM_ZADUZENJA");
                int sifra =Reader.GetOrdinal("SIFRA_OBJEKTA");
                int sifraP = Reader.GetOrdinal("SIFRA_PROSTORA");
                int zaduzio = Reader.GetOrdinal("ZADUZIO");
                int prezime = Reader.GetOrdinal("RAD_PREZ");
                _adressStore.Add(new Adress()
                //_adressStore.Add(Adress.GetFromDataReader(Reader));
                {




                    Naziv = Reader["NAZIV"].ToString(),


                    //DatumNabavke = Convert.ToDateTime(Reader["DATUM_NABAVKE"]),

                    DatumNabavke = Reader.IsDBNull(ix) ? DateTime.Now : Reader.GetDateTime(ix),

                    DatumZaduzenja = Reader.IsDBNull(iy) ? DateTime.Now : Reader.GetDateTime(iy),

                    //DatumZaduzenja = Convert.ToDateTime(Reader["DATUM_ZADUZENJA"]),

                    InventurniBroj = Convert.ToInt32(Reader["OPR_ID"]),

                    Dobavljac = Convert.ToInt32(Reader["Dobavljac"]),

                    JedinicaMjere = Reader["Jedinica_Mjere"].ToString(),

                    Zaduzio = Reader.IsDBNull(zaduzio) ? null : (int?)Reader.GetDecimal(zaduzio),

                    Vrijednost = Convert.ToDecimal(Reader["VRIJEDNOST"]),

                    KolicinaNabavna = Convert.ToInt32(Reader["KOLICINA_NABAVNA"]),

                    KolicinaOtpisana = Convert.ToInt32(Reader["KOLICINA_OTPISANA"]),

                    KolicinaTrenutna = Convert.ToInt32(Reader["KOLICINA_TRENUTNA"]),

                    Status = Reader["Status"].ToString(),

                    Konto = Convert.ToInt32(Reader["Konto"]),

                    KontoIsp = Convert.ToInt32(Reader["KontoIsp"]),

                    BrojNaloga = Reader ["Broj_Naloga"].ToString(),

                    SifraObjekta = Reader.IsDBNull(sifra) ? null : (int?)Reader.GetDecimal(sifra),

                    SifraProstora = Reader.IsDBNull(sifraP) ? null : (int?)Reader.GetDecimal(sifraP),

                    ImeZaduzioca = (string)((Reader["RAD_PREZ"] == DBNull.Value) ? null : Reader["RAD_PREZ"]),

                    ImeDobavljaca = Reader["DobNaz"].ToString(),

                    IsNew = false,

                    IsReadOnly = true
                });



            }

            oleCon.Close();
            //} 
            //oleCon.Close();
        }
        catch (Exception ex)
        {
            oleCon.Close();
            MessageBox.Show(ex.Message);
        }

        return _adressStore;
    }
一位朋友建议我在应用程序加载时填充所有可观察到的集合,然后搜索这些集合,但我不知道从哪里开始,还是个初学者


无论如何,我希望你们能帮上忙。

事实证明问题不在于SQL,而在于选项卡式视图和数据网格。他们似乎在一起打得不好。 切换到ListView使速度提高了60%。如果我打开一个新窗口,它会在不到一秒钟内完成。
谢谢大家的帮助。

我认为您可以通过在reader中使用数字索引以及使用适当的Get方法来提高阅读性能。例如reader.GetInt32(5),这样您就不必转换值,还可以使用存储过程和分页来限制数据量。此链接可能会让您对分页有所了解。我正在尝试分页,但网站上的文章是针对windows窗体的,我正在使用WPF,所以我尝试了,但是:ds=new DataSet();adp1=新的OleDbDataAdapter(cmd1);adp1.填写(ds,“Oprema”);dg.DataSource=ds;dg.DataMember=“Oprema”;这些行给我带来了问题,因为DataGrid中没有DataSource和DataMember属性(与DataGridView相比),所以我不知道如何将数据集绑定到ItemSource,因为它与DataGrid中的DataSource等效,但我无法将其设置为dataset。它给了我一个错误,无法隐式地将System.Data.DataTable转换为IEnumerable您是否缺少强制转换。请看一看
SELECT STATEMENT 
         22        

 SORT ORDER BY 
         22      972 

 NESTED LOOPS OUTER 
         20      972 

 HASH JOIN RIGHT OUTER 
         20      61 

 Access Predicates 

 OPREMA.ZADUZIO=RADNIK.RAD_ID 

 TABLE ACCESS FULL 
 RADNIK      5       16 

 HASH JOIN RIGHT OUTER 
         15      45 

 Access Predicates 

 OPREMA.DOBAVLJAC=DOBAVLJACI.DOB_ID 

 TABLE ACCESS FULL 
 DOBAVLJACI      3       7 

 TABLE ACCESS FULL 
 OPREMA      11      38 

 INDEX UNIQUE SCAN 
 OBJEKTI_PK      0       911 

 Access Predicates 

 OPREMA.SIFRA_OBJEKTA=OBJEKTI.OBJEKAT_ID