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)
我建议始终在将在条件中使用的列(JOIN
外键列)上放置非聚集索引。这在几个方面都有帮助 -JOIN
操作会更快,并且强制执行 FK 约束(在尝试删除父行时检查是否附加了子行)也将从这些索引中受益。
然后检查您的系统性能如何。如果它的表现低于您的预期 - 仔细添加一个索引,看看整体系统性能是否有所提高。如果不是:再次删除索引。重复直到您对性能满意为止。WHERE
or子句中使用的列ORDER BY
是这些索引的主要候选者 - 但不要过度索引!这比根本没有索引还要糟糕。
请参阅 Kimberly The Queen of Indexing Tripp 的精彩博客文章 -索引:仅仅因为可以,并不意味着您应该!关于这个话题。