Слишком долго выполняется запрос и возвращаются строки из БД

Здравствуйте. Я переделываю программу для знакомых. У них были исходники и они мне их дали для более быстрой разработки и оптимизации кода. У них была прога на WPF, но дико подвисала, поэтому я решил делать на формах делать. В программе идёт постоянное обновление списка из файла на сервере. И у меня возникла проблема, в том, что у меня при получении данных с файла на сервере обновление происходит очень долго, как для такого простого процесса. В общей сложности у меня обновление занимает около полуминуты, в то время как изначальная программа обновляет чуть ли не в реальном времени.

Я полез узнавать, в чём проблема и выяснил, что огромное количество времени уходит именно на получение строк из базы SQLite.

Вот код функции, которая выполняет это

C#Выделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

public static List<CheckListShift> GetCheckList()
        {
            var shifts = new List<CheckListShift>();
            using (var conn = new SQLiteConnection(toconnect, true))
            {
                using (var cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "SELECT  FROM shifts ORDER BY index_number";
                    try
                    {
                        conn.Open();
                        var r = cmd.ExecuteReader();
 
                        DateTime test = DateTime.Now.AddHours(0);
 
                        while (r.Read())
                        {
                            int shiftID = Convert.ToInt32(r["id"]);
                            int shiftIndexNubmer = Convert.ToInt32(r["index_number"]);
                            string shiftName = Convert.ToString(r["name"]);
                            string shiftTimeAfter = Convert.ToString(r["time_after"]);
                            string shiftTimeBefore = Convert.ToString(r["time_before"]);
 
                            DateTime lastBeginDate = new DateTime(test.Year, test.Month, test.Day, Int32.Parse(shiftTimeAfter.Substring(0, 2)), Int32.Parse(shiftTimeAfter.Substring(3, 2)), 0).AddDays(-1);
                            DateTime lastEndDate = new DateTime(test.Year, test.Month, test.Day, Int32.Parse(shiftTimeBefore.Substring(0, 2)), Int32.Parse(shiftTimeBefore.Substring(3, 2)), 0).AddDays(-1);
                            bool isLasts = false;
 
                            DateTime nextBeginDate = lastBeginDate.AddDays(1);
                            DateTime nextEndDate = lastEndDate.AddDays(1);
 
                            / Если время начала смены больше конца смены, то
                             это значит, что смена заканчивается в следующем дне./
                            if (lastBeginDate > lastEndDate)
                            {
                                lastEndDate = lastEndDate.AddDays(1);
                            }
 
                            if (nextBeginDate < test)
                            {
                                lastBeginDate = lastBeginDate.AddDays(1);
                                lastEndDate = lastEndDate.AddDays(1);
                                nextBeginDate = nextBeginDate.AddDays(1);
                                nextEndDate = nextBeginDate.AddDays(1);
                            }
 
                            if (test > lastBeginDate && test < lastEndDate) isLasts = true;
 
                            var checkListItems = new List<IShiftItem>();
 
                            using (var _cmd = conn.CreateCommand())
                            {
                                _cmd.CommandText = @"SELECT shifts_items.,
                                                    journal.record_time
                                                    FROM shifts_items 
                                                    LEFT JOIN journal ON journal.shift_item_id = shifts_items.id
                                                    WHERE journal.record_time = (
                                                            SELECT journal.record_time 
                                                            FROM journal 
                                                            WHERE journal.shift_item_id = shifts_items.id 
                                                            ORDER BY journal.record_time DESC LIMIT 1
                                                        )
                                                      AND shifts_items.shift_id = @shift_id
                                                    UNION ALL
                                                    SELECT shifts_items.,
                                                    journal.record_time
                                                    FROM shifts_items 
                                                    LEFT JOIN journal ON journal.shift_item_id = shifts_items.id
                                                    WHERE journal.record_time IS NULL
                                                      AND shifts_items.shift_id = @shift_id
                                                    ORDER BY shifts_items.index_number";
                                _cmd.Parameters.AddWithValue("@shift_id", shiftID);
 
                                var _r = _cmd.ExecuteReader();
                                while (_r.Read())
                                {
                                    if (_r["record_time"] != DBNull.Value)
                                    {
                                        DateTime recordTime = Convert.ToDateTime(_r["record_time"]);
                                        if (recordTime > lastBeginDate && recordTime < nextBeginDate) continue;
                                    }
 
                                    ShiftItem shiftItem = new ShiftItem(
                                        Convert.ToInt32(_r["id"]), Convert.ToInt32(_r["index_number"]),
                                        Convert.ToString(_r["name"]), Convert.ToString(_r["description"]),
                                        Convert.ToString(_r["time_after"]), Convert.ToString(_r["time_before"]),
                                        Convert.ToBoolean(_r["is_active"]), Convert.ToInt32(_r["shift_id"])
                                        );
                                    checkListItems.Add(new CheckListItem(shiftItem));
                                }
                            }
                            shifts.Add(new CheckListShift(shiftID, shiftIndexNubmer, shiftName, shiftTimeAfter, shiftTimeBefore, checkListItems, isLasts));
                        }
                    }
                    catch (Exception e)
                    {
                        System.Windows.Forms.MessageBox.Show(e.Message);
                    }
                }
            }
            return shifts;
        }

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

На вот этом вот моменте

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

При чём при одинаковых данных, оно выполняет запрос одинаковое количество времени.

Я тут новенький, поэтому мог что-то недодать, как для дополнительной информации. Поэтому, если надо будет, я предоставлю