减少联接SQL Server的逻辑读取
T1的逻辑读数约为130000,而T2的逻辑读数为140万。T2可容纳约280万行。从性能的角度来看,有什么方法可以减少这些读取?下面的查询示例:减少联接SQL Server的逻辑读取,sql,sql-server,performance,join,Sql,Sql Server,Performance,Join,T1的逻辑读数约为130000,而T2的逻辑读数为140万。T2可容纳约280万行。从性能的角度来看,有什么方法可以减少这些读取?下面的查询示例: SELECT T1.[ID],T1.[Name],T1.[City],T2.[Number] FROM T1 LEFT JOIN T2 ON T2.[ID] = T1.[ID] 您可以优化此查询: SELECT T1.[ID], T1.[Name], T1.[City], T2.[Number] FROM T1 LEFT JOIN T2
SELECT T1.[ID],T1.[Name],T1.[City],T2.[Number]
FROM T1
LEFT JOIN T2 ON T2.[ID] = T1.[ID]
您可以优化此查询:
SELECT T1.[ID], T1.[Name], T1.[City], T2.[Number]
FROM T1 LEFT JOIN
T2
ON T2.[ID] = T1.[ID];
通过创建索引。相应的索引位于
T2(ID,Number)
上。您可以将
编号包含在索引中,而不是将其作为键,但我猜它可能对其他查询中的索引有用。创建两个非聚集索引:
- 在T2上,索引字段ID并包括字段编号李>
- 在T1上,索引字段ID和名称,并包括字段城市
SELECT T1.[ID], T1.[Name], T1.[City], T2.[Number]
FROM T1
LEFT HASH JOIN T2 ON T2.[ID] = T1.[ID]
请分享结果(访问的页面数)。您能为两个表提供DDL吗,包括相关索引?@TimBiegeleisen,逻辑读取(查询涉及的页面)是查询返回结果所做工作的有效度量。查询和索引优化可以减少逻辑读取,从而提高查询性能。请尝试编译器连接提示,为什么不呢?试试看@DanGuzman那么你是说连接可以防止数据库进行逻辑读取?遗憾的是,我不知道这一点,这是我把所有时间都花在报告上的结果。@TimBiegeleisen,是的,在
JOIN
和WHERE
子句中指定的列上的有用索引可以减少逻辑读取,提高查询性能。在索引过多(增加存储和维护开销)和索引过少(查询性能)之间经常存在权衡,因此需要进行一些判断。索引(ID)包括(编号)谢谢,索引是我最后的选择。我只是想知道是否有任何方法可以改进查询本身,但我想这是非常基本的already@RyanGadsdon,为什么索引是最后的手段?如果没有有用的索引,SQL Server优化器将束手无策,需要进行全面扫描。为什么将索引称为最后手段?你可以试试编译器连接提示之类的东西,也许你遇到了一个严重的空间问题-我确实遇到过一个老板,他曾经禁止新索引,事实上,一个大客户已经这样做了,因为担心会让事情变得不安。@Ryangaddon我也不得不问,为什么添加索引
是最后的手段?通常,当简单查询的性能不佳时,第一个调用点是查看索引。你对指数有什么看法?