Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
减少联接SQL Server的逻辑读取_Sql_Sql Server_Performance_Join - Fatal编程技术网

减少联接SQL Server的逻辑读取

减少联接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

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
     ON T2.[ID] = T1.[ID];

通过创建索引。相应的索引位于
T2(ID,Number)
上。您可以
编号包含在索引中,而不是将其作为键,但我猜它可能对其他查询中的索引有用。

创建两个非聚集索引:

  • 在T2上,索引字段ID并包括字段编号
  • 在T1上,索引字段ID和名称,并包括字段城市
这样,查询将被索引覆盖(SQL Server将仅访问索引页)

如果这不能显著提高查询性能,请尝试对联接使用“提示”:

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我也不得不问,为什么添加
索引
是最后的手段?通常,当简单查询的性能不佳时,第一个调用点是查看索引。你对指数有什么看法?