Что я должен добавить в определение модели Rails для индекса, который я только что добавил в столбец MS SQL Server 2008R2? - PullRequest
1 голос
/ 19 февраля 2012

У меня есть таблица orders на сервере MS SQL 2008R2
orders имеет первичный ключ id
orders имеет столбец с именем ordering_date, тип datetime
Я создал индекс столбца ordering_date с именем ordering_date_ndx на сервере, используя фрагмент SQL. Я пытался использовать миграцию, но запустил тайм-аут миграции для этой таблицы из 23 миллионов записей.

2 вопроса:

  1. Что, если что, я должен поместить в app / models / order.rb, чтобы использовать индекса.
  2. Будет ли такой код использовать присутствие индекса и оптимизировать SQL-запрос?
list=Orders.find(ordering_date.year == 2006)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

Частичный ответ.

Использование:

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.

0 голосов
/ 19 февраля 2012

Afaik Rails не заботится об индексах в базах данных.Оптимизация запросов на основе индексов в Rails отсутствует.Если вы выполняете сортировку или фильтрацию по столбцу (особенно в больших таблицах), полезно добавить индексы.Это помогает вашему серверу баз данных выполнять эти операции более эффективно.

Однако лучший подход для добавления индекса состоит в том, чтобы Rails делал это с помощью миграций, а не вручную.Это может быть, если SQL-код также отрублен.Это гарантирует, что индекс существует на всех средах и серверах.

Почему в Rails это занимает много времени, я понятия не имею.Но вы можете запустить SQL в процессе миграции:

def up
  execute "ALTER TABLE orders ADD UNIQUE ordering_date_ndx (ordering_date)"
end

Я не знаю о синтаксисе MS SQL, но, думаю, его можно адаптировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...