c#:sql请求性能问题

c#:sql请求性能问题,c#,sql,performance,C#,Sql,Performance,我正在用c#访问数据库。现在,我必须使用从一些表中获得的数据进行一些计算,并将其写入其他现有表中。这在大多数情况下都非常有效,但对于复杂的操作,这需要花费大量的时间。现在我想知道什么是加速我的查询并获得结果的好方法。以下是我的工作: 我得到一个包含3个值的数据表(lom(唯一id)、laktanfang、laktende),其中包含大约700行 对于这个表中的每一行,我从另一个表中进行查询。这将导致另一个包含2个值的数据表(lom(唯一id)、behanddatum) 现在,我检查behandd

我正在用c#访问数据库。现在,我必须使用从一些表中获得的数据进行一些计算,并将其写入其他现有表中。这在大多数情况下都非常有效,但对于复杂的操作,这需要花费大量的时间。现在我想知道什么是加速我的查询并获得结果的好方法。以下是我的工作:

  • 我得到一个包含3个值的数据表(lom(唯一id)、laktanfang、laktende),其中包含大约700行
  • 对于这个表中的每一行,我从另一个表中进行查询。这将导致另一个包含2个值的数据表(lom(唯一id)、behanddatum)
  • 现在,我检查behanddatum的值是否在laktanfang和laktende之间-->是:将行添加到函数-->否:继续返回的数据表中
  • 最后,我必须从我的数据表中得到积极结果的数量
  • 下面是我目前使用的代码。我希望不要太混乱

    public DataTable HoleAbgeschlosseneLaktationenMitDiagnosen(DateTime daAnfang, DateTime daEnde, string[] stDiagnosen = null)
        {            
            DataTable dtRet = new DataTable();
            dtRet.Columns.Add("lom", typeof(string));
            dtRet.Columns.Add("laktanfang", typeof(DateTime));
            dtRet.Columns.Add("laktende", typeof(DateTime));
    
            DataTable dtAbgänge = HoleAbgängeVonEinzeltierZugang(daEnde, daAnfang);
            //Abgeschlossene Laktationen für abgegegangene Tiere
            foreach (DataRow dr in dtAbgänge.Rows)
            {
                if (dr != null)
                {
                    DateTime daAbgangsdatum = dr.Field<DateTime>("abgangsdatum");
                    string stLom = dr.Field<string>("lom");
                    DataTable dtKalbungVorAbgang = HoleLetzteKalbungFuerTier(stLom, daAbgangsdatum);
    
                    if (dtKalbungVorAbgang.Rows.Count > 0 && !dtKalbungVorAbgang.Rows[0].IsNull("kalbedatum"))
                    {
                        DateTime daKalbedatum = (DateTime)dtKalbungVorAbgang.Rows[0]["kalbedatum"];
                        int inLaktation = (int)dtKalbungVorAbgang.Rows[0]["laktation"];
    
                        if (PrüfeObDiagnoseInZeitraumAufgetreten(stLom, stDiagnosen, daKalbedatum, daAbgangsdatum) || stDiagnosen == null)
                        {
                            DataRow drLaktAbgang = dtRet.NewRow();
                            drLaktAbgang["lom"] = stLom;
                            drLaktAbgang["laktanfang"] = daKalbedatum;
                            drLaktAbgang["laktende"] = daAbgangsdatum;
                            dtRet.Rows.Add(drLaktAbgang);
                        }
    
                        if (daKalbedatum >= daAnfang && inLaktation > 1)
                        {
                            DataTable dtVorherigeKalbung = HoleLetzteKalbungFuerTier(stLom, daKalbedatum.AddDays(-1));
                            DateTime daVorhKalbung = (DateTime)dtVorherigeKalbung.Rows[0]["kalbedatum"];
    
                            if (dtVorherigeKalbung.Rows.Count > 0 && !dtVorherigeKalbung.Rows[0].IsNull("kalbedatum"))
                            {
                                if (PrüfeObDiagnoseInZeitraumAufgetreten(stLom, stDiagnosen, daKalbedatum, daAbgangsdatum) || stDiagnosen == null)
                                {
                                    DataRow drLaktVorhKalbung = dtRet.NewRow();
                                    drLaktVorhKalbung["lom"] = stLom;
                                    drLaktVorhKalbung["laktanfang"] = daVorhKalbung;
                                    drLaktVorhKalbung["laktende"] = daKalbedatum;
                                    dtRet.Rows.Add(drLaktVorhKalbung);
                                }
                            }
                        }
                    }
                }                
            }          
    
            DataTable dtKalbungen = HoleKalbungenFürLebendTiere(daEnde, daAnfang);
            //Abgeschlossene Laktationen für lebende Tiere
            foreach (DataRow dr in dtKalbungen.Rows)
            {
                DateTime daKalbedatumLetzte = dr.Field<DateTime>("kalbedatum");
                string stLom = dr.Field<string>("lom");
                int inLaktation = dr.Field<int>("laktation");
    
                if (inLaktation > 1)
                {
                    DataTable dtKalbungVorErster = HoleLetzteKalbungFuerTier(stLom, daKalbedatumLetzte.AddDays(-1));
    
                    if (!dtKalbungVorErster.Rows[0].IsNull("kalbedatum"))
                    {
                        DateTime daKalbedatum = (DateTime)dtKalbungVorErster.Rows[0]["kalbedatum"];
    
                        if (PrüfeObDiagnoseInZeitraumAufgetreten(stLom, stDiagnosen, daKalbedatum, daKalbedatumLetzte) || stDiagnosen == null)
                        {
                            DataRow drLaktKalbung = dtRet.NewRow();
                            drLaktKalbung["lom"] = stLom;
                            drLaktKalbung["laktanfang"] = daKalbedatum;
                            drLaktKalbung["laktende"] = daKalbedatumLetzte;
                            dtRet.Rows.Add(drLaktKalbung);
                        }                      
    
                        inLaktation = (int)dtKalbungVorErster.Rows[0]["laktation"];
    
                        if (daKalbedatum >= daAnfang && inLaktation > 1)
                        {
                            DataTable dtVorherigeKalbung = HoleLetzteKalbungFuerTier(stLom, daKalbedatum.AddDays(-1));
    
                            if (dtVorherigeKalbung.Rows.Count > 0 && !dtVorherigeKalbung.Rows[0].IsNull("kalbedatum"))
                            {
                                DateTime daVorhKalbung = (DateTime)dtVorherigeKalbung.Rows[0]["kalbedatum"];
    
                                if (PrüfeObDiagnoseInZeitraumAufgetreten(stLom, stDiagnosen, daVorhKalbung, daKalbedatum) || stDiagnosen == null)
                                {
                                    DataRow drLaktVorhKalbung = dtRet.NewRow();
                                    drLaktVorhKalbung["lom"] = stLom;
                                    drLaktVorhKalbung["laktanfang"] = daVorhKalbung;
                                    drLaktVorhKalbung["laktende"] = daKalbedatum;
                                    dtRet.Rows.Add(drLaktVorhKalbung);
                                }                                
                            }
                        }
                    }
                }                
            }
    
            return dtRet;
        }
    
        private bool PrüfeObDiagnoseInZeitraumAufgetreten(string stLom, string[] stDiagnosen, DateTime daAnfang, DateTime daEnde)
        {
            SqlCommand cmd = new SqlCommand();
            DataTable dtDiagnosenGefunden = new DataTable();
    
            cmd.CommandText = "SELECT diagnose " +
                              "FROM b_milch_hms_diagnose " +
                              "WHERE lom=@lom AND behanddatum >= @datumanfang AND behanddatum <= @datumende";
    
            if (stDiagnosen != null)
            {
                int i = 0;
    
                foreach (string st in stDiagnosen)
                {
                    if (st != "")
                    {
                        if (i == 0)
                            cmd.CommandText += " AND diagnose LIKE @gesuchte_diagnose" + i;
                        else
                            cmd.CommandText += " OR diagnose LIKE @gesuchte_diagnose" + i;
                        cmd.Parameters.AddWithValue("@gesuchte_diagnose" + i, st + "%");
                    }
    
                    i++;
                }
            }
    
            cmd.Parameters.AddWithValue("@lom", stLom);
            cmd.Parameters.AddWithValue("@datumanfang", daAnfang);
            cmd.Parameters.AddWithValue("@datumende", daEnde);
    
            dtDiagnosenGefunden = w_milch.FühreSqlAus(cmd);
            if (dtDiagnosenGefunden.Rows.Count > 0 && !dtDiagnosenGefunden.Rows[0].IsNull("diagnose"))
                return true;
    
            return false;
    
        }
    
    公共数据表HoleAbgeschLosseneLaktationInmitDiagnosen(DateTime daAnfang,DateTime daEnde,字符串[]stDiagnosen=null)
    {            
    DataTable dtRet=新的DataTable();
    添加(“lom”,typeof(string));
    添加(“laktanfang”,typeof(DateTime));
    添加(“laktende”,typeof(DateTime));
    数据表dtAbgänge=HoleAbgängeVonEinzeltierZugang(daEnde,daAnfang);
    //阿伯格施洛塞内莱克塔蒂奥宁für阿伯格冈内蒂埃酒店
    foreach(dtAbgänge.行中的数据行dr)
    {
    如果(dr!=null)
    {
    DateTime daAbgangsdatum=dr.Field(“abgangsdatum”);
    字符串stLom=dr.Field(“lom”);
    数据表dtKalbungVorAbgang=HoleLetzteKalbungFuerTier(stLom,DAABGANGDATA);
    如果(dtKalbungVorAbgang.Rows.Count>0&!dtKalbungVorAbgang.Rows[0].IsNull(“Kalbeatum”))
    {
    DateTime Dakalbedatam=(DateTime)dtKalbungVorAbgang.Rows[0][“kalbedatum”];
    int inLaktation=(int)dtKalbungVorAbgang.Rows[0][“laktion”];
    if(Prüfeobdiagnosinzeitraufgetreten(stLom,stDiagnosen,dakalbedatam,daabgangdatam)| | stDiagnosen==null)
    {
    DataRow drLaktAbgang=dtRet.NewRow();
    drLaktAbgang[“lom”]=stLom;
    DRLAKTABANG[“LAKTANANG”]=DAKALEDATAM;
    drLaktAbgang[“laktende”]=DAABGANGS数据;
    dtRet.Rows.Add(drLaktAbgang);
    }
    如果(Dakalbedatam>=daAnfang&&inLaktation>1)
    {
    数据表dtVorherigeKalbung=HoleLetzteKalbungFuerTier(stLom,Dakalbedatam.AddDays(-1));
    DateTime daVorhKalbung=(DateTime)dtvoherigeKalbung.Rows[0][“kalbedatum”];
    if(dtvorheigekalbung.Rows.Count>0&!dtvorheigekalbung.Rows[0].IsNull(“kalbedatum”))
    {
    if(Prüfeobdiagnosinzeitraufgetreten(stLom,stDiagnosen,dakalbedatam,daabgangdatam)| | stDiagnosen==null)
    {
    DataRow drlaktvorkalbung=dtRet.NewRow();
    drLaktVorhKalbung[“lom”]=stLom;
    Drlaktvorkalbung[“laktanfang”]=Davorkalbung;
    drLaktVorhKalbung[“laktende”]=Dakalbedatam;
    dtRet.Rows.Add(drLaktVorhKalbung);
    }
    }
    }
    }
    }                
    }          
    数据表dtKalbungen=HoleKalbungenFürLebendTiere(达恩德,达安房);
    //阿伯格施洛塞内莱班德蒂埃酒店
    foreach(dtKalbungen.Rows中的数据行dr)
    {
    DateTime daKalbedatumLetzte=dr.Field(“kalbedatum”);
    字符串stLom=dr.Field(“lom”);
    int inLaktation=dr.Field(“laktation”);
    如果(镶嵌>1)
    {
    数据表dtkalbungvorrster=HoleLetzteKalbungFuerTier(stLom,dakalbedatatumletzte.AddDays(-1));
    如果(!dtkalbungvorrster.Rows[0].IsNull(“kalbedatum”))
    {
    DateTime Dakalbedatam=(DateTime)dtkalbungvorrster.Rows[0][“kalbedatum”];
    if(Prüfeobdiagnosinzeitraufgetreten(stLom,stDiagnosen,dakalbedatam,dakalbedatatumletzte)| | stDiagnosen==null)
    {
    DataRow drLaktKalbung=dtRet.NewRow();
    drLaktKalbung[“lom”]=stLom;
    drLaktKalbung[“laktanfang”]=Dakalbedatam;
    drLaktKalbung[“laktende”]=Dakalbedatatumletzte;
    dtRet.Rows.Add(drLaktKalbung);
    }                      
    inLaktation=(int)dtkalbungvorrester.Rows[0][“laktation”];
    如果(Dakalbedatam>=daAnfang&&inLaktation>1)
    {
    数据表dtVorherigeKalbung=HoleLetzteKalbungFuerTier(stLom,Dakalbedatam.AddDays(-1));
    if(dtvorheigekalbung.Rows.Count>0&!dtvorheigekalbung.Rows[0].IsNull(“kalbedatum”))
    {
    DateTime daVorhKalbung=(DateTime)dtvoherigeKalbung.Rows[0][“kalbedatum”];
    if(Prüfeobdiagnosinzeitraufgetreten(stLom,stDiagnosen,daVorhKalbung,dakalbedatam)| | stDiagnosen==null)
    {
    DataRow drlaktvorkalbung=dtRet.NewRow();
    drLaktVorhKalbung[“lom”]=stLom;
    Drlaktvorkalbung[“laktanfang”]=Davorkalbung;
    drLaktVorhKalbung[“laktende”]=Dakalbedatam;
    
        _dtAbgänge.Rows.AsParallel().ForEach(dr=>
                                                  {
                                                      //do work
                                                  });