记一次数据库查询优化

前言

最近遇到一个导出Excel功能,突然就不好使了,排查错误日志时,发现错误日志:"达到了表达式服务限制。请在您的查询中查找潜在的复杂表达式,并尝试简化它们".

这一块导出的逻辑整体比较复杂,大体是先查询关联几个表,把大多需要的数据查询出来(这个数据量要小不少,千万级),在通过查询出来的Id关联另外一张表(这个表数据比较大,估计快亿级).


这个有问题的SQL,其实很简单.
SELECT OrderId,SN FROM Test WHERE OrderId IN (1,2,3) -- 这里的OrderId 太多了,


临时解决,就是改为分批查询.

List<int> idList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<object> resultList = new List<object>(idList.Count);
string formatSql = "SELECT OrderId,SN FROM Test WHERE OrderId IN ('{0}') ";
int pageSize = 3;
int totalPages = Math.Max((idList.Count + pageSize - 1) / pageSize, 1);
using (var connection = new SqlConnection("")) //使用Dapper
{                
    for (int i = 0; i < totalPages; i++)
    {
        var pageIds = idList.Skip(pageSize * i).Take(pageSize);
        string sql = string.Format(formatSql, string.Join("','", pageIds));
        //执行sql,将结果添加resultList
        resultList.AddRange(); //就不写了
    }
}


秋风 2023-09-27