Подтвердить что ты не робот

Имеются ли индексы ADO.Net DataTables?

Я использую VSTS 2008 + С# +.Net 3.5 + SQL Server 2008 + ADO.Net. Если я загружаю таблицу из базы данных с помощью DataTable из ADO.Net, и в таблице базы данных я определил пару индексов в таблице. Мой вопрос: есть ли в ADO.Net DataTable связанный индекс (так же, как индексы, созданные мной в таблице физической базы данных), чтобы улучшить определенную производительность работы в DataTable?

спасибо заранее, Джордж

4b9b3361

Ответ 1

Джордж,

Ответ - нет.

Фактически, некоторая индексация может использоваться внутренне, но только как деталь реализации. Например, если вы создаете ограничение внешнего ключа, возможно, это помогает индекс. Но разработчик не имеет значения.

Ответ 2

На самом деле вопрос Джорджа не так "плох", как утверждают некоторые люди. (Я все больше убежден, что нет такого мнения, как "плохой вопрос".)

У меня есть довольно большая таблица, которую я загружаю в память, в объект DataTable. Многое много раз делается на линиях из этой таблицы, на разных (и разных) подмножествах, которые я могу легко описать как "ГДЕ..." предложений SELECT. Теперь с этим DataTable я могу запустить Select() - метод класса DataTable, но он довольно неэффективен.

В конце концов, я решил загрузить DataTable, отсортированный по определенным столбцам, и реализовал мои собственные быстрый поиск, вместо использования функции Select(). Это оказалось намного быстрее, но, конечно, оно работает только на отсортированных столбцах. Беды можно было бы избежать, если бы DataTable имел индексы.

Ответ 3

Нет, но, возможно, да.

Вы можете настроить собственные индексы в DataTable, используя DataView. По мере изменения таблицы DataView будет перестроен, поэтому индекс всегда должен быть обновлен.

Я сделал несколько тестов для собственного приложения. Я использую DataTable для аппроксимации Boost MultiIndexContainer. Чтобы создать индекс для вызова столбца "Автор", я инициализирую DataTable, а затем DataView...

_dvChangesByAuthor = 
    new DataView(
        _dtChanges, 
        string.Empty, 
        "Author ASC", 
        DataViewRowState.CurrentRows);

Чтобы затем извлечь данные по автору из таблицы, вы используете функцию FindRows вида...

            dataRowViews = _dvChangesByAuthor.FindRows(author);
            List<DataRow> returnRows = new List<DataRow>();
            foreach (DataRowView drv in dataRowViews)
            {
                returnRows.Add(drv.Row);
            }

Я сделал случайный большой DataTable и выполнял запросы с использованием DataTable.Select(), Linq-To-DataSet (с принудительным выполнением путем экспорта в список) и вышеописанным методом DataView. Метод DataView выиграл легко. Linq взял 5000 тиков, Select взял более 26000 тиков, DataView взял 192 тика...

LOC=20141121-14:46:32.863,UTC=20141121-14:46:32.863,DELTA=72718,THR=9,DEBUG,LOG=Program,volumeTest() - Running queries for author >TFYN_AUTHOR_047<
LOC=20141121-14:46:32.863,UTC=20141121-14:46:32.863,DELTA=72718,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingLinqToDataset() - Query elapsed time: 2 ms, 4934 ticks; Rows=65 
LOC=20141121-14:46:32.879,UTC=20141121-14:46:32.879,DELTA=72733,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingSelect() - Query elapsed time: 11 ms, 26575 ticks; Rows=65 
LOC=20141121-14:46:32.879,UTC=20141121-14:46:32.879,DELTA=72733,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingDataview() - Query elapsed time: 0 ms, 192 ticks; Rows=65

Итак, если вы хотите индексы в DataTable, я бы предложил DataView, если вы можете иметь дело с тем, что индекс перестраивается при изменении данных.

Ответ 4

