настройка
В хранилище данных я объединяю таблицу фактов с 20 измерениями. Таблица фактов содержит 32 миллиона строк и 30 столбцов. Это временная промежуточная таблица, поэтому мне не приходится иметь дело с другими пользователями, читающими или пишущими эту таблицу. Я выбираю 10 столбцов из базовой таблицы и 20 столбцов из соответствующих измерений. Таблицы измерений маленькие (от 3 до 15.000 строк). Поля, к которым присоединяются, являются целыми числами и nvarchars. Я использую оператор SELECT ... INTO. На таблицах нет индексов.
Скорость выполнения этого запроса слишком мала, чтобы быть полезной.
Пробные решения
Поскольку обработка запроса занимает слишком много времени, я опробовал следующие решения:
- Разделите 20 объединений на 4 объединения на 5 столах. Однако производительность запросов остается низкой.
- Поместите индексы в столбцы внешнего ключа. Нет значительного уменьшения времени.
- Убедитесь, что поля условия соединения являются целыми числами. Я заметил увеличение производительности на 25%. Не совсем то, что я ищу.
- Используйте вставку в утверждение вместо выбора в. Хуже производительность из-за роста файла журнала, хотя база данных находится в простом режиме восстановления.
Эти выводы привели меня к тому, что я включил фактический план выполнения, который показывает, что 89% стоимости находится во вставке таблицы . Другие затраты: 8% сканирования таблицы на таблице фактов и 2% на совпадение хэшей для внутренних объединений.
Вопросов
- Каковы возможные причины медленной вставки таблицы?
- Как определить это узкое место без плана выполнения?
- Какие действия можно предпринять, чтобы снизить стоимость вставки таблицы?