什麼會使桌子“變慢”? (What would make a table "slow?")


問題描述

什麼會使桌子“變慢”? (What would make a table "slow?")

What would make one table substantially slower than another?  Probably easiest to just illustrate:

Query 1:

select top 1000 *
from call c
JOIN call_task ct ON c.call_no=ct.call_no
LEFT JOIN memo_clt m ON m.doc_ref=ct.record AND m.doc_type='CLT' AND m.line_no=1
LEFT JOIN memo_clt m2 ON m2.doc_ref=ct.record AND m2.doc_type='CLT' AND m2.line_no=2

Query 2:

select top 1000 *
from call c
LEFT JOIN ext_document_detail edd   ON edd.doc_type='CLH' 
                                            AND edd.doc_ext_no=21
                                            AND edd.doc_ref=c.record
LEFT JOIN ext_document_detail edSource  ON edSource.doc_type='CLH'
                                                AND edSource.doc_ext_no=22
                                                AND edSource.doc_ref=c.record

The structure of the tables is similar, and I'm accessing the ext_document_detail with a very similar join compared to the memo_clt table.  Yet the second query takes 40 seconds, while the other one takes 0 seconds.

Both have a clustered index on the three keys I'm using for the join.  The memo_clt table has a non-clustered index on it's record column though... that's the only difference I can spot and I don't think it would make a big difference.

So why the difference in speed here?

EDIT: Since Martin asked, here are the results of SET STATISTICS IO ON Query 1:

Table 'memo_clt'. Scan count 2000, logical reads 6454, physical reads 0, read-ahead reads 0, lob logical reads 2385, lob physical reads 0, lob read-ahead reads 0.
Table 'call_task'. Scan count 1, logical reads 39, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'call'. Scan count 1, logical reads 25, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Query 2:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ext_document_detail'. Scan count 1001, logical reads 1507004, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'call'. Scan count 1, logical reads 24, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Right off the bat two things are striking me.  First is that there is no such table as "Worktable."  The second is the absolutely huge number of logical reads... what would cause that? 


參考解法

方法 1:

It's not the tables themselves that are causing the differences in speed.  It is the structures of joins and supporting indexes on the tables being queried.  

To give you a good reason for the difference in speed I'd need to see your execution plan.  I suspect that one query utilizes indexes better than another.

A good place to start would be to see if you have any table scans.  If you have these and can optimize you will likely see an increase in performance.

I would give this article a good read.  It's definitely worth checking out and understanding..

(by CodeRedickAbe Miessler)

參考文件

  1. What would make a table "slow?" (CC BY-SA 3.0/4.0)

#sql-server-2005 #tsql






相關問題

可更新查詢所需的最低權限 (Access Project) (Minimum permissions required for an updatable query (Access Project))

Sql中的WHERE,結合兩個快速條件會成倍增加成本 (WHERE in Sql, combining two fast conditions multiplies costs many times)

是否可以重構此語句以刪除子查詢? (Is it possible to refactor this statement to remove the subquery?)

Không gửi được tệp nhật ký bằng 'Tác vụ Gửi Thư' từ trình xử lý OnError (Sending the log file using a 'Send Mail Task' from the OnError handler fails)

擴展 SSRS 中的圖表功能 (Extending chart functionality in SSRS)

sql server 2005 數據庫郵件錯誤(操作已超時) (sql server 2005 database mail error (The operation has timed out))

從.NET應用程序到SQL Server的緩慢調用 (Sporadically Slow Calls From .NET Application To SQL Server)

我需要在 sql 中獲取 alldata whereclause? (i need to get alldata whereclause in sql?)

一種檢查 SQL 2005 中是否存在外鍵的方法 (A way to check if foreign key exists in SQL 2005)

如何在 SSIS 中調用存儲過程? (How do you call a Stored Procedure in SSIS?)

什麼會使桌子“變慢”? (What would make a table "slow?")

可以在這裡使用 Common Table 表達式來提高性能嗎? (Can Common Table expressions be used here for performance?)







留言討論