[英]Dynamic query optimization
我有一項業務任務,基本上只是從數據庫中提取數據(Microsoft SQL Server 2008)。 在此過程中,用戶將能夠選擇要選擇的列,選擇要從中選擇的視圖,以及構建WHERE子句。 根據用戶選擇的內容,相應地構造SQL查詢。 要求是用戶可以從任何視圖中選擇任何列,並按WHERE子句中的ANY列進行過濾。 該公司不希望該解決方案使用數據倉庫/ OLAP,並希望限制任何第三方軟件。 所以基本上他們只需要一個.NET Windows Forms應用程序,它基於GUI動態構建SQL查詢並連接到數據庫。
我關心的是如何優化查詢。 我還不擅長優化SQL查詢,但我首先想到的是:如果用戶選擇過濾沒有索引的列(在WHERE子句中)會怎么樣? 通過為用戶提供如此大的靈活性,他們可能構建無效的查詢,以至於需要很長時間才能執行。
我意識到,如果對沒有索引的列進行過濾,那么對於大量數據來說,性能永遠不會很好,但我能做些什么來改進它? 當然,我不能只為所有列添加索引。
我不一定只是尋找查詢優化,但我也在考慮是否有任何服務器調整,我可以做,如緩存? 基本上我都是耳朵,並尋找任何可以幫助我提高性能的建議。
有什么建議?
先感謝您!
除了預測用戶可能會做什么之外,你真的做不了多少。 您可以讓SQL Server優化器為您完成艱苦的工作(想象一下在鍵值存儲上構建它!)。
我會在最有可能的列上創建索引,這些列將被過濾或排序。 您應該嘗試將這些索引過濾為非空值,這將降低存儲成本(假設用戶不會過濾空值)。
您還可以嘗試使用索引視圖預先計算公共連接和聚合。 如果你願意在這個問題上投入瘋狂的RAM,並且願意寫慢寫,你可以索引並實現這個數據庫的地獄。
最后,您可以在只讀日志傳送目標等上卸載用戶查詢。 這將沙盒他們可怕的查詢。
對於您的查詢,您需要對它們進行參數化,但在所有情況下都不需要對它們進行緩存。 如果您的查詢往往成本很高(因此編譯時間無關緊要),您將需要使用OPTION RECOMPILE運行它們,以便SQL Server可以適應所有參數的確切運行時值。
您還應該監視所有查詢並查看它們以查找模式。 您的用戶可能會一直運行非常相似的查詢。 他們的索引。
定期運行sp_updatestats。
最后,我想說沒有非常有效的解決方案,因為如果有SQL Server會自己實現它們,所以每個人都可以受益。
首先,提高SQL Server優化,緩存和編譯查詢/語句的能力
WHERE C1 = 'foo' AND C3 = 'bar' AND C2 = 42 -- if C3 is an indexed column then WHERE C3 = @parm1 AND C1 = @parm2 AND C2 = @parm3
第二,賦予用戶權力
編輯或 - >和或關於馬丁史密斯的評論,這稱為短循環。
考慮邏輯
A = True OR B = True OR C = True
如果A確實為真,則無需評估B或C以確定條件為真
A = True AND B = True AND C = True
在這種情況下,如果A為False,則不需要評估B或C以使條件為假。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.