2015-09-28 1 views
1

Итак, я думаю, что ДОЛЖЕН быть лучшим способом делать то, что я делаю ...Как я могу значительно улучшить производительность при загрузке нескольких взаимосвязанных вещей из базы данных?

У меня в настоящее время есть 1 класс под названием «Герой». Он содержит 19 свойств (конечно, может быть изменен). Он представляет собой таблицу базы данных, в которой у меня есть информация.

Затем у меня есть другая таблица базы данных для комментариев к этим героям. Одним из свойств каждого героя является ObservableCollection, и комментарий просто содержит несколько основных свойств.

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

В ViewModel у меня есть ObservableCollection, который я инициализирую с каждым героем из моей SQLite DB.

Когда программа запускается, я прохожу следующее:

Во-первых, я запрашиваю героев таблицы и вытащить всех героев в ObservableCollection в VM. Пример:

DataTable dt = db.GetDataTable("SELECT * FROM Heroes"); 
foreach (DataRow Row in dt.Rows) 
{ 
    Heroes.Add(new Hero(
     HID: Convert.ToInt32(Row["ID"]), 
     HName: Row["Name"].ToString(), 
     ETC..... 
     )); 
} 

Тогда я точно такой же за столом Heroes_Comments - Я вытащить все оттуда, и хранить его в ObservableCollection. То же самое, что и выше, только запрос - «SELECT * FROM Heroes_Comments», а в разных полях используется ETC ofc.

Наконец, я запускаю foreach для каждого комментария в ObservableCollection и добавляю его в коллекцию Hero. Как так:

foreach (Comment c in HeroesDBComments) 
{ 
    HeroesDBHeroes.Single(h => h.ID == c.Foreign).Comments.Add(c); 
} 

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

Что можно сделать, чтобы улучшить это? Я бы предпочел получить это прямо сейчас, чем улучшить и исправить все это позже. :)

(FYI - Test data в настоящее время смотрит около 10 героев и 5 комментариев, все 5 комментариев к одному герою. Каждый герой имеет 2 изображения, хранящихся в виде BLOB ... так что это не самая маленькая сумма данные когда-либо, но я чувствую, что foreach на комментариях плох, когда речь заходит о добавлении более связанных таблиц и о том же, что и в случае с ними ... Я просто не знаю, что лучше? »

Мысль: Наблюдаемые показатели медленнее и там возможно, лучшая альтернатива?

+0

Зачем загружать все из них? Возможно, просто загрузите имена героев, а затем, когда пользователь перейдет к более подробному описанию, загрузите его для этой записи. Это действительно зависит от того, как вы показываете все это пользователю, но нет никакой причины загружать больше данных, чем может посмотреть пользователь. –

+0

Все данные представлены в datagrid. Большинство вещей вдоль основной строки, некоторые thigns в rowdetails. Будут другие базовые классы, похожие на Hero, когда это будет завершено, все с дополнениями. Но если я не загружаюсь при запуске, то при первом обращении пользователя к странице с данными (которые будут все, что они когда-либо делали) будет загружать все, если я захочу не загружаться до тех пор, пока они им не понадобятся ... но хуже, если нажать кнопку и не видеть, чтобы что-то происходило в течение веков, а затем было больше времени загрузки при запуске. – pingu2k4

+0

Сколько строк может видеть пользователь сразу? Вы можете просто загрузить видимые строки, а затем в фоновом режиме предварительно загрузить следующий набор видимых строк по мере прокрутки пользователя. Я не могу себе представить, что они могут видеть и интерпретировать все эти данные сразу, у вас должен быть способ для них расширить детали героя или что-то в этом роде. –

ответ

0

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

Я бы сказал, не бойтесь присоединяться к SQL. Вы почти наверняка получите намного лучшую общую производительность, если создадите SQL-запрос, который вытаскивает все данные за один вызов. Закажите данные «Герой», а затем по какому-либо вопросу в таблице комментариев. Когда вы перебираете результирующий набор, просто проверяйте изменение идентификатора героя, чтобы вы знали, когда изменяется контекст. Да, вы будете извлекать избыточные данные, но общая производительность, скорее всего, резко улучшится.

Используете ли вы пул соединений? Вы делаете все эти вызовы одним и тем же соединением или каждый раз закручиваете новое соединение.

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

В качестве альтернативы, вытащите героев, вытащите только значения id, затем вытащите все комментарии для всех Heros за один дополнительный вызов. Используйте многопоточность, чтобы вы могли начать заполнять свою структуру данных одновременно с тем, что вы извлекаете данные комментариев.

Смежные вопросы