Индекс необходим для макс (кол)? - PullRequest
1 голос
/ 10 февраля 2011

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

  • получить текущее максимальное значение y для определенного столбца (идентификатор для таблиц журнала и время для таблиц событий)
  • загрузить данные с помощью запроса типа where x > y

Чтобы избежать проблем с производительностью (я загружаю около 1 миллиона строк в день), я удалил большинство таблиц из таблиц (они нужны только для производства, а не на складе). Но таким образом поиск максимального значения занимает некоторое время ... поэтому мой вопрос:

Каков наилучший способ получить текущее максимальное значение для столбца без индекса для этого столбца? Я только что прочитал об использовании stats , но я не знаю, как обрабатывать столбцы с «меткой времени с часовым поясом». Отключение индекса перед загрузкой и последующее его воссоздание занимает слишком много времени ...

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

Минимальные и максимальные значения, которые вычисляются как часть статистики на уровне столбца, являются оценочными.Оптимизатору нужно, чтобы они были достаточно близки, но не совсем точны.Я, конечно, не буду доверять им как часть процесса загрузки.

Загрузка миллиона строк в день - это не так уж много.У вас очень маленькое окно загрузки?Я немного сомневаюсь, что вы не можете позволить себе затраты на индексацию строк, вам необходимо выполнить сканирование индекса мин / макс.Вы, вероятно, хотите сохранить последнее максимальное значение в отдельной таблице, которую вы ведете как часть процесса загрузки.После загрузки строк 1-1000 в таблицу A необходимо обновить строку в этой сводной таблице для таблицы A, чтобы указать, что последней обработанной строкой является строка 1000. В следующий раз вы прочитаете значение изСводная таблица и начать с 1001.

2 голосов
/ 10 февраля 2011

Если для столбца нет индекса, единственным способом для СУБД найти максимальное значение в столбце является полное сканирование таблицы, которое занимает много времени для больших таблиц.

Я полагаю, что СУБД может пытаться отслеживать минимальные и максимальные значения в столбце (сохраняя значения в системном каталоге), поскольку она вставляет, обновляет и удаляет, но удаляет, поэтому ни одна из известных мне СУБД не пытается поддерживать статистику в актуальном состоянии с помощью операций на ряд. Если вы удаляете максимальное значение, то для поиска нового максимума требуется сканирование таблицы, если столбец не проиндексирован (и если он проиндексирован, индекс делает поиск максимального значения тривиальным, поэтому информация не должна храниться в системный каталог). Вот почему они называются «статистикой»; они являются приближением к применяемым значениям. Но когда вы запрашиваете «SELECT MAX (somecol) FROM sometable», вы не запрашиваете статистического максимума; вы запрашиваете фактический текущий максимум.

0 голосов
/ 28 августа 2012

Этот код был написан с помощью Oracle, но он должен быть совместим с большинством версий SQL:

Получает ключ max (high_val) в таблице в соответствии с диапазоном.

select high_val, my_key
from (select high_val, my_key
      from mytable
      where something = 'avalue'
      order by high_val desc)
where rownum <= 1

Это говорит о том, что сортируйте mytable по убыванию high_val по значениям, где что-то = 'avalue'.Возьмите только верхнюю строку, которая предоставит вам max (high_val) в выбранном диапазоне и my_key для этой таблицы.

0 голосов
/ 10 февраля 2011

У процесса, который создает файл извлечения, также извлекается файл из одной строки с желаемой минимальной / максимальной скоростью. Я предполагаю, что этот фрагмент написан на некотором cron или планировщике, поэтому не должно быть слишком много, чтобы попросить добавить min / max calcs в этот скрипт;)

Если нет, просто выполните полное сканирование. Миллион строк не так уж и много, особенно в среде хранилища данных.

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