Published on

June 4, 2000

Как избежать системных узких мест при заполнении временных таблиц в SQL Server

Вы знали, что заполнение временной таблицы в SQL Server может вызвать системные узкие места на вашем сервере? В этой статье мы рассмотрим проблемы, которые могут возникнуть, и как их избежать.

Узкие места в SQL Server 6.5

В SQL Server 6.5 многие люди используют запрос “select…into” для создания временной таблицы. Хотя этот метод работает, он создает блокировки во временной базе данных на протяжении выполнения оператора select. Эта блокировка мешает другим пользователям создавать временные таблицы, вызывая узкое место.

Фактическое местоположение узкого места – блокировка системных таблиц tempdb. Если несколько процессов пытаются одновременно загрузить временные таблицы, особенно с большим объемом данных, узкое место неизбежно.

Чтобы избежать этого узкого места, важно как можно быстрее завершить операцию “create temporary table”. Один из способов сделать это – перекодировать оператор в следующем формате:

create table #temp(
    ........
)

insert #temp
select *
from sourceTable

Таким образом, временная таблица создается, и блокировка sysobjects или схемы освобождается как можно быстрее.

Если вы хотите избежать кодирования оператора “insert…into” или если вы пишете общий код и не знаете точного определения таблицы до выполнения, вы можете использовать следующий трюк:

select *
into #temp
from sourceTable
where 1 = 0

insert #temp
select *
from sourceTable

Используя “where 1 = 0”, оптимизатор SQL Server понимает, что условие никогда не будет истинным и не просматривает исходную таблицу. Таблица #temp все равно будет определена на основе оператора select, но она не будет содержать строк. Это позволяет выполнить оператор insert…select без блокировки доступа других процессов к tempdb.

Узкие места в SQL Server 6.5 и 7

В большинстве случаев проблема, описанная выше, не относится к SQL Server 7. Однако есть один случай, когда вы все равно можете непреднамеренно создать эти узкие места в обеих версиях.

Проблема возникает, когда вы используете оператор “INSERT…EXEC” для загрузки временной таблицы, и сама хранимая процедура создает временные таблицы. Это приводит к блокировке в tempdb, аналогичной описанной ранее проблеме.

Рекомендуемые обходные пути – либо полностью избегать использования этого метода, либо выполнять хранимую процедуру как удаленную хранимую процедуру с использованием “INSERT #temp EXEC server.database.owner.proc”. Однако эти обходные пути могут быть не идеальными во всех случаях.

Для получения дополнительной информации о проблемах блокировки tempdb в SQL Server 6.5 вы можете обратиться к этой статье Technet: [вставьте ссылку]. Кроме того, эта статья предоставляет информацию для обеих версий 6.5 и 7: [вставьте ссылку].

Следуя этим bewt практикам, вы можете избежать системных узких мест при заполнении временных таблиц в SQL Server и обеспечить плавную производительность для операций с базой данных.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.