Тайм-аут истек. Период ожидания истек до завершения операции - PullRequest
0 голосов
/ 24 апреля 2020

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

Timeout expired. The timeout period elapsed prior to completion of the operation

Как снова работать без исключения?

Мои исследования и попытки:

Я сравнивал одну и ту же базу данных на двух серверах баз данных (prod и test). Тестовый сервер может работать, а продакшн - нет.

Я изменил строку подключения, добавив «connect timeout = 30000» (5 минут)

Я также добавил CommandTimeOut = 30000 в методе списка файлов.

Дополнительная информация: Сервер базы данных Prod и сервер IIS размещены на разных серверах. Я искал некоторые статьи и из-за медленного соединения или более тяжелого трафика c на сервере БД. Но я впервые столкнулся с этой ошибкой сегодня.

Моя хранимая процедура расположена ниже

ALTER PROCEDURE [dbo].[inwsDosyaListesiSirali]
@SiteId INT,
@KullaniciId int,
@SubeIp varchar(max),
@DepartmanId int,
@KategoriKod VARCHAR(200)= null,
@Baslik VARCHAR(100) = null,
@IlkTarih DATETIME=null,
@SonTarih DATETIME=null,
@Icerik varchar(max) = null,
@PageNumber INT=1,
@PageSize   INT=10,
@SortColumn varchar(100)=null,
@SortOrder BIT=null
AS 
BEGIN 

DECLARE @KategoriKodListe TABLE(KategoriKod VARCHAR(20)  primary key);

INSERT INTO @KategoriKodListe
SELECT Item FROM dbo.SplitString(@KategoriKod,',')

