【发布时间】:2012-11-05 17:30:30
【问题描述】:
关于连接两个表与使用 2 个单独查询的二分法,我有一个简单的问题。
我希望找到一个现有的问题,但我的搜索结果并不多(大多数问题都是针对更复杂的问题)。
例如,考虑两个表 A 和 X,其架构非常简单:
Table A +-------------+-------------+-------------+
| Column A (*)| Column X(FK)| Column C |
+-------------+-------------+-------------+
Table X +-------------+-------------+-------------+
| Column X (*)| Column Y | Column Z |
+-------------+-------------+-------------+
其中列 A 和 X 是标识列和主键 (bigint)。表 A 和表 X 之间还存在 X 列的现有外键关系。
我的问题是,假设两个表都足够大(仅说 500K 行),我是否会从使用单个查询(参见下面的 Linq2Sql 伪代码)或使用两个单独的查询中获得更多的性能?
选项 1:
long aValue = 107;
DataContext dc = new DataContext();
var items = (from a in dc.TableA
join x in dc.TableX
on a.X equals x.X
where a.A == aValue
select new { a, x });
选项 2:
- 假设我编写了一个 SP,它串行执行 2 个单独的选择语句。
为了进一步量化问题,可以假设对于A的每一个值,只有少数(0-5)行将从表Y中连接,因此连接中返回的表A数据的重复不是意义重大。
我从数据库服务器影响的角度严格要求。因此,忽略任何客户端考虑因素(例如往返网络延迟、L2S 查询构建和数据编组成本等),我的问题是:
哪个选项在数据库服务器上的计算时间更短?
哪个选项需要更少的内存来评估结果?
如果有最佳实践,通常首选哪个选项?
对不起,如果这听起来太初级,但任何见解都会受到赞赏。
谢谢, - K.
【问题讨论】:
标签: sql-server performance inner-join