2010-06-18 70 views
4

我在SQL服务器中有一个表,它有一个名为Date_Printed的DATETIME字段。我正在试图获取表中位于指定日期范围之间的所有记录。目前我使用下面的SQL在SQL Server日期之间获取日期的正确方法

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @StartDate = '2010-01-01'
SET @EndDate = '2010-06-18 12:59:59 PM'

SELECT * FROM table WHERE Date_Printed BETWEEN @StartDate AND @EndDate

我对Date_Printed列的索引。我想知道这是否是获取表格中位于这些日期之间或者有更快捷方式的行的最佳方式。该表现在其中约有750,000条记录,并将继续增长。查询速度非常快,但如果可能的话,我想尽快让它更快。

+0

BETWEEN在某些数据库中不可移植,它在其他数据库中不具有兼容性。 – 2010-06-18 16:09:45

+0

您是否意味着在下午的最后时间是1?您需要使用Brett的建议或将其更改为23:59:59.997 – 2010-06-18 20:29:09

回答

3

我建议你使用:

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 

SET @StartDate = '2010-01-01' 
SET @EndDate = '2010-06-19' 

SELECT [someColumn],... FROM table WHERE Date_Printed >= @StartDate AND Date_Printed < @EndDate 

不知道有什么可以在白天的那个最后一秒命中

+0

此外,当你进入毫秒时,MS有一些“舍入”问题,所以我通常也使用这种方法。 – 2010-06-18 16:08:19

+0

+1不是_optimization_,而是对正确性的改进。 – 2010-06-18 16:08:24

0

除了拥有正确的索引之外,您无法在此处进行任何操作。那么,在选择中摆脱“*” - 输入字段,并且不要求所有字段(限制数据传输)。

基本上就是这样。如你所说,如果你在Date_Printed上有一个索引,那就是那个查询。更多的性能=更好的机器,主要是更快的光盘,更多的RAM用于缓存。

+0

*仅用于此处发布的示例。我在写查询时从不使用*,但它是显示我正在尝试执行的最简单的方法。 – 2010-06-18 17:24:06

1

思路,以优化这个查询:

  1. 做一个聚集索引上Date_Printed索引。但是这可能会减慢其他查询和DML的速度。
  2. 如果不需要表中的所有列,请显式列出所需的列。 (即使你这样做,列出列也是最好的形式。)这将减少返回查询调用者的通信量。
  3. 如果您不将'Date_Printed'上的索引创建为聚簇索引,并且您可以限制所需的列,请为此查询创建一个覆盖索引。覆盖索引是查询所需的所有列都包含在索引中的索引。 SQL Server 2008的另一种选择是使用include选项在索引中包含列,而不索引这些列。换句话说,只是在date_printed上索引,但包含正在返回的其他列。

上述某些想法可能涉及其他DML速度和增加的存储空间的权衡。

0

如果您使用Microsoft SQL Server,这是测试查询运行SQL Server Profiler(从工具)的效率的好方法。然后,当您运行查询时,您应该看到您的查询被调用,并提供有关它的效率的信息。 您也可以将您的日志从profiler作为xml文件导出到数据库引擎优化顾问中,这可能会帮助您创建在表上创建索引的想法。

另一种技术是包括SET STATISTICS IO ON在您的查询,然后在消息你会得到(1你的情况)表的列表,并通过查询

另一种是进行读取等的数通过单击SQL Server Management Studio中的'包括实际执行计划'按钮在执行计划中包含执行计划 这可能有点复杂,但应告诉您是否正在使用您的索引。

0

在MS SQL Server中,你可以尝试使用DATEDIFF

SELECT * FROM table 
WHERE DATEDIFF(dd, @StartDate, Date_Printed) > 0 
AND DATEDIFF(dd, Date_Printed, @EndDate) > 0 

不知道如何有效的将被比较BETWEEN。只是扔在那里。

相关问题