Sql-Server
INNER JOIN 使 COUNT(*) 變慢
我有一個非常簡單的查詢:
SELECT COUNT(*) FROM messages INNER JOIN users ON messages.user_id = users.user_id
加入需要 1146 毫秒,沒有加入需要 220 毫秒(220 毫秒對我來說仍然很慢)。對包含 1,000,000 多行的消息表進行了測試。
我在兩個表 (
message_id
and ) 上都設置了一個主鍵,並且在連接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);
由於進行中的交易,這將稍微不准確,但它也不會阻止(或被阻止)針對桌子的任何活動,所以選擇你的毒藥。