Sql-Server

INNER JOIN 使 COUNT(*) 變慢

  • January 15, 2018

我有一個非常簡單的查詢:

SELECT COUNT(*)
FROM messages
INNER JOIN users ON messages.user_id = users.user_id

加入需要 1146 毫秒,沒有加入需要 220 毫秒(220 毫秒對我來說仍然很慢)。對包含 1,000,000 多行的消息表進行了測試。

我在兩個表 ( message_idand ) 上都設置了一個主鍵,並且在連接and時user_id設置了一個外鍵設置。messages.user_id``users.user_id

此查詢的原因是為分頁系統提供記錄總數。

我還能做些什麼來加快查詢速度?

如果外鍵不可為空,那麼根本就沒有加入的理由,是嗎?那麼為什麼不讓 SQL Server 掃描最有效的可用索引,而不是計算將導致完全相同的計數的連接呢?

SELECT COUNT(*) FROM dbo.messages;

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

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

由於進行中的交易,這將稍微不准確,但它也不會阻止(或被阻止)針對桌子的任何活動,所以選擇你的毒藥。

引用自:https://dba.stackexchange.com/questions/22379