我对SQL Server 2008的SQL查询设计有一些疑问。
假设我有2个表,UserPeriod
和Transactions
。
Period
中的列为PeriodID
,StartDateTime
,CloseDateTime
和UserID
。 Period
表中的记录如下:
PeriodID StartDateTime CloseDateTime UserID
1 2013-11-13 00:00:00.000 2013-11-13 23:00:00.000 4
2 2013-11-14 00:00:00.000 2013-11-14 23:00:00.000 5
3 2013-11-14 00:00:00.000 2013-11-14 23:00:00.000 4
Transactions
中的列为TransactionID
,TransactionDateTime
和Value
。 Transactions
表中的记录如下:
TransactionID TransactionDateTime Value
22 2013-11-13 01:00:00.000 123
23 2013-11-14 02:00:00.000 123
所以现在我想查询在PeriodID 3中创建的所有事务。我的查询是这样的:
SELECT *
FROM Transactions AS t
INNER JOIN Periods AS p
ON (
t.TransactionDateTime BETWEEN p.StartDateTime AND p.CloseDateTime
AND p.UserID = 4
)
WHERE p.PeriodID IN (3)
我也可以像这样写我的查询来得到相同的结果:
SELECT *
FROM Transactions AS t
INNER JOIN Periods AS p
ON t.TransactionDateTime BETWEEN p.StartDateTime AND p.CloseDateTime
WHERE p.PeriodID IN (3)
AND p. UserID = 4
所以我的问题是,哪个更好的查询?这主要涉及我将过滤表达式p. UserID = 4
放在INNER JOIN
或WHERE
子句中的位置。
鉴于我在每个表中都有成千上万的记录,哪个查询是最好的,性能明智?
其次,任何人都可以告诉我在加入表格时或者在所有表格加入之后是否应用WHERE
中的过滤条款?
谢谢你,我很抱歉这个不太实际的例子。这是我能想到的最简单的例子来代表我正在研究的更大的表格。
答案 0 :(得分:0)
SQL Server Management Studio生成的执行计划将帮助您确定哪一个更有效。根据我的理解,他们应该是一样的。可能是错的,但它取决于数据库中的索引。
关于设计。第二个查询被认为更干净(这是我的个人偏好),但由您来决定您最喜欢哪一个。我认为他们应该同样有效率。
PS:你能否发表评论说他们是否有相同的执行计划?