发现一个 SQL 语句执行时 scan count 非常高:
Table 'blog_Site_Links'. Scan count 13984, logical reads 44601
SQL 语句如下:
SELECT bc.*
FROM blog_Content bc WITH(NOLOCK)
INNER JOIN blog_Site_Links bl WITH(NOLOCK) ON bc.ID=bl.EntryID AND bl.IsActive=1 AND bl.CategoryID=@CategoryID
WHERE bc.DateAdded>@StartDate
ORDER BY bc.DateAdded DESC
请问如何优化?
注:用的是 SQL Server 2016 。
如果只是查询bc结果,用exists替换掉inner join
SELECT t1.*
FROM blog_Content t1
WHERE t1.DateAdded>@StartDate and exists(select 1 from blog_Site_Links t0 ON t0.ID=t1.EntryID AND t0.IsActive=1 AND t0.CategoryID=@CategoryID)
ORDER BY t1.DateAdded DESC
改用 Exists
效果一样
@dudu:
1、单表查询,慢的话,只能加索引了。DateAdded
2、关联表如果数据量太大,必然也有影响;
还是不行,就没道理了,只能远程给你看了。
可以看看连接查询的地方有没有索引
有索引
打开查询分析器,会提示你怎么做。
blog_Content 这个表是不是存了文本,二进制数据,列的数量太多,只能分表
这是比较简单的一个语句,没什么复杂逻辑。把order by 排序去掉试下,对比下试下速度,如果提升明显就查出来再内存排序