다음을 통해 공유


DataView 성능

이 항목에서는 DataView 클래스의 FindFindRows 메서드를 사용하여 웹 응용 프로그램에서 DataView를 캐시할 때 얻을 수 있는 성능상의 이점에 대해 설명합니다.

Find 및 FindRows

DataView는 인덱스를 구성합니다. 인덱스에는 테이블 또는 뷰에 있는 하나 이상의 열에서 작성된 키가 포함됩니다. 이러한 키는 DataView를 사용하여 키 값과 연결된 행을 빠르고 효과적으로 찾을 수 있는 구조체에 저장됩니다. 작업에서 필터링 및 정렬과 같은 인덱스를 사용하면 성능이 크게 향상됩니다. DataView의 인덱스는 DataView가 만들어지거나 정렬 또는 필터링 정보가 수정될 때 작성됩니다. DataView를 만든 다음 정렬 또는 필터링 정보를 설정하면 DataView가 만들어질 때와 정렬 또는 필터 속성이 수정될 때 각각 한 번씩 인덱스가 작성되므로 적어도 두 개의 인덱스가 작성됩니다. DataView를 사용한 필터링 및 정렬에 대한 자세한 내용은 DataView로 필터링(LINQ to DataSet)DataView로 정렬(LINQ to DataSet)을 참조하십시오.

데이터의 하위 집합에 대한 동적 뷰를 제공하는 것과는 반대로 데이터에 대한 특정 쿼리 결과를 반환하려는 경우 RowFilter 속성을 설정하는 대신 DataViewFind 또는 FindRows 메서드를 사용할 수 있습니다. RowFilter 속성은 바인딩된 컨트롤이 필터링된 결과를 표시하는 데이터 바인딩된 응용 프로그램에 가장 적합합니다. RowFilter 속성을 설정하면 데이터의 인덱스가 다시 작성되므로 응용 프로그램에 오버헤드가 발생하여 성능이 저하됩니다. FindFindRows 메서드는 인덱스를 다시 작성하지 않고 현재 인덱스를 사용합니다. Find 또는 FindRows를 한 번만 호출할 경우에는 기존 DataView를 사용해야 합니다. Find 또는 FindRows를 여러 번 호출할 경우에는 새 DataView를 만들어서 검색하려는 열의 인덱스를 다시 작성한 다음 Find 또는 FindRows 메서드를 호출해야 합니다. FindFindRows 메서드에 대한 내용은 행 찾기(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 개체를 만들면 많은 자원이 소요될 수 있으므로 웹 응용 프로그램에서 이 캐시 기능을 사용하면 웹 페이지를 새로 고칠 때마다 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