您是否在 JOIN 子句或 where 子句或两者上设置索引?

6 index sql-server sql-server-2000

说我的查询看起来像:

SELECT t1, t2
FROM t1
  LEFT JOIN t2 ON (t1.id = t2.id AND t2.userid = @userid)
WHERE t1.enabled = 1 AND
      t1.startDate <= ??? AND 
      (t1.counter = -1 OR
       t2.counter IS NULL OR
       (t1.counter > t2.counter)
Run Code Online (Sandbox Code Playgroud)

现在这个表中可能有几十万行。

你会建议我像这样在 JOIN 子句上放置一个索引吗?

  t2.id t2.userid
Run Code Online (Sandbox Code Playgroud)

where子句呢?还是 join 子句更重要?

我意识到测试很重要,但理论上应该怎么做?

(这是针对 SQL Server 2000)

mar*_*c_s 5

我建议始终在将在条件中使用的列(JOIN外键列)上放置非聚集索引。这在几个方面都有帮助 -JOIN操作会更快,并且强制执行 FK 约束(在尝试删除父行时检查是否附加了子行)也将从这些索引中受益。

然后检查您的系统性能如何。如果它的表现低于您的预期 - 仔细添加一个索引,看看整体系统性能是否有所提高。如果不是:再次删除索引。重复直到您对性能满意为止。WHEREor子句中使用的列ORDER BY是这些索引的主要候选者 - 但不要过度索引!这比根本没有索引还要糟糕。

请参阅 Kimberly The Queen of Indexing Tripp 的精彩博客文章 -索引:仅仅因为可以,并不意味着您应该!关于这个话题。

  • 她关于索引的博客文章值得一读…… (2认同)
  • @PaulWasilewski:如果您有更好、更有效的方法 - 请*与我们分享!* (2认同)