0

アプリケーションのデータ プルの 1 つで、パフォーマンスの悪夢に見舞われました。状況は、大量の顧客リストを持っている地域ベースのクエリ用であり、顧客が表示したときにその地域の顧客のみが表示されるはずです。現在の表 (説明を簡単にするために省略):

Customer (Table):
CustomerID
FirstName
LastName
....

RegionCustomer (Table):
RegionCustomerID
RegionID
CustomerID

これは、次のステートメントを使用して .net エンティティ フレームワークを介して取得されます (edmx は、1 人の顧客が多数の RegionCustomer を持つことができる 1 対多の関係を設定します)。

EntitiesManager.Customers.Where(function(x) x.RegionCustomers.Any(function(y) y.RegionID = CurrentUserRegionID)).ToList()

これは、どちらかのテーブルで 1000 未満のレコードを処理している場合は正常に実行されますが、その後はパフォーマンスの悪夢です。SQL サーバーが CPU を回転させて衝撃的なことを行い、時間がかかります。上記のステートメントが作成する SQL は、実行する必要があることに対してかなり厄介です (SQL プロファイラーで追跡)。

これを高速化する方法について誰かがアイデアを持っているかどうか疑問に思っていますか?

前もって感謝します

4

1 に答える 1

0

RegionCustomers から始めると役立つはずです。

EntitiesManager.RegionCustomers.Where(function(regionCustomer) regionCustomer.RegionID = CurrentUserRegionID).SelectMany(function(regionCustomer) regionCustomer.Customers).ToList()

私は VisualBasic の構文に慣れていませんが、それが正しくない場合、C# では次のようになります。

EntitiesManager.RegionCustomers.Where(regionCustomer => regionCustomer.RegionID == CurrentUserRegionID).SelectMany(regionCustomer => regionCustomer.Customers).ToList();

SQLは次のようなものになると思います:

SELECT * FROM Customer WHERE CustomerID IN (SELECT CustomerID FROM RegionCustomer WHERE RegionID = {0})

また、skip().take() を使用したページングと、CustomerId の Customer との外部キー関係を使用して RegionCustomer テーブルを最適化することを検討することもできます (存在しない場合)。それはかなり高速なクエリになるはずです。

また、実行計画をチェックして、SQL Server に提案があるかどうかを確認してください。

幸運を!

于 2013-06-04T06:31:05.313 に答える