2008-09-17 2 views
31

У меня есть процесс ETL, который включает в себя хранимую процедуру, которая сильно использует операторы SELECT INTO (минимально регистрируемые и, следовательно, быстрее, поскольку они генерируют меньше трафика журнала). Из партии работы, которая имеет место в одной конкретной сохраненной хранимой процедуре, некоторые из самых дорогих операций - это энергичные буферы, которые, как представляется, просто забудут результаты запроса, а затем скопируют их в только что созданный стол.Способы избегать операций очереди на SQL Server

Документация MSDN на eager spools довольно редкая. Кто-нибудь имеет более глубокое понимание того, действительно ли это необходимо (и при каких обстоятельствах)? У меня есть несколько теорий, которые могут или не могут иметь смысл, но не удастся устранить их из запросов.

Файлы .sqlplan довольно большие (160kb), поэтому я думаю, что, вероятно, нецелесообразно публиковать их непосредственно на форуме.

Итак, вот несколько теорий, которые могут быть пригодны для конкретных ответов:

  • Запроса используют некоторые пользовательские функции для преобразования данных, таких как разбор отформатированных дат. Требуется ли это преобразование данных, чтобы использовать горячие буферы для распределения разумных типов (например, длины varchar) в таблице до того, как он их построит?
  • Как расширение вопроса выше, имеет ли кто-либо более глубокое представление о том, что делает или не управляет этой операцией в запросе?

ответ

24

Мое понимание буферизации - это что-то вроде красной селедки на вашем плане выполнения. Да, на него приходится большая часть ваших запросов, но на самом деле это оптимизация, которую SQL Server берет на себя автоматически, чтобы избежать дорогостоящего повторного сканирования. Если вы избежите буферизации, стоимость дерева исполнения, на котором он сидит, будет расти, и почти наверняка стоимость всего запроса увеличится. У меня нет никакого конкретного представления о том, что конкретно может заставить оптимизатор запросов базы данных анализировать выполнение таким образом, особенно, не видя кода SQL, но вы, вероятно, лучше доверяете его поведению.

Однако это не означает, что ваш план выполнения не может быть оптимизирован, в зависимости от того, что вы делаете и как изменчивы ваши исходные данные. Когда вы делаете SELECT INTO, вы часто увидите элементы буферизации в вашем плане выполнения, и это может быть связано с чтением изоляции. Если это подходит для вашей конкретной ситуации, вы можете попытаться просто снизить уровень изоляции транзакций на что-то менее дорогое и/или использовать подсказку NOLOCK. Я нашел в сложных критически важных критических запросах, что NOLOCK, если он безопасен и подходит для ваших данных, может значительно увеличить скорость выполнения запроса, даже если, по-видимому, нет причин.

В этой ситуации, если вы попробуете READ UNCOMMITTED или подсказку NOLOCK, вы можете устранить некоторые из катушек. (Очевидно, вы не хотите этого делать, если это может привести к посадке вас в противоречивое состояние, но все требования к изоляции данных разные). TOP оператор и оператор OR могут иногда вызывать подкачку, но я сомневаюсь, что вы делаете какие-либо из тех, кто в процессе ETL ...

Вы правы, говоря, что ваши UD также могут быть виновником. Если вы используете только один UDF один раз, было бы интересным экспериментом, чтобы попытаться установить их в линию, чтобы увидеть, получаете ли вы большую выгоду от производительности. (И если вы не можете понять, как написать их в строке с запросом, возможно, поэтому они могут вызвать буферизацию).

Последнее, что я хотел бы посмотреть, это то, что если вы делаете какие-либо объединения, которые могут быть переупорядочены, попробуйте использовать подсказку, чтобы заставить порядок соединения произойти в том, что вы знаете, как самый избирательный порядок. Это немного досягаемо, но вам не повредит, если вы уже оптимизированы.

+0

Простая изоляция может быть применима в качестве технологических запросов из промежуточной области, скопированной из источника. Кроме того, даже если это не устраняет мою конкретную проблему, она добавляет немного понимания, поскольку это не упоминается ни в одной из литературы MSDN, которую я мог бы найти в отношении энергичных операций с катушкой. – ConcernedOfTunbridgeWells 2008-09-18 09:57:58

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