4

当社のテーブルは、スペースが埋められたフィールドで作成されました。

DB に変更を加えるためのアクセス/権限がありません。

ただし、Trim() 関数を使用して LINQ クエリを作成すると、パフォーマンスがかなり低下することに気付きました。

次のような単純なクエリは、パフォーマンスが低下することを示しています。

Companies
.Where(c => c.CompanyName.Equals("Apple"))
.Select(c => new {
  Tick = c.Ticker.Trim(),
  Address = c.Address.Trim()
});

パフォーマンスが低下しないようにクエリを変更する方法はありますか?

それとも、これは私の DBA だけにかかっているのでしょうか?

4

3 に答える 3

0

Entity Framework 以外では、linq-to-sql は、SQL に変換できないメソッド呼び出しに遭遇したときに、内部で linq-to-objects に切り替えることがあります。だからあなたがするなら

....
.Select(c => new {
  Tick = c.Ticker.TrimEnd().TrimStart(),
  Address = c.Address.TrimEnd().TrimStart()

生成された SQL には が含まれなくなりLTRIM(RTRIM())、フィールド名のみが含まれ、トリミングがクライアント メモリで実行されることがわかります。どうやら、どういうわけかLTRIM(RTRIM())効率の悪いクエリプランを引き起こします(驚くべきことに)。

TrimEnd()先頭にスペースがない場合にのみ十分かもしれません。

さらに、クエリ内の不良データを修正するのではなく、データベースをクリーンアップするために最善を尽くす必要があるという pswg の意見に完全に同意します。この仕事ができない場合は、適切な人を見つけて腕をねじってください。

于 2013-08-06T14:27:19.170 に答える
0

"Like" ステートメントを使用して最初のラウンド フィルターを実行し、それを .ToList() にした場合のパフォーマンスは試していません。

var result = (Companies
            .Where(c => c.CompanyName.StartsWith("Apple"))
            .Select(c => new
            {
                Tick = c.Ticker.Trim(),
                Address = c.Address.Trim()
            })).ToList();

 var result1=result
            .Where(c=>c.CompanyName.Trim().Equals("Apple")) 
            .Select(c => c);
于 2013-08-05T05:56:54.040 に答える