次の方法で共有


DataView のパフォーマンス

このトピックでは、DataView クラスの Find メソッドと FindRows メソッドを使用すること、および、Web アプリケーションで DataView をキャッシュすることのパフォーマンス上の利点について説明します。

Find と FindRows

DataView はインデックスを構築します。 インデックスには、テーブル内またはビュー内の 1 つ以上の列から構築されたキーが含まれています。 これらのキーは特定の構造内に格納され、DataView はその構造を使用して、キー値に関連した 1 つ以上の行を効率よく迅速に検出できます。 フィルター処理や並べ替えなど、インデックスを使用した操作では、大幅なパフォーマンス向上が期待できます。 DataView のインデックスは、DataView の作成時に構築されるほか、並べ替えまたはフィルター処理の情報が変更されたときにも構築されます。 DataView を作成した後で、並べ替えまたはフィルター処理の情報を設定した場合、インデックスが最低でも 2 回 (DataView の作成時と、並べ替えまたはフィルターのプロパティの変更時) 構築されることになります。 DataView でのフィルターおよび並べ替えの詳細については、「DataView によるフィルター処理 (LINQ to DataSet)」および「DataView による並べ替え (LINQ to DataSet)」を参照してください。

データ サブセットの動的ビューの作成とは対照的に、データに対する特定のクエリの結果を取得する場合は、RowFilter プロパティを設定する代わりに DataViewFind メソッドまたは FindRows メソッドを使用します。 RowFilter プロパティは、データ連結アプリケーションでの使用に適しています。このアプリケーションでは、連結されたコントロールによってフィルター処理結果が表示されます。 RowFilter プロパティを設定すると、データのインデックスが再構築され、アプリケーションのオーバーヘッドが増加してパフォーマンスの低下を招きます。 Find メソッドと FindRows メソッドでは、現在のインデックスが使用されます。このため、インデックスを再構築する必要はありません。 Find または FindRows を 1 回だけ呼び出す場合は、既存の DataView を使用するようにします。 Find または FindRows を複数回呼び出す場合は、新しい DataView を作成して検索対象の列のインデックスを再構築した後、Find メソッドまたは FindRows メソッドを呼び出します。 Find メソッドおよび FindRows メソッドの詳細については、「行の検索 (ADO.NET)」を参照してください。

次の例では、Find メソッドを使用して、姓が "Zhu" である連絡先を検索します。

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Order By contact.Field(Of String)("LastName") _
    Select contact

Dim view As DataView = query.AsDataView()

Dim found As Integer = view.Find("Zhu")

DataTable contacts = dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         orderby contact.Field<string>("LastName")
                                         select contact;

DataView view = query.AsDataView();

// Find a contact with the last name of Zhu.
int found = view.Find("Zhu");

次の例では、FindRows メソッドを使用して、赤色の製品をすべて検索します。

Dim products As DataTable = dataSet.Tables("Product")

Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice"), product.Field(Of String)("Color") _
Select product

Dim view As DataView = query.AsDataView()
view.Sort = "Color"

Dim criteria As Object() = New Object() {"Red"}

Dim foundRowsView As DataRowView() = view.FindRows(criteria)
DataTable products = dataSet.Tables["Product"];

EnumerableRowCollection<DataRow> query = from product in products.AsEnumerable()
                                         orderby product.Field<Decimal>("ListPrice"), product.Field<string>("Color") 
                                         select product;

DataView view = query.AsDataView();

view.Sort = "Color";

object[] criteria = new object[] { "Red"};

DataRowView[] foundRowsView = view.FindRows(criteria);            

ASP.NET

ASP.NET は、メモリ内に作成するときにサーバー リソースを激しく消費するオブジェクトを保存するためのキャッシュ メカニズムを備えています。 こうしたリソースをキャッシュすることで、アプリケーションのパフォーマンスを大幅に向上させることができます。 キャッシュは、Cache クラスに実装されています。キャッシュ インスタンスは、アプリケーションごとにプライベートに保たれます。 新しい DataView オブジェクトの作成はリソースを大量に消費する処理です。Web アプリケーションにこのキャッシュ機能を使用すれば、Web ページが更新されるたびに DataView を再構築する必要はありません。

次の例では、ページが更新されたときにデータの並べ替えをし直さなくても済むように、DataView をキャッシュしています。

If (Cache("ordersView") = Nothing) Then
                
Dim dataSet As New DataSet()
            
   FillDataSet(dataSet)
                
   Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
                
   Dim query = _
                    From order In orders.AsEnumerable() _
                    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
                    Order By order.Field(Of Decimal)("TotalDue") _
                    Select order

   Dim view As DataView = query.AsDataView()
                
   Cache.Insert("ordersView", view)
                
End If
            
Dim ordersView = CType(Cache("ordersView"), DataView)

GridView1.DataSource = ordersView
GridView1.DataBind()
if (Cache["ordersView"] == null)
{
   // Fill the DataSet.                
   DataSet dataSet = FillDataSet();

   DataTable orders = dataSet.Tables["SalesOrderHeader"];

   EnumerableRowCollection<DataRow> query =
                        from order in orders.AsEnumerable()
                        where order.Field<bool>("OnlineOrderFlag") == true
                        orderby order.Field<decimal>("TotalDue")
                        select order;

   DataView view = query.AsDataView();
   Cache.Insert("ordersView", view);
}

DataView ordersView = (DataView)Cache["ordersView"];

GridView1.DataSource = ordersView;
GridView1.DataBind();

参照

概念

データ バインドと LINQ to DataSet