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