sql - 子查询与连接性能
问题描述
我有两张表 Sites 和 ScannedItems。Sites 大约有 15000 行,ScannedItems 大约有 6000 万行。下面的查询大约需要 6 分钟,其中包含 CountUniqueRoleAssignments、Modified 和 siteid 上的索引。可以以任何方式优化吗?某种连接是否比子查询或任何其他提示更快?
select
*,
(select COUNT(*) from ScannedItems where ScannedItems.siteid=sites.siteid and ScannedItems.CountUniqueRoleAssignments>0) as CountUniquePermissions,
(select COUNT(*) from ScannedItems where ScannedItems.siteid=sites.siteid and ScannedItems.Modified<DATEADD (day, -30 ,GETDATE())) as CountNotModified30Days
from sites
解决方案
我可能会使用连接编写此查询:
SELECT
s.siteid,
COALESCE(si.CountUniquePermissions, 0) AS CountUniquePermissions,
COALESCE(si.CountNotModified30Days, 0) AS CountNotModified30Days
FROM sites s
LEFT JOIN
(
SELECT siteid,
COUNT(CASE WHEN CountUniqueRoleAssignments > 0 THEN 1 END)
AS CountUniquePermissions,
COUNT(CASE WHEN Modified < DATEADD (day, -30, GETDATE()) THEN 1 END)
AS CountNotModified30Days
FROM ScannedItems
GROUP BY siteid
) si
ON si.siteid = s.siteid
ORDER BY
s.siteid;
上面的查询没有WHERE
orHAVING
子句,所以我看不到任何明显的方法可以使用索引进一步调整它。但它至少比您当前的查询具有潜在优势,即它不涉及N^2
select 子句中相关子查询的行为。
推荐阅读
- javascript - 如何将信息传递给新功能
- windows-10 - 将符号链接转换为联结
- python - 如何使用另一种方法实现mysql左连接?
- java - 检查数字是否是双精度数组中的中位数
- c# - ASP.NET Core WebSockets
- c++ - 为什么我的 while 循环结束而没有给出错误?C++
- .net - 运行节点 node_modules/webpack/bin/webpack.js --env.prod 时出现 JavaScript 堆内存错误
- c++ - 从基类向量访问继承类的函数 - C++11
- javascript - 反应路由器不在路由处渲染组件
- swift3 - 如何左锚乘数?