DataView 성능
이 항목에서는 Find 클래스의 FindRows 및 DataView 메서드를 사용하여 웹 애플리케이션에서 DataView를 캐시할 때 얻을 수 있는 성능상의 이점에 대해 설명합니다.
Find 및 FindRows
DataView는 인덱스를 구성합니다. 인덱스에는 테이블이나 뷰에 있는 하나 이상의 열로 작성되는 키가 포함됩니다. 이러한 키는 DataView를 사용하여 키 값과 연결된 행을 빠르고 효과적으로 찾을 수 있는 구조체에 저장됩니다. 작업에서 필터링 및 정렬과 같은 인덱스를 사용하면 성능이 크게 향상됩니다. DataView의 인덱스는 DataView가 만들어지거나 정렬 또는 필터링 정보가 수정될 때 작성됩니다. DataView를 만든 다음 정렬 또는 필터링 정보를 설정하면 DataView가 만들어질 때와 정렬 또는 필터 속성이 수정될 때 각각 한 번씩 인덱스가 작성되므로 적어도 두 개의 인덱스가 작성됩니다. DataView를 사용한 필터링 및 정렬에 대한 자세한 내용은 DataView를 사용한 필터링 및 DataView를 사용한 정렬을 참조하세요.
데이터의 하위 집합에 대한 동적 뷰를 제공하는 것과는 반대로 데이터에 대한 특정 쿼리 결과를 반환하려는 경우 Find 속성을 설정하는 대신 FindRows의 DataView 또는 RowFilter 메서드를 사용할 수 있습니다. RowFilter 속성은 바인딩된 컨트롤이 필터링된 결과를 표시하는 데이터 바인딩된 애플리케이션에 가장 적합합니다. RowFilter 속성을 설정하면 데이터의 인덱스가 다시 작성되므로 애플리케이션에 오버헤드가 발생하여 성능이 저하됩니다. Find 및 FindRows 메서드는 인덱스를 다시 작성하지 않고 현재 인덱스를 사용합니다. Find 또는 FindRows를 한 번만 호출할 경우에는 기존 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 개체를 만들면 많은 자원이 소요될 수 있으므로 웹 애플리케이션에서 이 캐시 기능을 사용하면 웹 페이지를 새로 고칠 때마다 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();