Как ускорить SQL-запрос с группировкой оператором + функция max? - PullRequest
3 голосов
/ 16 ноября 2009

У меня есть таблица с миллионами строк, и мне нужно сделать много запросов, которые выглядят примерно так:

select max(date_field) 
where varchar_field1 = 'something' 
group by varchar_field2;

Мои вопросы:

  • Есть ли способ создать индекс, чтобы помочь с этим запросом?
  • Какие (другие) варианты мне нужны для повышения производительности этого запроса?

Ответы [ 3 ]

15 голосов
/ 16 ноября 2009

Индекс на (varchar_field1, varchar_field2, date_field) будет наиболее полезным. База данных может использовать первое индексное поле для предложения where, второе для group by и третье для расчета максимальной даты. Он может выполнить весь запрос, просто используя этот индекс, не просматривая строки в таблице.

0 голосов
/ 16 ноября 2009

Вы можете создать себе дополнительную таблицу со столбцами

  varchar_field1  (unique index)
  max_date_field 

Вы можете настроить триггеры для вставок, обновлений и удалений в таблице, которую вы ищете, которые будут поддерживать эту маленькую таблицу - всякий раз, когда строка добавляется или изменяется, задайте строку в этой таблице.

Мы добились хороших успехов в улучшении производительности, используя эту технику рефакторинга. В нашем случае это стало проще, потому что мы никогда не удаляем строки из таблицы до тех пор, пока они не станут такими старыми, что никто не будет искать поле max. Это особенно полезный метод, если вы можете добавить max_date_field к другой таблице, а не создавать новую.

0 голосов
/ 16 ноября 2009

Очевидно, что индекс varchar_field1 очень поможет.

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