@antej90
эникей в больнице

Как увеличить производительность программы на .net 4.5 использующей 50000 запросов к базе данных?

Задача: написать программку считающую много разной статистики, примерно 50 000 запросов к базе данных в особо извращенной форме и выводящую их для просмотра в самой программе с помощью FlowDocumentReader в виде таблиц.
Конфигурация рабочей станции: Intel core i5 2.4 ГГц, 8 Гб RAM, SSD 256 Гб (свободно 60). Я использую MS SQLServer Express 2012, Windows 10 pro, сама программа на .net 4.5 WPF.
При формировании первой сотни запросов начались тормоза - на ssd результат запроса выполняется около 5 секунд (раньше было 1 секунда), думаю дальше будет хуже. Вот код формирования каждой строки:
// Строка 8.2
            this.FormN.RowGroups[0].Rows.Add(new TableRow());
            this.FormN.RowGroups[0].Rows[70].FontSize = 14;
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run(""))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("8.2"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("H16"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run(CF12.Str8_2_4()))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run(CF12.Str8_2_5()))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run(CF12.Str8_2_6()))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("8"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("9"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("10"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("11"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("14"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("15"))));
            this.FormN.RowGroups[0].Rows[70].Cells.Add(new TableCell(new Paragraph(new Run("16"))));


и то, ещё не все столбцы заполнены. Методы, возвращающие результат каждой ячейке, это sql запросы.
Как мне ускорить всю эту конструкцию? Может я неправильно формирую строки и есть более простой способ для отображения этой таблицы? Стоит ли делать асинхронные запросы или это не повлияет на работу? Это мой первый опыт серьёзного программирования.
  • Вопрос задан
  • 323 просмотра
Решения вопроса 2
Godless
@Godless
Думаю что:
  • без асинхронных запросов не обойтись. Хотя бы в отдельный поток(и). (хотя если будут срезы, то не обязательно)
  • Не будет лишним оптимизация БД. Статистику обновлять триггерами/хранимками если не часто обновляется (от получаса), если чаще, то хранить срез и пересчитывать периодически.
  • Не забывайте про индексы, иногда денормализация спасает, но база подраспухнет.
  • Оптимизируйте запросы, стройте планы выполнения, смотрите узкие места.


Принцип ускорения ПО всегда один, нужно или считать заранее, или где-то хранить часть расчетов - это память, будь то оператива или диск...
ЗЫ: послушайте еще polifill, дело пишет.
Ответ написан
Комментировать
@polifill
Очевидно.
Вы же сами уже дали себе ответ на вопрос.
Все это сделать в ОДНОМ запросе.
Это ускорит радикально.

А чтение - кэшировать по максимуму в оперативке.
Если пользователь один - это оперативка в приложении.

Если пользователей множество - то поставить отдельный сервер для кэширования.
Например, Tarantool. Искать сначала в нем.
Если нет в кэше Tarantool'а данных - тогда качать с SQL, затем заливать копию на Tarantool для последующего кэшированного чтения.
При изменениях - дублировать на Tarantool.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы