用于大型表连接的高性能 WHERE 子句


Alpha 有 30,

000 行,表 Beta 有 300 万行。 Beta还有一个外键,AlphaId,与Alpha的PK有关。

我在 SQL-Server 中有一个存储过程,它将@alphaId作为参数。目前,我的代码正在运行

SELECT Alpha.Id, Alpha.Field1, Alpha.Field2, Beta.Field3, Beta.Field4
FROM
     Alpha
     INNER JOIN Beta ON Alpha.Id = Beta.AlphaId
WHERE
     Alpha.Id = @alphaId

存储过程有点慢。如果我将WHERE子句更改为针对Beta进行过滤,它会加快速度吗?

WHERE
     Beta.AlphaId = @alphaId

WHERE子句与Alpha表和Beta表进行比较是否有任何价值

WHERE
     Alpha.Id = @alphaId
     AND Beta.AlphaId = @alphaId
  1. 执行计划说什么,它是否使用索引?
  2. 通常从此存储过程返回多少行?
  3. 有点慢 - 现在需要多长时间,多长时间会"不慢"?

主题中问题的回答:

"如果我将 WHERE 子句更改为针对 Beta 进行过滤,它会加快速度吗?"

"让 WHERE 子句与 Alpha 和 Beta 表进行比较有什么价值吗?"

两者的原因是一样的 - ms sql 将在所有 3 种情况下进行完全相同的比较

如果您的数据库系统很好,这三个查询将产生相同的查询计划,从而产生相同的性能。

我会尝试索引数据库,以便可以从索引中回答查询:

create index alpha_i on alpha (Id, Field1, Field2)
create index beta_i on beta (alphaId, Field3, Field4)

由于索引通常缓存在 RAM 中,因此在最好的情况下,数据库甚至不必点击硬盘来回答查询。

最新更新