SQL Server COMPILE блокирует? - PullRequest
       6

SQL Server COMPILE блокирует?

0 голосов
/ 09 апреля 2009

SQL Server 2000 здесь.

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

Похоже, что один из этих запросов будет работать, но два других не будут выполнены (клиентский процесс сообщает, что время ожидания истекло, поэтому я предполагаю, что блокировка может это сделать) Процесс запроса имеет блокировку, которая сохраняется до тех пор, пока процесс SQL не будет перезапущен (я получил смелость и попытался убить spid один раз, но он не отпустил). Любые запросы к этой базе данных после зависания блокировки и обвинение первого процесса в ее блокировке.

Процесс сообщает об этих блокировках ... (извиняюсь за форматирование, функция предварительного просмотра показывает его полностью выровненным).

spid    dbid  ObjId       IndId   Type    Resource        Mode    Status
53    17    0           0       DB                      S       GRANT
53    17    1445580188  0       TAB                     Sch-S   GRANT
53    17    1445580188  0       TAB     [COMPILE]       X       GRANT

Я не могу анализировать это слишком хорошо. Объект 1445580188 является sp_bindefault, системной хранимой процедурой в master. Для чего он держится в эксклюзивном замке?

Просмотр кода, чтобы защитить частную собственность ... Я только изменил имена (они оставались согласованными с псевдонимами и так далее) и попытался сохранить все остальное точно таким же.

    SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

ALTER view [dbo].[theView] 
as
select 
    a.[column1] column_1    
    ,b.[column2] column_2
    ,[column3]
    ,[column4]
    ,[column5]
    ,[column6]
    ,[column7]
    ,[column8]
    ,[column9]
    ,[column10]
    ,p.[column11]
    ,p.[column12]
FROM 
    [remoteServer].db1.dbo.[tableP] p
    join [remoteServer].db2.dbo.tableA a on p.id2 = a.id
    join [remoteServer].db2.dbo.tableB b on p.id = b.p_id
WHERE 
    isnumeric(b.code) = 1

GO

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

Ответы [ 2 ]

1 голос
/ 09 апреля 2009

Объект 1445580188 является sp_bindefault в базе данных master , нет? Кроме того, он показывает ресурс = "TAB" = таблица.

USE master
SELECT OBJECT_NAME(1445580188), OBJECT_ID('sp_bindefault')

USE mydb
SELECT OBJECT_NAME(1445580188)

Если второй запрос возвращает NULL, то объект является рабочей таблицей.

Я предполагаю, что генерируется рабочая таблица для локальных результатов. СОЕДИНЕНИЕ произойдет локально, и все данные должны быть обработаны.

Теперь я не могу пролить свет на блокировку компиляции: представление уже должно быть скомпилировано. Это осложняется удаленным доступом к серверу, и мой опыт блокировок при компиляции связан с сохраненными процессами.

1 голос
/ 09 апреля 2009

Взгляните на эту ссылку . Вы уверены, что это представления, которые блокируют, а не хранимые процедуры? Чтобы узнать, запустите этот запрос ниже с ObjId из вашей таблицы выше. Есть вещи, которые вы можете сделать, чтобы смягчить повторную компиляцию хранимых процедур. Самое главное - избегать именования хранимых процедур префиксом sp_, см. эту статью на стр. 10. Также избегайте использования веток if / else в коде, вместо этого используйте предложения where с операторами case. Надеюсь, это поможет.

[Изменить]:

Я считаю, что sp_binddefault / rule используется в сочетании с пользовательскими типами (UDT). Ваша точка зрения ссылается на какие-либо UDT?

SELECT * FROM sys.Objects where object_id = 1445580188
...