DataView のパフォーマンス
このトピックでは、Find クラスの FindRows メソッドと DataView メソッドを使用すること、および、Web アプリケーションで DataView をキャッシュすることのパフォーマンス上の利点について説明します。
Find と FindRows
DataView はインデックスを構築します。 インデックスには、テーブル内またはビュー内の 1 つ以上の列から構築されたキーが含まれています。 これらのキーは特定の構造内に格納され、DataView はその構造を使用して、キー値に関連した 1 つ以上の行を効率よく迅速に検出できます。 フィルター処理や並べ替えなど、インデックスを使用した操作では、大幅なパフォーマンス向上が期待できます。 DataView のインデックスは、DataView の作成時に構築されるほか、並べ替えまたはフィルター処理の情報が変更されたときにも構築されます。 DataView を作成した後で、並べ替えまたはフィルター処理の情報を設定した場合、インデックスが最低でも 2 回 (DataView の作成時と、並べ替えまたはフィルターのプロパティの変更時) 構築されることになります。 DataView でのフィルター処理と並べ替えについて詳しくは、「DataView によるフィルター処理」および「DataView による並べ替え」をご覧ください。
データ サブセットの動的ビューの作成とは対照的に、データに対する特定のクエリの結果を取得する場合は、Find プロパティを設定する代わりに FindRows の DataView メソッドまたは 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();