INNER JOIN 使 COUNT(*) 变慢

Dar*_*ong 0 performance sql-server-2008 join foreign-key sql-server

我有一个非常简单的查询:

SELECT COUNT(*)
FROM messages
INNER JOIN users ON messages.user_id = users.user_id
Run Code Online (Sandbox Code Playgroud)

加入需要 1146 毫秒,没有加入需要 220 毫秒(220 毫秒对我来说仍然很慢)。在包含 1,000,000+ 行的消息表上进行测试。

我在两个表 ( message_idand user_id)上都设置了主键,并设置了连接messages.user_idand的外键users.user_id

此查询的原因是为分页系统提供记录总数。

我还能做些什么来加速查询?

Aar*_*and 5

如果外键不可为空,那么就根本没有理由加入,是吗?那么为什么不让 SQL Server 扫描最有效的可用索引,而不是计算将导致完全相同计数的连接呢?

SELECT COUNT(*) FROM dbo.messages;
Run Code Online (Sandbox Code Playgroud)

也就是说,您可以更有效地执行此操作:

SELECT SUM(rows) FROM sys.partitions
  WHERE [object_id] = OBJECT_ID('dbo.messages')
  AND index_id IN (0,1);
Run Code Online (Sandbox Code Playgroud)

由于进行中的交易,这会稍微不准确,但它也不会阻止(或被阻止)针对表的任何活动,因此请选择您的毒药。