次の方法で共有


DataView のパフォーマンス

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

Find と FindRows

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

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

次の例では、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.
var found = view.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")

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

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";

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

DataRowView[] foundRowsView = view.FindRows(criteria);
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)

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();  

関連項目