數(shù)據(jù)結(jié)轉(zhuǎn)性能優(yōu)化,效果明顯到不解釋!

支付中心數(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í)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容