Стратегии индексирования / производительности для огромного количества одинакового значения - PullRequest
0 голосов
/ 11 января 2011

Базовая информация: это в контексте процесса индексации данных OpenStreetMap.Для упрощения вопроса: основная информация делится на 3 основных типа со значениями «W», «R», «N» (VARCHAR(1)).

Таблица содержит около 75 миллионов строк, все столбцы с буквой «W» составляют около 42 миллионов строк.Существующие индексы не имеют отношения к этому вопросу.


Теперь сам вопрос: индексирование данных выполняется с помощью процедуры.Внутри этой процедуры есть несколько циклов, которые выполняют следующее:

[...] SELECT * FROM table WHERE the_key = "W";[...]

Результаты снова зацикливаются, и сам запрос выше также находится в цикле.Это занимает много времени и значительно замедляет процесс.Индекс the_key, очевидно, бесполезен, поскольку все значения, которые может использовать индекс, одинаковы («W»).Сам скрипт работает со скоростью, которая в порядке, только SELECT IN занимает очень много времени.

Нужно ли

  • создать индекс «специального» типа, которыйпринимает это во внимание и делает SELECT быстрее?Если да, то какой?
  • нужно настроить некоторые параметры сервера (они уже настроены, и результат, который они доставляют, кажется хорошим. При необходимости я могу опубликовать их)?
  • приходится жить со скоростью и просто получать больше оборудования, чтобы получить больше энергии (Тим Тейлор ворчит ворчит )?

Любые альтернативы вышеуказанным пунктам (кроме переписывания или нет)с его помощью)?

Ответы [ 2 ]

2 голосов
/ 11 января 2011

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

1 голос
/ 11 января 2011

Сначала вы говорите:

Таблица содержит примерно 75 миллионов строк, все столбцы с буквой "W" составляют ~ 42 миллиона строк.

Затем вы говорите, чтоВы делаете

SELECT * FROM table WHERE the_key = "W";

несколько раз в цикле и ожидаете его выполнения?Это невозможно - никакая индексация не ускорит этот запрос - он должен вернуть 42M строк - более половины.Если вы отказываетесь переписать эту процедуру индексации, чтобы избежать повторного запроса, тогда это просто The Daily WTF .

...