基于过滤表达式的SQL查询设计问题

时间:2013-11-20 02:00:16

标签: sql sql-server

我对SQL Server 2008的SQL查询设计有一些疑问。

假设我有2个表,UserPeriodTransactions

Period中的列为PeriodIDStartDateTimeCloseDateTimeUserIDPeriod表中的记录如下:

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中的列为TransactionIDTransactionDateTimeValueTransactions表中的记录如下:

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 JOINWHERE子句中的位置。

鉴于我在每个表中都有成千上万的记录,哪个查询是最好的,性能明智?

其次,任何人都可以告诉我在加入表格时或者在所有表格加入之后是否应用WHERE中的过滤条款?

谢谢你,我很抱歉这个不太实际的例子。这是我能想到的最简单的例子来代表我正在研究的更大的表格。

1 个答案:

答案 0 :(得分:0)

SQL Server Management Studio生成的执行计划将帮助您确定哪一个更有效。根据我的理解,他们应该是一样的。可能是错的,但它取决于数据库中的索引。

关于设计。第二个查询被认为更干净(这是我的个人偏好),但由您来决定您最喜欢哪一个。我认为他们应该同样有效率。

PS:你能否发表评论说他们是否有相同的执行计划?

相关问题