y62*_*ang 1 sql-server indexing join
我有两个表要加入,它们都有我想要加入的列的索引.
查询1
SELECT * FROM [A] INNER JOIN [B] ON [A].F = [B].F;
Run Code Online (Sandbox Code Playgroud)
查询2
SELECT * FROM (SELECT * FROM [A]) [A1] INNER JOIN (SELECT * FROM B) [B1] ON [A1].F=[B1].F
Run Code Online (Sandbox Code Playgroud)
第一个查询显然会利用索引,第二个查询呢?在执行括号中的两个select语句之后,会发生join,但我的猜测是索引无法加速查询,因为它几乎是一个新表.
查询的执行方式与您建议的完全不同,首先执行内部查询,然后将结果与外部查询结合使用.优化器将采用您的查询,并将查看许多可能的方法,以通过各种连接顺序,索引使用等等获取您的数据,并提出一个感觉最佳的计划.
如果您执行两个查询并查看各自的执行计划,我认为您会发现它们使用完全相同的查询.
这是一个相同概念的简单例子.我创建了我的架构:
CREATE TABLE A (id int, value int)
CREATE TABLE B (id int, value int)
INSERT INTO A (id, value)
VALUES (1,900),(2,800),(3,700),(4,600)
INSERT INTO B (id, value)
VALUES (2,800),(3,700),(4,600),(5,500)
CREATE CLUSTERED INDEX IX_A ON A (id)
CREATE CLUSTERED INDEX IX_B ON B (id)
Run Code Online (Sandbox Code Playgroud)
并运行您提供的查询.
SELECT * FROM A INNER JOIN B ON A.id = B.id
SELECT * FROM (SELECT * FROM A) A1 INNER JOIN (SELECT * FROM B) B1 ON A1.id = B1.id
Run Code Online (Sandbox Code Playgroud)
生成的计划如下所示:

正如您所看到的,两者都使用索引.
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |