Sql server Payment.PayModeId为[PaymentPayModeId],-用于更新的直通 Payment.StdLedgerId作为[PaymentStdLedgerId],-用于更新的传递 a.RegNo分区上的行数 按a.CenterId、a.Rec
Payment.PayModeId为[PaymentPayModeId],-用于更新的直通 Payment.StdLedgerId作为[PaymentStdLedgerId],-用于更新的传递 a.RegNo分区上的行数 按a.CenterId、a.RecptKey、a.LedgerDate作为[RownumingGroup]排序 来自大众汽车付款分类账匹配工具a 内部联接支付 ON Payment.RegNo=a.RegNo 其中ABSa.BaseAmount介于abs和payment.BaseAmount之间-5 和ABSPayment.BaseAmount+5 和ISNULLa.RefInstNo,0=0 和a.INSTO型 CASTa.StdLedgerID为VARCHAR10+CASTa.InstNo为VARCHAR1 不在 选择CASTb.RefStdLedgerID作为VARCHAR10+ CASTb.RefInstNo AS VARCHAR1 来自大众汽车付款分类账匹配工具b 其中b.RegNo=Payment.RegNo 和b.付款之间的基本金额。基本金额-5 和付款。基本金额+5 和b.InstType=O 按a.CenterId、a.RecptKey、a.LedgerDate排序 更新upd 设置upd.RefInstNo=分类帐.InstNo, upd.refstdlegrid=Ledger.stdlegrid, upd.RefPayModeId=Ledger.PayModeId, upd.REF特许权=分类账特许权, upd.reflumpseash=Ledger.lumpseash, upd.RefConcessionDtl=分类账.ConcessionDtl, upd.RefLumpsumpDtl=Ledger.LumpsumpDtl 从'+@UpdateTable+N'upd 内部联接分类账 在分类账上.PaymentStdLedgerId=upd.StdLedgerId 和Ledger.PaymentPayModeId=upd.PayModeId 其中,[RowNumInGroup]=1-确保与游标中的TOP 1行为相同 '; EXEC@SQL;Sql server Payment.PayModeId为[PaymentPayModeId],-用于更新的直通 Payment.StdLedgerId作为[PaymentStdLedgerId],-用于更新的传递 a.RegNo分区上的行数 按a.CenterId、a.Rec,sql-server,performance,sqlclr,Sql Server,Performance,Sqlclr,Payment.PayModeId为[PaymentPayModeId],-用于更新的直通 Payment.StdLedgerId作为[PaymentStdLedgerId],-用于更新的传递 a.RegNo分区上的行数 按a.CenterId、a.RecptKey、a.LedgerDate作为[RownumingGroup]排序 来自大众汽车付款分类账匹配工具a 内部联接支付 ON Payment.RegNo=a.RegNo 其中ABSa.BaseAmount介于abs和payment.Bas
可能是因为您正在运行两个嵌套循环,它们不是通过上下文连接发出SQL查询,而且这些查询没有参数化。看起来您将受益于广泛的SQL Server最佳实践和性能教程。@usr在支付时只有一个循环。读取对于大表中的每一行,您将执行另外两个查询。这就是200000个查询,其中一半是更新。而且对大型表的更新成本很高,尤其是在有索引的情况下。除了srutzky的出色回答之外,在更新之前,将索引放在更新的表上。并在更新完成后重新创建它们。
var paymentSql =String.Format("select PaymodeId,StdLedgerId,BaseAmount,RegNo/*,REfInstno,RefStdLedgerId,RefPaymodeId*/ from vw_Payment_Ledger_Matching_Other {0} {1}" ,(condition.Equals("") ? "" : " where " + condition) ," order by CenterId,Ledgerdate,RecptKey ");
var payment = new SqlCommand(paymentSql, conn1) { CommandTimeout = 600 };
using (SqlDataReader payments = payment.ExecuteReader())
{
while (payments.Read())
{
var paymentPaymodeId = payments["PaymodeId"];
var paymentStdLedgerId = payments["StdLedgerId"];
var paymentAmount = payments["BaseAmount"];
var paymentRegNo = payments["RegNo"];
//var paymentRefInstNo = payments["RefInstNo"];
//var paymentRefStdLedgerId = payments["RefStdLedgerId"];
//var paymentRefPayModeId = payments["RefPayModeId"];
//if (Convert.ToInt32(paymentRefInstNo) == 0 && Convert.ToInt32(paymentRefStdLedgerId) == 0 && paymentRefPayModeId.Equals("0"))
{
var ledgerSql = String.Format("select paymodeId,StdLedgerId,Instno,Concession,LumpSump,ConcessionDtl,LumpSumpDtl from vw_Payment_Ledger_Matching_inst a where a.regno='{0}' and abs(a.BaseAmount) between abs({1})-5 and abs({1})+5 and Isnull(a.refInstno,0)=0 and a.insttype<>'O'" +
"and (cast(a.StdLedgerID as varchar(10))+cast(InstNo as varchar(1))) not in ( select cast(b.refStdLedgerID as varchar(10))+cast(b.refInstNo as varchar(1)) from vw_Payment_Ledger_Matching_inst b"
+" where b.regno='{0}' and (b.BaseAmount) between ({1})-5 and ({1})+5 and b.Insttype='O' )"
+" order by a.CenterId,a.RecptKey,a.LedgerDate ",paymentRegNo,paymentAmount );
var Ledger = new SqlCommand(ledgerSql, conn2) { CommandTimeout = 600 };
SqlDataReader ledger = Ledger.ExecuteReader();
if (ledger.Read())
{
var ledgerPayModeId = ledger["PayModeID"];
var ledgerStdLedgerId = ledger["StdLedgerId"];
var ledgerInstNo = ledger["InstNo"];
var ledgerConcession = ledger["Concession"];
var ledgerLumpsump = ledger["Lumpsump"];
var ledgerConcessionDtl = ledger["ConcessionDtl"];
var ledgerLumpsumpDtl = ledger["LumpsumpDtl"];
var updatesql = "update " + updateTable + " set RefInstno=" + ledgerInstNo
+ ", RefStdLedgerId=" + ledgerStdLedgerId + ""
+ ", RefPayModeId='" + ledgerPayModeId + "'"
+ ", RefConcession=" + ledgerConcession
+ ", RefLumpsump=" + ledgerLumpsump
+ ", RefConcessionDtl=" + ledgerConcessionDtl
+ ", RefLumpsumpDtl=" + ledgerLumpsumpDtl
+ " where stdLedgerId=" + paymentStdLedgerId
+ " and PayModeId='" + paymentPaymodeId + "'";
var ledgerUpdate = new SqlCommand(updatesql, conn3);
ledgerUpdate.ExecuteNonQuery();
}
}
}
}
For each record in Query A
{
Get a row from Query B
Update a table via Query C, using the row from Query B
}