支付中心數(shù)據(jù)結(jié)轉(zhuǎn)服務(wù)的邏輯是,將10天(可配置)前的數(shù)據(jù)結(jié)轉(zhuǎn)到備份表里。
db是MSSQLServer
T_PayApply表記錄數(shù):33,902,756
T_PayAppl表主鍵是payid,long型,自增。其payTime字段上沒有索引
有如下子方法,用來獲取數(shù)據(jù)表里10天前的最大記錄id,服務(wù)后續(xù)結(jié)轉(zhuǎn)小于此id的記錄。
private long GetMaxId()
{
string sqlMaxId = "select max(payid) from [dbo].[T_PayApply] NOLOCK where payTime <=@maxTime";
var sqlParam = new SqlParameter("@maxTime", SqlDbType.DateTime);
sqlParam.Value = threshold_of_upToDate;
var maxId = PayCenterSQLHelper.ExecuteScalar(sqlMaxId, sqlParam);
return maxId == DBNull.Value ? 0 : Convert.ToInt64(maxId);
}
執(zhí)行該方法,或單執(zhí)行sql語句,用時(shí)超過10秒。
嘗試將sql改變?yōu)槿缦?,?zhí)行發(fā)現(xiàn)更慢。
select top 1 payid from [dbo].[T_PayApply] NOLOCK where createdTime <'2017-10-7' order by payid desc
變通一下思路,將這個(gè)方法的邏輯稍加改變:
private long GetMaxId()
{
string sqlMaxId = "select top 1 payid from [dbo].[T_PayApply] NOLOCK where payTime >=@minTime";// order by payid
var sqlParam = new SqlParameter("@minTime", SqlDbType.DateTime);
sqlParam.Value = threshold_of_upToDate.AddDays(1);
var maxId = PayCenterSQLHelper.ExecuteScalar(sqlMaxId, sqlParam);
return maxId == null ? 0 : Convert.ToInt64(maxId) - 1;
}
則,方法的執(zhí)行時(shí)間在毫秒級(jí)。