2014-02-11 6 views
-1

В нашем хранилище данных (SQL Server 2005) мы пытаемся вставить/обновить записи в порядке первичного ключа. Другими словами, мы извлекаем из исходной таблицы и выдаем первичный ключ ORDER BY в DW. Это стандартная практика, позволяющая вести чтение/запись данных в логическом порядке на жестком диске и повышать производительность. (Если это неточно, сообщите мне).Вставка на основе первичного ключа

При выдаче ЗАКАЗА BY на очень большой исходной таблице это действительно убивает производительность. Есть ли другой способ получить тот же результат? Я думаю о комбинации перестроек индексов и статистики вычислений?

Надеюсь, что имеет смысл! Я не администратор базы данных! Благодарю.

+0

Вы тянете из исходной таблицы туда, где? –

+0

Я знаю множество причин, по которым вы хотите обработать или вставить записи, отсортированные по первичному ключу, но выполнение фактического сортировки в исходной системе накладывает на него ненужную нагрузку. – Ronnis

ответ

0

Я не знаю, является ли это «стандартной практикой», но я работал на складе, где наш типичный стол имел около миллиарда записей. Мы всегда будем отбрасывать индексы, вставлять новые данные, а затем восстанавливать индексы. Кто-то, в какой-то момент, решил, что это самый эффективный способ сделать это. Я уверен, что кто-то здесь может перебирать размер страницы и физические атрибуты (что, вероятно, больше, чем вам нужно знать, поскольку вы говорите, что вы не являетесь администратором базы данных), но короткий ответ заключается в том, чтобы сделать это именно так.

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

+0

Если вы создаете некластеризованные, то кластерные, все не кластерные get воссоздаются на основе кластеризации. Это займет больше времени. – Rick

+0

Ты прав, Рик. Мозг пердеть. Я отредактировал свой ответ. –

0

Если вы хотите установить конкретный заказ, у вас обязательно закажите предложение. Нет ifs, ands или buts. Кластеризованный индекс в столбце, который вы хотите отсортировать, скорее всего сделает ускорение выбора более быстрым, но создание этого индекса может закончиться тем же успехом, что и исходный запрос.

Я бы рассмотрел альтернативные методы переупорядочения вашей целевой таблицы (как это было предложено в ответе Джонни Боунса).

0

Если эта таблица не имеет индекса, то страницы не будут храниться с каким-либо конкретным порядком на диске. В случае большой таблицы без какого-либо индекса SELECT ..... ORDER BY из указанной таблицы будет иметь проблемы с производительностью.

Похоже, вам нужен указатель на вашем первичном ключе.

0

Если таблица, на которую вы вытаскиваете, имеет кластерный индекс на ПК (который должен), тогда возврат записей в порядке PK должен иметь нулевое влияние на производительность. Любые проблемы с производительностью, вероятно, связаны с большим количеством записей, которые вы возвращаете (не для ORDER BY).

Я не думаю, что понимаю, что вы пытаетесь сделать, точно. Но возвращение записей в этом порядке не должно быть проблемой.

Смежные вопросы