簡體   English   中英

內部查詢的sql優化

[英]sql optimisation for inner query

我有一個頁面網站,每個頁面可能屬於幾個類別。 用戶被分配到類別,並且如果為頁面分配了用戶所屬的類別,則他們可以看到該頁面。

最初每個頁面屬於一個類別,我可以加入此表並檢查權限,如此

where Sec.[level] > 0

既然頁面可以有多個類別,我試圖改變過濾掉結果的SP的where語句,雖然它有效但效率很低。 我獲得了所有類別的最大權限,如果至少有一個大於零,則授予訪問權限

WHERE 
        (

            (TLA.RecipientTypeID = 2 and (SELECT MAX(CAST(dbo.PersonHasPermission_forSection(CS.SectionID, @pViewersID, 1) AS tinyint))
                                          FROM CONTENT_SECTION CS
                                          WHERE CS.ContentID = tla.RecipientID) > 0
            )
            OR
            (TLA.RecipientTypeID <> 2 AND Sec.[level] > 0)
        )

或者因為只有頁面有多個貓,其他類型的內容仍然只有一個。

我不知道這里是否有足夠的信息,但任何優化提示將不勝感激。

根據您的WHERE語句,執行緩慢的主要原因是為內部子查詢中的每一行調用一個函數。 我認為您不應該搜索MAX()並將其與0進行比較,在這種情況下您掃描所有表。 而不是嘗試使用這樣的EXISTS來查找只有一個權限> 0的記錄 - 它應該是:

and EXISTS(SELECT * FROM CONTENT_SECTION CS 
             WHERE CS.ContentID = tla.RecipientID
             AND 
            (CAST(dbo.PersonHasPermission_forSection(CS.SectionID, @pViewersID, 1) 
                       AS tinyint)>0)
           ) 

在效率低下的情況下,通常需要重復調​​用函數。 有時通過消除對函數的多次調用可以獲得很大的效率提升。 一種方法是使用臨時表。 所以,這可能是值得探討的事情。

但是,我想從您的特定SQL退一步,因為我認為數據建模和方法可能存在潛在問題。 按照你所描述的情況:

我有一個頁面網站,每個頁面可能屬於幾個類別。 用戶被分配到類別,並且如果為頁面分配了用戶所屬的類別,則他們可以看到該頁面。

對於這種情況的最佳數據模型是三個“實體”表(類別,用戶和頁面),它們之間具有多對多關系; 多對多關系意味着要加入兩個額外的表(UserCategory和PageCategory):

具有5個表的示例數據庫結構

在這種情況下,要獲取特定用戶可以看到的所有頁面的列表,您可以使用類似此示例的查詢(這非常有效):

SELECT p.*
FROM UserCategory uc
  INNER JOIN PageCategory pc ON uc.CategoryID = pc.CategoryID
  INNER JOIN Page p ON pc.PageID = p.PageID
WHERE uc.UserID = @pViewersID

這是一個半笛卡爾式連接,但在這種情況下,這就是你想要的。 另請注意,為了使給定的示例查詢具有最佳的SELECT效率,您還需要UserCategory.UserID上的索引。

最后,我刪除了[Level]列,因為它似乎只用於真/假檢查(“大於0”),這已經由UserCategory中的row-exists-or-not處理。 但是,如果您確實需要多個權限級別(超過0或1),請注意您還可以在UserCategory中包含[Level]列,並在示例查詢中引用它以獲得最低的額外成本。

暫無
暫無

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

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