我在SQL server中有一个表,它有一个名为Date_Printed的DATETIME字段。我试图获取表中位于指定日期范围之间的所有记录。目前我正在使用以下SQL
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 :(得分: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
不知道当天的最后一秒会有什么打击!
答案 1 :(得分:1)
优化此查询的想法:
include
选项在索引中包含列而不索引这些列。换句话说,只对date_printed进行索引,但包括要返回的其他列。 上述一些想法可能需要权衡其他DML的速度和增加的存储空间。
答案 2 :(得分:0)
除了拥有合适的索引外,你无能为力。好吧,在选择中删除“*” - 输入字段,不要求所有字段(限制数据传输)。
基本上就是这样。如果你在Date_Printed上有一个索引,正如你所说,那就是那个查询。更高的性能=更好的机器,大多数更快的光盘,更多的RAM用于缓存。
答案 3 :(得分:0)
如果您使用的是Microsoft SQL Server,那么测试查询运行SQL Server Profiler(来自工具)的效率的好方法。然后,当您运行查询时,您应该看到正在调用您的查询,并提供有关其效率的信息。 您还可以将分析器中的日志作为xml文件导出到数据库引擎优化顾问中,这可能会帮助您了解在表上创建索引的想法。
另一种技术是在查询中包含SET STATISTICS IO ON,然后在消息中,您将获得一个表列表(在您的情况下为1)以及查询执行的读取次数等
另一种方法是通过单击SQL Server Management Studio中的“包括实际执行计划”按钮将执行计划包含在结果中 这可能有点复杂,但应告诉您是否正在使用索引。
答案 4 :(得分:0)
在MS SQL Server上,您可以尝试使用DATEDIFF
SELECT * FROM table
WHERE DATEDIFF(dd, @StartDate, Date_Printed) > 0
AND DATEDIFF(dd, Date_Printed, @EndDate) > 0
不确定与BETWEEN
相比有多高效。把它扔到那里。