2011-11-17 30 views
1

我在以下情況下提高性能感興趣的見解:確定分配給用戶的實體數據庫性能

我目前的工作,因爲它有層次實體結構,其中,根據用戶的級別的應用程序在組織內部,他們將在特定層次上爲特定實體分配任務 - 從而可以訪問其所有子女(本例中位於美國各地區內的建築物)。大多數超級用戶的投資組合中會有20,000個以上的個體實體,其中一些實體的數量多達40,000個。

我們不需要詳細描述,只需要一點點邏輯即可確定用戶有權訪問的所有實體。該邏輯當前使用95%的存儲過程中使用的表函數進行處理。平均存儲過程不超過1 - 2秒即可運行。但是,在調用10多個不同存儲過程的ASP.Net頁面中,性能迅速增長到20多秒。

作爲一種替代方法,我們只考慮一次(登錄時)調用此表函數並將結果存儲在表中(在清除了同一用戶的任何先前值之後)。然後,我們會讓所有的存儲過程引用這個新表而不是表函數。一項測試顯示,從新表中選擇一個耗時15秒的頁面可能會在不到3秒的時間內渲染。

例如:在

  • 系統

    1. 用戶日誌刪除該用戶的所有實體表
    2. 系統插入該用戶的所有實體,然後
    3. 系統發出他們自己的快樂方式不再運行當前會話的表格功能

    我們的con cern認爲,由於行級別鎖定,數百名用戶可能會持續登錄和退出應用程序,因此經常刪除和插入此表可能會導致嚴重的性能下降。有沒有其他人以這種方式使用SQL表?如果是這樣,我們應該關注性能低下,因爲從一個表中不斷插入和刪除。

  • +0

    這是你可以存儲在內存中的每個用戶,在會話中的東西嗎? –

    +0

    我想保留在數據庫中,以避免必須向所有存儲的特效添加參數。這將節省很多時間來創建一個新表格並指出當前的功能。 – jumpdart

    回答

    2

    我已經做了類似的事情,這很好,但它是一個最多有幾百個併發用戶的應用程序,所以它取決於你有什麼樣的規模。如果您遇到死鎖,您可以通過爲每個用戶創建和刪除表來進一步採取措施,但是當用戶的會話過期時,您將不得不放棄表。

    以上兩點都是一些黑客,你應該做的就是維護一個用戶權限表,並在關聯數據發生變化時更新它。雖然取決於您的應用程序,但可能是重新考慮的一個主要部分。

    2

    我認爲這將是一個糟糕的設計,在某些時候你會遇到性能問題。

    我可以考慮兩種方法來解決這個問題,首先你多久需要一個用戶可以訪問的所有實體的列表,用CTE遞增樹會快得多並檢查他們想要訪問的記錄的權限,但這是您模型中的一個重大變化。

    第二個不是在用戶登錄時更新緩存,而是數據發生更改。在分配表上觸發一個觸發器,只要此數據更改將此更改的結果應用於允許的項目表,就會有效地將更改一直向下層疊到樹中。由於數據只在必要時纔會更改,因此性能會更高。

    相關問題