0

私は実行に約1分かかる次のクエリがあります。Sql Select Query Performance

public static Func<Entities, string, IQueryable<string>> compiledInvoiceQuery = 
      CompiledQuery.Compile((Entities ctx, string orderNumb) => 
        (from order in ctx.SOP10100 
        where order.ORIGNUMB == orderNumb 
        select order.SOPNUMBE).Union(
               from order in ctx.SOP30200 
               where order.ORIGNUMB == orderNumb 
               select order.SOPNUMBE) 
               ); 

私の主キーではないORIGNUMBに基づいてフィルタリングします。インデックスを置くことさえできません。それをもっと速くするための他の方法はありますか?私は、SQLサーバー上でテストされ、唯一のクエリ

from order in ctx.SOP10100 
where order.ORIGNUMB == orderNumb 
select order.SOPNUMBE 

または

select SOPNUMBE 
from SOP10100 
where ORIGNUMB = @orderNumb 

以上55秒を取っていることがわかりました。提案してください。

+0

選択条件の中で唯一の要素である「ORIGIN」があるため、パフォーマンスを向上させるために、その特定の列を索引付けする方法はありません。 – dasblinkenlight

+0

インデックスを作成できない場合は、クエリを書き換えて選択性の高いものにすることができます(索引なしの場合はほとんどありません)。 –

+1

なぜそれをインデックスできませんか? – HLGEM

答えて

1

サーバで55秒かかる場合は、linqを使用しています。 1つが必要なため、インデックスを作成できないのはなぜですか?

他のオプションは、レコードを(インデックス付き列を使用して)フィルタリングして、順序番号の一致を検索する前に。

0

LINQ to SQLの大きな問題の1つは、生成するSQLをほとんど制御できないことです。

あなたは結合ではなく結合を実行しているので、非常に単純なSQLである必要があります。このような何か:

SELECT * 
FROM SOP10100 
WHERE ORIGNUMB = 'some number' 
UNION 
SELECT * 
FROM SOP30200 
WHERE ORIGNUMB = 'some number' 

あなたはSQLがこのまたはより複雑なもののようなものであるかどうかを確認するためにデータベースに対して実行されているSQL文を参照してくださいSQL Serverプロファイラを使用することができます。その後、SQL Server Management Stuidoで生成されたSQLを実行して、クライアント統計をインクルードし、実際の実行計画を含めると、パフォーマンスの問題の原因を正確に把握できます。