2012-03-13 31 views
-1

我需要有选择地检索具有1对多关系的两个表中的数据。一个简单的例子如下。从2个表中检索具有1对多关系的数据 - 使用1个查询或2个更有效?

表A是事件的列表:

Id | TimeStamp | EventTypeId 
-------------------------------- 
1 | 10:26... | 12 
2 | 11:31... | 13 
3 | 14:56... | 12 

表B为事件属性的列表。不同的事件类型具有不同数量的属性。有些事件类型有没有属性可言:

EventId | Property | Value 
------------------------------ 
1  | 1  | dog 
1  | 2  | cat 
3  | 1  | mazda 
3  | 2  | honda 
3  | 3  | toyota 

有一些条件,我会申请,当我检索数据,但是它们都围绕着桌子A.举例来说,我可能要在一个只有事件某一天,或者只有某种类型的事件。

我相信我有检索数据的两个选项:

选项1
执行两个查询:首次查询表A(用WHERE子句中)和存储数据的地方,然后查询表B(加盟在表A中,以便使用相同的WHERE子句)和“填入空白”中的数据,我从表A检索到的数据。

此选项要求SQL Server通过表A执行2次搜索,但是生成的2个数据集不包含重复的数据。

选项2
执行单个查询,与左接合表A至表乙JOIN。

此选项只需要对表A进行一次搜索,但生成的数据集将包含许多重复的值。

结论
是否有一个“正确”的方式做到这一点还是需要尝试两种方式,看看哪一个更快?

回答

0

防爆

Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id 

和子查询是这样的 -

Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept) 

当我考虑性能这两个查询的速度会更快,为什么?

会预计第一个查询更快,主要是因为您有等价和显式JOIN。根据我的经验,IN是一个非常慢的运算符,因为SQL通常将其评估为由“OR”(WHERE x = Y OR x = Z OR ...)分隔的一系列WHERE子句。

与所有这些SQL虽然,你的里程可能会有所不同。速度将取决于很多索引(你是否在两个ID列上都有索引?这将有助于很多...)等等。

以更快的速度告诉100%确定性的唯一真正方法是开启性能跟踪(IO统计特别有用)并同时运行它们。确保在运行之间清除缓存!

更多REF

相关问题