Поделиться через


Производительность 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 для поиска контакта с фамилией "Чжу".

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();  

См. также