我应该在我刚刚添加到MS SQL Server 2008R2列的索引的Rails模型定义中添加什么?

时间:2012-02-19 05:20:25

标签: sql ruby ruby-on-rails-3 sql-server-2008 model

我在MS SQL 2008R2服务器上有一个表orders
orders的主键为id
orders有一个名为ordering_date的列,类型为datetime 我使用一段SQL在服务器上创建了一个名为ordering_date的列ordering_date_ndx的索引。我确实试图使用迁移,但是在这个包含2300万条记录的表上运行迁移超时。

2个问题:

  1. 我应该在app / models / order.rb中使用什么,如果有的话 的索引。
  2. 这样的代码会使用索引的存在并优化SQL查询吗?
  3. list=Orders.find(ordering_date.year == 2006)
    

    谢谢!

2 个答案:

答案 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方法。