簡體   English   中英

超時已過。 在操作完成之前超時時間已過

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

我是一個存儲過程,它選擇具有分頁條件的文件在這個問題中,當運行這個存儲過程時,得到一個異常

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

如何在沒有上述異常的情況下再次工作?

我的研究和嘗試:

我在兩個數據庫服務器(生產和測試)上比較了相同的數據庫。 測試服務器可以工作,生產服務器不能。

我更改了連接字符串以添加“連接超時=30000”(5 分鍾)

我還在文件列表方法中添加了 CommandTimeOut=30000。

附加信息:Prod的db服務器和IIS服務器放在不同的服務器上。 我搜索了一些文章,因為數據庫服務器上的連接速度慢或流量大。 但是我今天第一次遇到這個錯誤。

我的存儲過程位於下方

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

添加 OPTION RECOMPILE 並轉換不可 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

由於數據庫服務器的 memory 較低,我通過在 SQL Server management studio 上調整 memory 解決了這個問題。

如果記錄很高,則查詢執行可能需要很長時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM