簡體   English   中英

動態查詢優化

[英]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優化,緩存和編譯查詢/語句的能力

  • 確保UI支持IN和BETWEEN,同時讓用戶構建自己的WHERE子句。
  • 對AND或OR條件進行排序,使索引列成為第一列,然后是其他列的字母順序。
    • 如果您在WHERE子句中允許嵌套的AND和OR,則可能會更困難
  • 使用*參數化查詢“
 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.

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