Вы можете создать первичный ключ для datatable. Операции фильтров получают большой импульс, если вы ищете в поле первичного ключа. Посмотрите эту ссылку: здесь

Ответ 5

Иоанн выше правильно. Таблицы данных отключены в структурах памяти. Они не сопоставляются с физической реализацией базы данных.

Индексы на диске используются для ускорения поиска, потому что у вас нет всех строк. Если вам нужно загружать каждую строку и сканировать их, она медленная, поэтому индекс имеет смысл. В DataTable у вас уже есть все строки, поэтому сравнение выполняется быстрее.

Ответ 6

У меня была та же проблема со многими запросами из большого типа данных, которые не соответствуют первичному ключу.

Решением, которое я нашел, было создание DataView для каждого индекса, который я хотел использовать, а затем использовать его методы Find и FindRows для извлечения данных.

DataView создает внутренний индекс в DataTable и ведет себя как индекс для этой цели.

В моем случае я смог уменьшить 10 000 запросов от 40 секунд до ОДНОГО!!!

Ответ 7

Другие заявили, что DataSet не предназначен для использования в качестве системы баз данных - просто для представления данных. Если вы работаете под впечатлением того, что DataSet является базой данных, вы ошибаетесь и, возможно, придется пересмотреть свою реализацию.

Если вам нужна база данных на стороне клиента, подумайте об использовании SQL Compact или SQL Lite, обе являются бесплатными распространяемыми системами баз данных, которые могут использоваться без необходимости отдельных установок или служб. Если вам нужно что-то более полнофункциональное, SQL Express станет следующим шагом.

Чтобы помочь уточнить, DataSets/Tables используются в .NET-разработке для временного хранения данных по мере необходимости. Подумайте о них как о результатах запроса SELECT к базе данных; они примерно похожи на файлы CSV или другие формы табличных данных - вы можете извлекать данные из них из базы данных, работать с данными, а затем вносить изменения обратно в базу данных, но они сами по себе не являются базы данных.

Если у вас есть большая коллекция предметов, которые нужно хранить в памяти по той или иной причине, вы можете подумать о создании облегченного DTO (объекта передачи данных, Google, это очень просто) и загрузить их в Хеш-таблица. HashTables не даст вам каких-либо реляционных данных, но очень эффективен при поиске.

Ответ 8

В DataTables есть поле PrimaryKey, которое может служить индексом (они все-таки быстрые). Это поле не копируется из основных ключей базы данных (хотя это может быть хорошо).

Ответ 9

Таблицы данных индексируются, если вы (кодер) указываете одну или несколько DataColumns в качестве Первичного ключа. В Interally ADO.NET используется дерево Red-Black, чтобы сформировать этот индекс, дающий время поиска в журнале. Этот первичный ключ не устанавливается автоматически на основе любого базового ключа от поставщика данных.

Ответ 10

Правильный ответ здесь - создать DataView из DataTable, который согласно документ создаст индекс:

DataView создает индекс. Индекс содержит ключи, созданные из одного или нескольких столбцов в таблице или представлении. Эти ключи хранятся в структуре, которая позволяет DataView быстро и эффективно находить строку или строки, связанные с ключевыми значениями. Операции, которые используют индекс, такие как фильтрация и сортировка, видят значительную производительность. Индекс для DataView создается как при создании DataView, так и при изменении любой информации о сортировке или фильтрации. Создание DataView, а затем установка информации о сортировке или фильтрации позже приводит к тому, что индекс создается не менее двух раз: один раз при создании DataView и снова при изменении свойств сортировки или фильтра.

Ответ 11

Мое чтение документов заключается в том, что правильный способ достижения этого (если необходимо) - использовать AsDataView для создания DataView ( или LinqDataView), которые привязаны к базовой таблице. Если ваш DataTable является инвариантным, то DataView может быть статическим, чтобы избежать избыточной повторной индексации.

В настоящее время я изучаю Linq to DataSet, и этот q был полезен для меня, поэтому спасибо.