Производительность объекта 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. Дополнительные сведения о методах и FindRows методах см. в Find разделе "Поиск строк".

В следующем примере метод 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();  

См. также