我在MS SQL 2008R2服务器上有一个表orders
orders
的主键为id
orders
有一个名为ordering_date
的列,类型为datetime
我使用一段SQL在服务器上创建了一个名为ordering_date
的列ordering_date_ndx
的索引。我确实试图使用迁移,但是在这个包含2300万条记录的表上运行迁移超时。
2个问题:
list=Orders.find(ordering_date.year == 2006)
谢谢!
答案 0 :(得分:0)
Afaik Rails不关心数据库的索引。在Rails中没有基于索引的查询优化。如果对列进行排序或过滤(特别是在大表上),添加索引会很有帮助。这有助于您的数据库服务器更有效地执行这些操作。
然而,添加索引的更好方法是让Rails通过迁移来实现,而不是手动执行。可能是因为SQL也被剪断了。这可确保索引适用于所有环境和服务器。
为什么这在Rails中需要很长时间我不知道。但您可以在迁移中运行SQL:
def up
execute "ALTER TABLE orders ADD UNIQUE ordering_date_ndx (ordering_date)"
end
我不知道MS SQL语法,但我想它可以改编。
答案 1 :(得分:0)
部分答案。
使用:
SELECT ordering_date
FROM my_table
WHERE (ordering_date > CONVERT(DATETIME, '2008-01-01 00:00:00', 102) AND ordering_date < CONVERT(DATETIME, '2008-02-01 00:00:00', 102))
给我一个非常快速的结果。
在添加索引之前,此查询将需要3分钟才能执行。使用索引,需要2秒,这将改变我们如何使用此信息的确定。
我发现'MS SQL Server 2008R2具有显示估计执行计划功能,该功能确认使用主键和索引。
我想我接下来会创建一个ruby方法来包装这个sql并使用find_by_sql方法。