2010-08-19 37 views
0

我正在研究ASP.NET MVC項目,該項目允許用戶通過一次添加items子句構造任意複雜的查詢。使用SQL Server和.NET構建增量查詢

然後,應用程序生成適當的SQL,運行它(當前使用SQL Server 2008)並顯示結果,其中包含每個添加項目的匹配記錄數。

例如

UserQuery:

已ConditionA(45)
而ConditionB(33)
或者ConditionC(55)
而ConditionD(15)

共有48條

的問題是如何以最佳方式構建和運行SQL,從而在考慮到性能和可伸縮性的情況下生成這些結果。

初始實現依次爲每個項目(與前一個結合)構建一個查詢(使用子查詢),並將它們作爲標量單獨運行。每個執行都涉及生成SQL並打開新的SqlConnection,創建新的SqlCommand並執行。

我花了一段時間重新編寫這個來產生一個查詢(它使用CTE)返回一行,每個項目的結果作爲一列。

這隻需要一個執行和性能似乎略微有利,直到查詢變得複雜和SQL Server開始引發錯誤:

查詢處理器跑出 內部資源,無法 生成查詢計劃

構建和運行此類查詢的最具可伸縮性和有效性的方式是什麼?

回答

0

向前對我們來說,方法是構建使用每個子句,其中每個隨後的條款加入塗布(通過聯盟/交叉口/異常),以從先前的條款所產生的臨時表的臨時表的查詢。

一個臨時表也對結果產生,並且與不是Temptable Id和行數爲每個已更新,因爲它們填充。

當查詢已被處理從結果臨時表,其通過項目分解給了一個完整的項目選擇的所有行返回的結果。

這對於防止巨大的SQL查詢statments具有許多許多子查詢的需要,也避免了同一個SQL的不斷重新執行,提供在scalbility和性能龐大的改善。

2

如何使用LINQ?

您可以將IQueryable作爲直接啓動的from t in table select t並繼續向其添加表達式(通過Where),然後讓LINQ to SQL提供程序生成查詢。您只需要一些代碼將任意ConditionA表達式(可能的文本)編譯成等效的lambda表達式。這是不平凡的。

希望LINQ提供程序將所有表達式合併爲一個WHERE子句並避免子查詢。

最終,儘管如此,你不能有一個包含過濾表達式的查詢ad nauseam,無論你如何表達它,有時會變得複雜。

+0

感謝您的提問 - 一個有用的建議,因爲它讓我以不同的方式考慮問題。儘管我沒有機會嘗試和實施它。 – TonE 2010-09-23 11:25:47

0

您支持從每個條件返回的結果以及提供的所有條件,這是不必要的。如果他們想知道一個條件的結果,他們可以單獨運行這個條件來獲得它。

我會將這些子句存儲在一個表中,並讓一個sp將其查詢條件附加到一個WHERE子句中。對於每個條件子句,可能會少於服務器的一個子查詢。

0

我不確定背後的要求,但你可能想考慮一些替代方案。

首先,你真的獲得通過展示對受各條記錄數什麼?在你的例子中,這些數字並不能真正理解查詢的整體影響。刪除這可能會簡化一些事情。

你可以去客戶端解決方案,在那裏你可以使用JavaScript框架來篩選結果?

我一直參與嘗試做類似的項目;最後,只有少數人需要進行復雜的即席查詢,而我們最終只是給他們提供了適當的報告工具。