记一次数据库查询优化
前言
最近遇到一个导出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