declare @SubeId int,        
        @DepartmanTurId int ,
        @SubeKategoriKod varchar(100)


 SELECT @DepartmanTurId=[DepartmanTurId]  FROM [Departman] 
 where [SiteId]=@SiteId and [Id] = @DepartmanId

 select @SubeId=ks.SubeId, @SubeKategoriKod = ksk.Kod from [dbo].[KurumsalSube] ks 
 inner join  [dbo].[KurumsalSubeKategori] ksk on ks.KategoriId = ksk.KategoriId
 where SiteId=@SiteId and SubeIp like '%'+@SubeIp+'%'         
  ;With EMP AS (
 SELECT 
         r.RaporId
        ,r.HistoryId
        ,r.Baslik
        ,r.DosyaAd
        ,r.RaporAktifTarih
        ,r.RaporGecerlilikTarih
        ,r.RaporTarih
        ,r.KategoriId
        ,h.KayitTarih
        ,r.ParentRaporId
        ,kat.Ad [KategoriAd]
        ,kat.Kod [KategoriKod]
        ,kat.Sira
        ,T.DosyaTurId
        ,T.Ad AS DosyaTurAd
        --,T.Uzanti AS DosyaUzanti
        ,T.iconName
        --,(ROW_NUMBER() OVER (PARTITION BY r.[KategoriId] ORDER BY r.[RaporTarih] desc)) AS number
        ,s.SistemDosyaId
        ,s.DosyaAdi as SistemDosyaAd
         FROM Dosya r
        INNER JOIN DosyaKategori kat ON kat.KategoriId=r.KategoriId 
        INNER JOIN DosyaHistory h   ON h.Id=r.HistoryId
        LEFT JOIN DosyaTur T ON T.DosyaTurId=r.DosyaTurId
        LEFT JOIN DosyaIcerik di ON r.SistemDosyaId = di.SistemDosyaId
        --Yetki kontrol kısmı
        left join [dbo].[DosyaYetki] dy on r.DosyaYetkiId = dy.DosyaYetkiId
        LEFT JOIN SistemDosyalari s ON s.SistemDosyaId=r.SistemDosyaId


        WHERE kat.SiteId=@SiteId AND  r.IsOnay=1 
         AND (isnull(@KategoriKod,'') = '' or exists(select 1 from @KategoriKodListe k where k.KategoriKod=kat.Kod)  )
         AND ((NULLIF(r.RaporGecerlilikTarih,'') IS NULL OR (r.RaporGecerlilikTarih >= GETDATE())))
        AND ((NULLIF(r.RaporAktifTarih,'') IS NULL OR (r.RaporAktifTarih <= GETDATE())))
     --   AND ((NULLIF(@Baslik,'') IS NULL OR (r.Baslik like '%'+@Baslik+'%' ) OR NULLIF(r.ParentRaporId,'') IS NOT NULL))
        --AND ((NULLIF(@IlkTarih,'') IS NULL OR (@IlkTarih<=CONVERT(date, DATEADD(day,0,r.RaporTarih)))))
        --AND ((NULLIF(@SonTarih,'') IS NULL OR (@SonTarih>=CONVERT(date, DATEADD(day,0,r.RaporTarih)))))
        --AND ((NULLIF(@Icerik,'') IS NULL OR (di.Icerik like '%'+@Icerik+'%') OR NULLIF(r.ParentRaporId,'') IS NOT NULL))
            --Yetki kontrol kısmı
        and (
        dy.DosyaYetkiId is null or  
        (
            dy.SiteId=@SiteId and

            ( 
                 r.DosyaYetkiId is null or  r.[HerkeseGosterilsin]=1 or -- herkese açık demek oluyor
                 (@DepartmanTurId=1 and @SubeKategoriKod='INGENELMUDURLUK' ) or -- Kategori Kod : INGENELMUDURLUK ve yönetim departmanında ise tüm dosyaları görebilsin
                 (
                    (
                        -- Isnull(dys.SubeId,'')='' or 
                        -- dys.SubeId=@SubeId  

                        exists(select 1 from [dbo].[DosyaYetkiSube] dys where dys.SubeId=@SubeId ) 
                        or not exists(select 1 from [dbo].[DosyaYetkiSube] dys where dys.DosyaYetkiId=r.DosyaYetkiId )

                    )and
                    (
                        @DepartmanTurId=1 -- @DepartmanTurId=1 ise şubenin yönetici olarak o şubede ki tüm dosyaları görebilir
                        -- or Isnull(dyd.DepartmanId,'')='' 
                        -- dyd.DepartmanId=@DepartmanId

                        or  exists(select 1 from [dbo].[DosyaYetkiDepartman] dyd where dyd.DepartmanId = @DepartmanId)  
                        or not exists(select 1 from [dbo].[DosyaYetkiDepartman] dyd where dyd.DosyaYetkiId = r.DosyaYetkiId )

                    )and
                    (
                        @DepartmanTurId=1 -- @DepartmanTurId=1 ise şubenin yönetici olarak o şubede ki tüm dosyaları görebilir
                        -- or Isnull(dyp.PersonelId,'')='' 
                        --  dyp.PersonelId=@KullaniciId 
                        or  exists(select 1 from [dbo].[DosyaYetkiPersonel] dyp where dyp.PersonelId=@KullaniciId ) 
                        or not exists(select 1 from [dbo].[DosyaYetkiPersonel] dyp where dyp.DosyaYetkiId = r.DosyaYetkiId )
                    )
                 )
            )
        )
 )
         ),
         cte AS
         (
          SELECT CAST(ROW_NUMBER() OVER(order by
  CASE WHEN (RTRIM(LTRIM(@SortColumn)) IS NULL)
                 THEN KayitTarih END DESC,
 CASE WHEN (@SortColumn = 'Baslik' AND @SortOrder=1)
              THEN Baslik  END ASC,
  CASE WHEN (@SortColumn = 'Baslik' AND @SortOrder=0)
              THEN Baslik  END DESC,
  CASE WHEN (@SortColumn = 'Tarih' AND @SortOrder=1)
              THEN KayitTarih  END ASC,
  CASE WHEN (@SortColumn = 'Tarih' AND @SortOrder=0)
              THEN KayitTarih  END DESC


          ) AS REAL) AS NUMBER, 1 AS Indent,  Parent.* FROM EMP Parent WHERE Parent.ParentRaporId IS NULL
          UNION ALL
           SELECT  c.NUMBER + (CAST(ROW_NUMBER() OVER(ORDER BY
              CASE WHEN (RTRIM(LTRIM(@SortColumn)) IS NULL)
                 THEN child.KayitTarih END DESC,
 CASE WHEN (@SortColumn = 'Baslik' AND @SortOrder=1)
              THEN child.Baslik  END ASC,
  CASE WHEN (@SortColumn = 'Baslik' AND @SortOrder=0)
              THEN child.Baslik  END DESC,
  CASE WHEN (@SortColumn = 'Tarih' AND @SortOrder=1)
              THEN child.KayitTarih  END ASC,
  CASE WHEN (@SortColumn = 'Tarih' AND @SortOrder=0)
              THEN child.KayitTarih  END DESC



           ) AS REAL)/POWER(10, c.Indent) ) AS NUMBER, c.Indent + 1 AS Indent,  child.* FROM EMP 
    child INNER JOIN cte c ON child.ParentRaporId= c.RaporId

         ),Count_CTE AS (
              SELECT COUNT(*) AS [TotalCount]
         FROM cte
           WHERE (NULLIF(@Baslik,'') IS NULL OR (cte.Baslik like '%'+@Baslik+'%' ))
        AND ((NULLIF(@IlkTarih,'') IS NULL OR (@IlkTarih<=CONVERT(date, 
       DATEADD(day,0,cte.RaporTarih)))))
        AND ((NULLIF(@SonTarih,'') IS NULL OR (@SonTarih>=CONVERT(date, 
      DATEADD(day,0,cte.RaporTarih)))))
      )         SELECT * FROM cte, Count_CTE
       WHERE (NULLIF(@Baslik,'') IS NULL OR (cte.Baslik like '%'+@Baslik+'%' ))
        AND ((NULLIF(@IlkTarih,'') IS NULL OR (@IlkTarih<=CONVERT(date, DATEADD(day,0,cte.RaporTarih)))))
        AND ((NULLIF(@SonTarih,'') IS NULL OR (@SonTarih>=CONVERT(date, DATEADD(day,0,cte.RaporTarih)))))           
        ORDER BY cte.NUMBER 
        OFFSET (@PageNumber-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY        
   END

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Я решил эту проблему с настройкой памяти на SQL Студия управления сервером из-за нехватки памяти на сервере базы данных.

Если запись высокая, выполнение запроса может занять много времени.

0 голосов
/ 24 апреля 2020

Добавьте OPTION RECOMPILE и преобразуйте операторы non-SARGable where. см http://sommarskog.se/dyn-search.html

например

((NULLIF(@IlkTarih,'') IS NULL OR (@IlkTarih<=CONVERT(date, DATEADD(day,0,cte.RaporTarih)))))

должно быть

@IlkTarih is null or cast(@IlkTarih as date)<=cte.RaporTarih
...