举个例子: 两个表 Po 和 Client Po 中每条记录中都有 Client 的 ID ,现在要返回所有 Po 记录,记录中要包含 Client 的 名字(而不是 ID)Select po.PoNo, cl.Name from Po po inner join Client cl on cl.id=po.ClientSQL 的查询优化器会首先对 Po 表进行一个 Table Scan ,然后,对 Client 表进行一个 Table Seek ,查找与 Po.Client 相对应的记录,最后,把这些结果一一对应,合并成一个表。
有下面四种JOIN方式,LOOP 、HASH 、MERGE、REMOTE。每种实际运行时的处理方式会有所不同。
内容比较多,不详说了,最好看看帮助,我电脑上是E文的帮助,就不贴上来了。
两个表 Po 和 Client
Po 中每条记录中都有 Client 的 ID ,现在要返回所有 Po 记录,记录中要包含 Client 的 名字(而不是 ID)Select po.PoNo, cl.Name from Po po inner join Client cl on cl.id=po.ClientSQL 的查询优化器会首先对 Po 表进行一个 Table Scan ,然后,对 Client 表进行一个 Table Seek ,查找与 Po.Client 相对应的记录,最后,把这些结果一一对应,合并成一个表。
表一: Po( ID(int PK), Client(int FK), PoDate(DateTime) ) cluster indexed
表二: Client( ID(int PK), Name(nvarchar) ) cluster indexed Sql 语句:
Select po.PoDate,cl.[Name]
from Po po
inner join Client cl on cl.[ID]=po.Client大数据量测试结果 (Po 表含 100,000 条记录, Client 含 1000 条记录) :
执行计划被分成三个步骤,
1。 对 Po 表的 clustered index scan (Total Cost: 0.376456, 29%)
Row Count: 100,010
IO Cost: 0.266
CPU Cost: 0.109
Number of Executes: 12。 对 Client 表的 clustered index scan (Total Cost: 0.039490, 3%)
Row Count: 1001
IO Cost: 0.0383
CPU Cost: 0.00117
Number of Executes: 13。 对两个表的结果进行 Hash Match (Total Cost: 0.852, 67%)
Row Count: 100,010
IO Cost: 0.000000
CPU Cost: 0.852
Number of Executes: 1查询共耗时: 1秒
小数据量测试结果 (Po 表含 300 条记录, Client 含 40 条记录) :执行计划被分成三个步骤,1。 对 Po 表的 clustered index scan (Total Cost: 0.037987, 55%)
Row Count: 300
IO Cost: 0.0187
CPU Cost: 0.000204
Number of Executes: 12。 对 Client 表的 clustered index Seek (Total Cost: 0.030288, 44%)
Row Count: 300
IO Cost: 0.00632
CPU Cost: 0.000080
Number of Executes: 3003。 对两个表的结果进行 Nested Loops (Total Cost: 0.001254, 2%)
Row Count: 300
IO Cost: 0.000000
CPU Cost: 0.00125
Number of Executes: 1查询共耗时: 少于1秒结论:1。 对于庞大数据的查询, Sql Server 的查询优化器会自动调整查询计划,上面三个步骤的 "Number of Executes" 都是 1 ,有点出乎我的预料,这说明,对于大数据量, 查询优化器会对被查询所有表进行表扫描,将其中一个表的扫描结果生成一个 hash 表,然后,将另一个表的扫描结果与之匹配。而对小数据量查询的时候,查询优化器会先对一个表进行 clustered index scan ,然后,针对获得的每一行数据,到第二个表中进行 Clustered index seek ,找到的结果同第一个表的结果匹配,所以,我们注意到,小数据量测试中, Client 表的 "Number of executes" 为 300,说明,查询优化器认为对当前的小数据量,使用循环,开支更小。2。 从上面的结果可以看到, Index 对提高查询效率具有无可比拟的作用。 不过 index 会影响数据写入的速度,我在随机写入 100,000 条记录的时候,一共花费了 12分钟。3。 查询优化器非常智能,只要我们的代码符合数据库设计规范,它的执行效率是很出色的。