2011-03-01 3 views
1

プロジェクトの最適化方法に関するアドバイスを探しています。私たちには、SQL2008データからデータを取得し、DevExpress ASPxGridViewに表示するASP.NET/C#システムがあります。取得されるデータは、いくつかのデータベースのうちの1つから取得することができます。これらのデータベースはすべてわずかに異なり、定期的に追加および削除されます。ユーザには、実際の「会社」のリストが提示され、データは対応するデータベースから取り出される。ASP.NETページで大規模に動的に指定されたテーブルを取得するための最適な戦略

現在、標準のSqlDataSourceと動的に作成されたSQL SELECTステートメントを使用してデータが取得されています。ステートメントにはいくつかのJOINがあり、オプションのWHERE制約もデータベースとユーザーの権限レベルによって動的に作成されます。

このすべては、パフォーマンスとは別に素晴らしい(正直な!)ものです。一部のデータベースでは、数十万行があり、データの取得とページングは​​非常に遅いです(データベースはすでに適切に索引付けされています)。私はシステムを高速化する方法を見てきましたが、XPOかLINQという2つの選択肢があります。

LINQが普及しているようですが、本来動的なシステムで実装するのは簡単ではありません。LINQがアクセスできるデータベースごとに "定義"を作成する必要があります?私はLINQクエリを動的に作成することについても少し不明ですが、少なくとも一部は実行可能と思われるいくつかの例を見ています。一方、XPOは、その場でXPOデータソースを作成することができます。しかし、私は他のテーブルにどのようにジョインするかについてあまりにも多くの情報を見つけることができません。

どのような方法があれば、このプロジェクトに取り組むのがベストですか?または、現在使用されている動的SQLモデルは、LINQとXPOとは根本的に異なり、最も良いものは残っていますか?

答えて

2

あなたが行くと、データベースにアプリの会談という全体の方法を変更する前に、あなたは以下を見て持っていた:

  • は、(レッドゲートのパフォーマンスプロファイラなど)のパフォーマンスプロファイラを通して、あなたのコードを実行します。結果はしばしば意外である。

  • その場でSQL文字列を作成する場合は、 "str1" + "str2"ではなくString.Concat( "str1"、 "str2")などのベストプラクティスを使用していますか?多くの小さな利益が大きな利益につながることを忘れないでください。

  • 要約テーブルやデータベースを定期的に更新することを考えましたか(15分ごとに、このデータを自動的に更新するサービスを実行する必要があるかもしれません)。データベースへの新しい接続は静かで高価です。

  • 実行しているSQLのクエリプランを見てきましたか。今日は、動的に作成されたSQL文字列をsproc(1つのパラメータのみ変更)に移動し、実行時間から5〜10秒を削りました(条件によっては100〜10000回と呼ばれていました)。

LINQを使用した場合の警告です。 LINQを使用することに決めた開発者の中には、何をしているのかわからないために非効率的なコードを書いているのが見えました。このことは非常に簡単に見落とされます。

あなたが最初にやり遂げるための何かがあります。うまくいけば、あなたが考えていないことがそこにあります。

乾杯、

ステュー

+0

こんにちは、非常に便利な返信をいただきありがとうございます。私は既に上記のほとんどをチェックしました。問題は、私が理解しているように、WebサーバーがSQLサーバーからテーブル全体を取り出し、データをページングして結果をブラウザに送信することです。したがって、ユーザーがクリックしたすべてのページは、テーブル全体が読み取られます。 XPOとLINQは、データベースから実際に表示された行だけを読み取るようにクエリをカスタマイズすることでこれを回避しているようです。この動作をシミュレートするために動的SQLクエリを再コードする必要があるようです。 – KenD

+0

こんにちはKennyさん、その場合、次の50が必要なときに、トップ50とプルダウンするようにクエリを変更することはできませんか?これを行うために、私は以下の 'USE AdventureWorks 'のようなものを使って個人的にsprocを作成します。 OrderedOrders RowNumber関数10と20との間からSELECT * ( 'RowNumber関数' Sales.SalesOrderHeader FROM AS)受注日BY ORDER(OVER SELECT SalesOrderID、受注日、 ROW_NUMBER()) AS OrderedOrders WITH GO; ' 10と20を必要なデータの範囲に変更します。私はDevExpressコントロールを一度も使用していないことを認めています。 –

0

私はパフォーマンスが、この場合に微調整される可能性があります2つの点があると思います。私は、何らかの種類のセカンダリレイヤではなく、直接データベースにアクセスしていると仮定します。

まず、データそのものをどのように表示しているかはわかりません。何千ものレコードをグリッドにロードしている場合は、他のすべてがどれほど速くても時間がかかるでしょう。明らかにここのトリックは、データのサブセットを表示し、ユーザーにページングなどを許可することです。これをやっていない場合は、開始するのがよいかもしれません。

次に、テーブルが適切にインデックスされているとします。この場合、ページに1,000レコードを一度にロードせず、一度にサブセットのみを取得していると仮定すると、OKになります。

しかし、データセットを取得するためにSQL接続に対してExecuteQuery()を実行しているだけであれば、Linqや他のものがどのように役立つかわかりません。私はこの問題は明らかにDB側にあると言いたい。

データベースの問題を解決するには、実行しているさまざまなSELECTステートメントをプロファイルし、クエリプランを調べ、状況が減速している場所を特定する必要があります。 SQL Server Profilerを使用することから始めることもできますが、優れたDBAを持っている場合は、通常は(Management Studioから取得できる)クエリプランだけで十分です。

+0

返信ありがとうございます - 私は、SELECT文が速くなると思います。(上記のStuへの返信で説明したように)WebサーバがSQLテーブルからテーブル全体を引っ張っているということです毎回10行を表示するだけで済むようになりました。 – KenD

2

私が理解している限り、すべてのデータ操作がWebサーバーに代わってDBサーバー上で行われ、そこで処理されると、いわゆるserver modeと言われています。このモードでは、グリッドは非常に高速に動作し、何百ものレコードを含むデータソースが使用されます。このモードを使用する場合は、対応するLINQクラスまたはXPOクラスを作成する必要があります。 LINQ based server modeを使用する場合、LINQServerModeDataSourceは、IQueryableとKeyExpressionを設定するために使用できるSelectingイベントを提供します。アプリケーションでLINQを使用することをお勧めします。私は、この情報はあなたに役立つことを願っています。

+0

返信いただきありがとうございます - 私がLinqに期待している問題は、まずアクセスする各データベースのクラスを定義する必要があるようです。このシステムの本質は、読み込まれるデータベースがランダムに定義されていることです。構成データベースからパラメータを読み込み、次に、どの顧客データベースとどのフィールドが読み取られるかを定義します。私は何かを逃していますかLinqクラスを「オンザフライで」定義し、次にLinq文を動的に生成できますか? – KenD

+0

一般に、実行時に動的にLINQクラスを生成することは可能です。これに関する情報は、http://stackoverflow.com/questions/2763158/how-to-create-dynamic-table-in-dbml-fileで見つけることができます。また、実行時にDBコンテンツ(http://www.devexpress.com/Support/Center/Issues/ViewIssue.aspx?issueid=Q230742)に基づいてXPOクラスを作成することも可能です。しかし、これを行うことはお勧めしません。設計時に必要なクラスをすべて作成して使用する方がずっと簡単で効果的です。 –

関連する問題