Что может вызвать таймауты на одной таблице - PullRequest
4 голосов
/ 05 июля 2011

Я получаю следующую ошибку ТОЛЬКО для запросов, выполняемых в таблице ReportingPeriod (см. Ниже).Это происходит даже тогда, когда я закомментирую связанный LEFT JOIN в другой таблице.В таблице не более 200 записей.Кроме того, не имеет значения, запускаю ли я запрос напрямую или использую хранимую процедуру.Наконец, другие таблицы и процедуры работают нормально.

Есть идеи, что может вызвать это?

ВЕРСИЯ Sql-Server 2005

ОШИБКА: Тайм-аут истек.Время ожидания истекло до завершения операции или сервер не отвечает.

RAW QUERY:

DECLARE @ProjectsKey INT
SET @ProjectsKey = 1234
-----------------------------
    SELECT 
        ReportingPeriodKey
        ,ReportingPeriod.ProjectsKey
        --,Phase.PhaseKey AS PhaseKey
        --,Phase.Name AS PhaseName
        ,[Type]
        ,ReportingPeriodStart
        ,ReportingPeriodEnd
    FROM   
        ReportingPeriod
--  LEFT JOIN
--  (
--      SELECT
--          PhaseKey
--          ,ProjectsKey
--          ,Name
--      FROM dbo.Phase
--  ) AS Phase ON Phase.PhaseKey = dbo.ReportingPeriod.PhaseKey
    WHERE
        ((@ProjectsKey IS NOT NULL AND ReportingPeriod.ProjectsKey = @ProjectsKey) OR @ProjectsKey IS NULL)
    ORDER BY
        ReportingPeriodStart

ОПРЕДЕЛЕНИЕ ТАБЛИЦЫ:

SET ANSI_NULLS ON GO SET
QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[ReportingPeriod](
    [ReportingPeriodKey] [int] IDENTITY(1,1) NOT NULL,  
    [ProjectsKey] [int] NOT NULL,   
    [PhaseKey] [int] NOT NULL, [Type] [nvarchar](250) NOT NULL,     
    [ReportingPeriodStart] [datetime] NOT NULL CONSTRAINT [DF_ReportPeriod_Start]  DEFAULT (getdate()),     
    [ReportingPeriodEnd] [datetime] NOT NULL CONSTRAINT [DF_ReportPeriod_End]  DEFAULT(getdate()),  
    [CreatedBy] [nvarchar](100) NOT NULL,
    [CreatedDate] [datetime] NOT NULL CONSTRAINT [DF_ReportingPeriod_CreatedDate] DEFAULT (getdate()),  
    [ModifiedBy] [nvarchar](100) NULL,  
    [ModifiedDate] [datetime] NULL,  

    CONSTRAINT [PK_ReportPeriod] PRIMARY KEY CLUSTERED  ( [ReportingPeriodKey] ASC )WITH (PAD_INDEX  = OFF,
    STATISTICS_NORECOMPUTE  = OFF,
    IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]

GO 
ALTER TABLE [dbo].[ReportingPeriod] WITH CHECK 
ADD  CONSTRAINT [FK_ReportingPeriod_attrReportingPeriodType]
FOREIGN KEY([Type]) REFERENCES [dbo].[attrReportingPeriodType] ([FullName]) 

GO 
ALTER TABLE [dbo].[ReportingPeriod]  
CHECK CONSTRAINT [FK_ReportingPeriod_attrReportingPeriodType]

GO 
ALTER TABLE [dbo].[ReportingPeriod] WITH CHECK 
ADD  CONSTRAINT [FK_ReportingPeriod_Phase] 
FOREIGN KEY([PhaseKey]) 
REFERENCES [dbo].[Phase] ([PhaseKey]) 

GO 
ALTER TABLE [dbo].[ReportingPeriod] 
CHECK CONSTRAINT [FK_ReportingPeriod_Phase]

GO 
ALTER TABLE [dbo].[ReportingPeriod] WITH CHECK 
ADD  CONSTRAINT [FK_ReportingPeriod_Projects] 
FOREIGN KEY([ProjectsKey]) 
REFERENCES [dbo].[Projects] ([ProjectsKey]) 

GO
ALTER TABLE [dbo].[ReportingPeriod]
CHECK CONSTRAINT
[FK_ReportingPeriod_Projects]

СТАТИСТИКА СИСТЕМЫ Существует два набора для object_id # 875866187

reserved_page_count = 17 used_page_count = 11 row_count = 306

reserved_page_count = 2 used_page_count = 2 row_count = 306

Ответы [ 4 ]

10 голосов
/ 05 июля 2011

Вы пробовали проверять открытые транзакции, которые могут блокировать таблицу?

dbcc opentran

exec sp_who 69
-- Where the id is the SPID from DBCC OPENTRAN

exec sp_lock 69
-- Where the id is the SPID from DBCC OPENTRAN

select * from sys.objects where object_id = 2089058478
-- Where the id is the ObjID from sp_lock
1 голос
/ 05 июля 2011
Проверьте, не заблокирован ли запрос, запишите sessionID (видимый в нижней части окна запроса) оператора SQL или proc, а затем запустите запрос ниже, проверьте, не является ли столбец BlkBy пустым для вашего sessionID
EXEC SP_WHO2 

Также выполните свой запрос в одном окне, а затем в другом окне выполните запрос ниже, чтобы увидеть, запущены ли какие-либо другие процессы, имеющие блокировку таблицы

 select text, session_id,
start_time, status, db_name(database_id) as DBName, blocking_session_id,
wait_type, wait_resource
from sys.dm_Exec_requests der
cross apply
sys.dm_exec_sql_text (der.sql_handle) 

Также проверьте и измените транзакциюуровень изоляции, допускающий «грязное» чтение, как окончательный вариант, как показано ниже:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Теперь вы также можете проверить все текущие транзакции, использующие это DMV, и найти столбец request_mode для любых блокировок Xclusive в соответствующей таблице.

SELECT * FROM SYS.DM_TRAN_LOCKS
0 голосов
/ 05 июля 2011

Если вы не беспокоитесь о грязных чтениях из таблицы tReportingPeriod, вы можете просто использовать:

FROM ReportingPeriod WITH (NOLOCK)

в вашем запросе.

0 голосов
/ 05 июля 2011

Что-то, скорее всего, заблокировано в одной из выбранных вами таблиц.Вы можете проверить, заблокирован ли ваш процесс, выполнив приведенный ниже запрос, пока он выполняет

select spid, blocked, login_time, nt_username, hostname, program_name 
from sys.sysprocesses

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...