使用内联查询或联接从另一个表中获取数据?

时间:2013-01-07 01:22:55

标签: sql sql-server-2008-r2 query-optimization

使用SQL Server 2008 R2 哪一个更好(更快,更少的中间表,更少的内存使用)和通常的做法?

SELECT staff.id, staff.name, details.address, salary.hourly_rate, 
manager.name, boss.name
FROM STAFF_TABLE staff
LEFT JOIN STAFF_DETAILS_TABLE details on staff.id = details.id
LEFT JOIN STAFF_SALARY_TABLE salary on staff.id = salary.id
LEFT JOIN STAFF_TABLE manager on staff.manager_id = manager.id
LEFT JOIN STAFF_TABLE boss on staff.boss_id = boss.id

SELECT staff.id, staff.name, 
(SELECT address FROM STAFF_DETAILS_TABLE  id = staff.id) [address], 
(SELECT hourly_rate FROM STAFF_SALARY_TABLE WHERE id = staff.id) [hourly_rate], 
(SELECT name FROM STAFF_TABLE WHERE id = staff.manager_id) [manager_name], 
(SELECT name FROM STAFF_TABLE WHERE id = staff.boss_id) [boss_name]
FROM STAFF_TABLE staff

谢谢!

2 个答案:

答案 0 :(得分:4)

如果所有表中的所有相应ID都有索引,则查询应生成相同的执行计划。稍有不同的是,优化器可能会以不同方式处理内联查询,因为它们必须只返回一行(否则会产生错误)。

我更倾向于尽可能在from子句中保留所有表引用。我发现它可以更容易地维护查询 - 所有表引用都在一个地方。所以,我更喜欢带有显式joins的格式。

答案 1 :(得分:2)

获得答案的唯一真正方法是计时并检查各种查询的执行计划。我相信SQL Server会尝试优化查询,因此时间差异可能很小。带有JOIN的版本更具可读性,如果性能没有太大差异,那将是我的首选。