【发布时间】:2013-04-26 17:51:33
【问题描述】:
我正在处理以下查询:
Query 1: SELECT * From TabA INNER JOIN TabB on TabA.Id=TabB.Id
Query 2: SELECT * From TabA WHERE Id in (SELECT Id FROM TabB)
Query 3: SELECT TabA.* From TabA INNER JOIN TabB on TabA.Id=TabB.Id
我使用 SQL Server Profiler 调查了这些查询并发现了一些有趣的事实。
- 查询 1 耗时 2.312 秒
- 查询 2 耗时 0.811 秒
- 查询 3 耗时 0.944 秒
TabA 48716 行
TabB 62719 行
基本上我要问的是为什么查询 1 需要很长时间,而不是查询 3。我已经知道“子查询”比内部连接慢,但这里查询 2 最快;为什么?
【问题讨论】:
-
为什么会有
C#标签?这无关紧要。 -
您是否多次运行这些计时?查询性能受表是否加载到页面缓存中的影响很大。
-
小心缓存。每次查询后你都会清理它吗?
-
查询 1 比查询 3 慢,因为您没有从查询 3 中的 TabB 加载数据
-
假设通过网络传输数据需要读取,TabB 可能包含大量列,其中有几个设置为大数据类型。是这样吗?只有查询 A 要求所有列和值都包含在结果集中并通过网络传输。以秒为单位的性能时间代表什么?客户往返总时间?
标签: sql sql-server sql-server-2008