DataView のパフォーマンスDataView Performance

このトピックでは、Find クラスの FindRows メソッドと DataView メソッドを使用すること、および、Web アプリケーションで DataView をキャッシュすることのパフォーマンス上の利点について説明します。This topic discusses the performance benefits of using the Find and FindRows methods of the DataView class, and of caching a DataView in a Web application.

Find と FindRowsFind and FindRows

DataView はインデックスを構築します。DataView constructs an index. インデックスには、テーブル内またはビュー内の 1 つ以上の列から構築されたキーが含まれています。An index contains keys built from one or more columns in the table or view. これらのキーは特定の構造内に格納され、DataView はその構造を使用して、キー値に関連した 1 つ以上の行を効率よく迅速に検出できます。These keys are stored in a structure that enables the DataView to find the row or rows associated with the key values quickly and efficiently. フィルター処理や並べ替えなど、インデックスを使用した操作では、大幅なパフォーマンス向上が期待できます。Operations that use the index, such as filtering and sorting, see signifcant performance increases. DataView のインデックスは、DataView の作成時に構築されるほか、並べ替えまたはフィルター処理の情報が変更されたときにも構築されます。The index for a DataView is built both when the DataView is created and when any of the sorting or filtering information is modified. DataView を作成した後で、並べ替えまたはフィルター処理の情報を設定した場合、インデックスが最低でも 2 回 (DataView の作成時と、並べ替えまたはフィルターのプロパティの変更時) 構築されることになります。Creating a DataView and then setting the sorting or filtering information later causes the index to be built at least twice: once when the DataView is created, and again when any of the sort or filter properties are modified. フィルター処理と並べ替えの詳細についてはDataViewを参照してくださいDataView によるフィルター処理DataView による並べ替えです。For more information about filtering and sorting with DataView, see Filtering with DataView and Sorting with DataView.

データ サブセットの動的ビューの作成とは対照的に、データに対する特定のクエリの結果を取得する場合は、Find プロパティを設定する代わりに FindRowsDataView メソッドまたは RowFilter メソッドを使用します。If you want to return the results of a particular query on the data, as opposed to providing a dynamic view of a subset of the data, you can use the Find or FindRows methods of the DataView, rather than setting the RowFilter property. RowFilter プロパティは、データ連結アプリケーションでの使用に適しています。このアプリケーションでは、連結されたコントロールによってフィルター処理結果が表示されます。The RowFilter property is best used in a data-bound application where a bound control displays filtered results. RowFilter プロパティを設定すると、データのインデックスが再構築され、アプリケーションのオーバーヘッドが増加してパフォーマンスの低下を招きます。Setting the RowFilter property rebuilds the index for the data, adding overhead to your application and decreasing performance. Find メソッドと FindRows メソッドでは、現在のインデックスが使用されます。このため、インデックスを再構築する必要はありません。The Find and FindRows methods use the current index without requiring the index to be rebuilt. Find または FindRows を 1 回だけ呼び出す場合は、既存の DataView を使用するようにします。If you are going to call Find or FindRows only once, then you should use the existing DataView. Find または FindRows を複数回呼び出す場合は、新しい DataView を作成して検索対象の列のインデックスを再構築した後、Find メソッドまたは FindRows メソッドを呼び出します。If you are going to call Find or FindRows multiple times, you should create a new DataView to rebuild the index on the column you want to search on, and then call the Find or FindRows methods. 詳細については、FindFindRowsメソッドを参照してくださいを検索する行です。For more information about the Find and FindRows methods, see Finding Rows.

次の例では、Find メソッドを使用して、姓が "Zhu" である連絡先を検索します。The following example uses the Find method to find a contact with the last name "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");
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 メソッドを使用して、赤色の製品をすべて検索します。The following example uses the FindRows method to find all the red colored products.

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);            
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 has a caching mechanism that allows you to store objects that require extensive server resources to create in memory. こうしたリソースをキャッシュすることで、アプリケーションのパフォーマンスを大幅に向上させることができます。Caching these types of resources can significantly improve the performance of your application. キャッシュは、Cache クラスに実装されています。キャッシュ インスタンスは、アプリケーションごとにプライベートに保たれます。Caching is implemented by the Cache class, with cache instances that are private to each application. 新しい DataView オブジェクトの作成はリソースを大量に消費する処理です。Web アプリケーションにこのキャッシュ機能を使用すれば、Web ページが更新されるたびに DataView を再構築する必要はありません。Because creating a new DataView object can be resource intensive, you might want to use this caching functionality in Web applications so that the DataView does not have to be rebuilt every time the Web page is refreshed.

次の例では、ページが更新されたときにデータの並べ替えをし直さなくても済むように、DataView をキャッシュしています。In the following example, the DataView is cached so that the data does not have to be re-sorted when the page is refreshed.

If (Cache("ordersView") = Nothing) Then  
Dim dataSet As New 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  
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;  

関連項目See Also

データ バインディングと LINQ to DataSetData Binding and LINQ to DataSet