2017-01-09 138 views
1

我有一個具有計算價格,折扣,配額,地點,日期,房間等的可用性複雜的SQL查詢在SQL Server緩存查詢結果Asyncronuosly

當訪問者搜索房間,按日期,人物,第一次放置等, 我試過儘快返回第一頁結果。

在第一頁我只是分析前20名的設施的價格,配額,折扣等

現在我想在製作第一頁緩存所有列表中的高速緩存表分頁和過濾。

我的SP是;從緩存表

GetResultsPage: 

此SP返回頁面的結果,如果有高速緩存,還是回到第一頁,如果沒有緩存。

CreateCache 

該SP計算並插入結果的完整列表到緩存表與CacheId

目前,我從客戶服務呼叫CreateCache後第一頁返回結果。

我知道,我可以創建C#後臺作業或者是第一請求時,從客戶端發送一個並行請求。但是如果2或3個訪問者同時搜索相同的參數,就會出現同樣的衝突。因爲基於搜索參數的緩存列表。這不是個人的。

我想創建一個SQL代理作業,可同時管理緩存列表。該過程如下所示。

1-請求來'GetResultsPage'

2-如果存在高速緩存和高速緩存的時間不超過30分鐘,結果從高速緩存表

3-返回如果有一個高速緩存和高速緩存的時間超過30分鐘,結果返回首頁

4-如果沒有需要重新創建緩存或緩存我應該調用CreateCache異步與參數。

5-當CreateCache正在運行時,另一個CreateCache不應以相同的參數運行。

我需要關於我的策略的一些建議,並聽取一些有關SQL代理作業的經驗是否對性能有任何負面影響。

而且是否會有它可以運行CreateCache SP與prameters和防止多個呼叫我將不勝感激工作的例子。

謝謝。

+0

爲什麼你認爲你需要這些? SQL Server已經爲你自己做了大量的緩存。 – RBarryYoung

+0

因爲我想盡快返回第一頁。如果我計算第一頁請求的所有結果。這將需要很長時間。在第一頁之後,客戶端可以選擇價格順序,或者按照某些類別,便利設施等進行過濾。另外,我測試過,緩存在表上的緩存從SQL自己的緩存中返回5倍。因爲有很多邏輯計算。 –

回答

0

沒有閱讀所有細節,我只解決這部分:

5當CreateCache運行時,另一CreateCache不應該被運行 具有相同的參數。

這很容易實現與sp_getapplock

CREATE PROCEDURE [dbo].[CreateCache] 
    -- Add the parameters for the stored procedure here 
    @Param1 int 
    ,@Param2 int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    BEGIN TRANSACTION; 
    BEGIN TRY 
     DECLARE @VarResource nvarchar(255) = 'CreateCache'; 
     SET @VarResource = @VarResource + '_' + CAST(@Param1 AS nvarchar(255)); 
     SET @VarResource = @VarResource + '_' + CAST(@Param2 AS nvarchar(255)); 

     DECLARE @VarLockResult int; 
     EXEC @VarLockResult = sp_getapplock 
      @Resource = @VarResource, 
      @LockMode = 'Exclusive', 
      @LockOwner = 'Transaction', 
      @LockTimeout = 1, -- play with timeout 
      @DbPrincipal = 'public'; 

     IF @VarLockResult >= 0 
     BEGIN 
      -- Acquired the lock 
      -- Populate the cache 

     END ELSE BEGIN 
      -- do nothing, because there is another instance running already 
     END; 

     COMMIT TRANSACTION; 
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION; 
    END CATCH; 
END 

@Resource名稱由參數值,所以在第二次嘗試來調用此方法,用相同的一組參數將不會獲得鎖。 如果你有很多參數,那不適合255個字符,你可以計算一個散列(參見HASHBYTES)。