首页 > 解决方案 > 子查询与连接性能

问题描述

我有两张表 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

标签: sqlsql-serverazure-sql-database

解决方案


我可能会使用连接编写此查询:

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;

上面的查询没有WHEREorHAVING子句,所以我看不到任何明显的方法可以使用索引进一步调整它。但它至少比您当前的查询具有潜在优势,即它不涉及N^2select 子句中相关子查询的行为。


推荐阅读