使用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
谢谢!
答案 0 :(得分:4)
如果所有表中的所有相应ID都有索引,则查询应生成相同的执行计划。稍有不同的是,优化器可能会以不同方式处理内联查询,因为它们必须只返回一行(否则会产生错误)。
我更倾向于尽可能在from
子句中保留所有表引用。我发现它可以更容易地维护查询 - 所有表引用都在一个地方。所以,我更喜欢带有显式joins
的格式。
答案 1 :(得分:2)
获得答案的唯一真正方法是计时并检查各种查询的执行计划。我相信SQL Server会尝试优化查询,因此时间差异可能很小。带有JOIN的版本更具可读性,如果性能没有太大差异,那将是我的首选。