Я использую Firedac для создания соединения SQL Lite на локальном файле .db.Я использую:
- TFDConnection: для создания объекта подключения
- TFDQuery: для выполнения моих запросов SQLite.
Мне нужно скопировать все данныеили таблицы из моего файла базы данных SQLite в памяти, а затем выполнить SQL-запросы к нему.
Я читал, что могу использовать mMemTable или другие наборы данных, но вся информация, касающаяся этого, более запутана, чем выручает меня.
Я хочу добиться этого, потому что мне приходится выполнять «тяжелые» запросы (тысячи запросов внутри цикла for), но не жертвуя такой большой скоростью и ресурсами.В настоящее время у меня есть 5 query.open ("SELECT * ....") внутри очень большого цикла, что делает мой код очень медленным.Я предполагаю, что это происходит от многих вещей query.open ().
Если у меня есть копия моих данных SQLite в памяти, а затем я выполняю запросы к этому набору данных, это резко увеличит скорость моего кода.
Я реализовал это в другой части моего кода, где я использовал ограниченный объем данных, взятых из файла SQLite в отсортированных списках, а затем перебрал свои списки.Производительность увеличилась более чем на 300% после замены query.open () внутри этого большого цикла.
Я не могу использовать тот же метод, что и упомянутый выше, потому что я хочу запускать SQL-запросы из моего «SQL in Memory» для извлечения определенныхданные со сложными критериями.
Так кто-нибудь может помочь мне с вышеуказанным вопросом?Может быть, небольшой и "понятный" учебник по этому поводу?
Кажется, что на мой вопрос до сих пор нет ответа.Я попытаюсь быть более конкретным с другим примером кода, чтобы понять ситуацию.Я все еще пытаюсь достичь того, что я говорил выше.Я хочу скопировать данные из моей базы данных SQLite в память, отключить, а затем выполнить запросы SQLite в базе данных памяти.Предполагается, что он будет работать с TFDQuery, TFDLocalSQL, TFDConnection.
Я создаю и извлекаю данные из файла SQL, используя соединение "conn" и "запрос".Тогда я активирую
try
// connection with local SQL file to fetch data from
query.Connection := conn;
query.Open('SELECT * FROM CAMPAIGNS');
query.FetchAll();
// I've put SQL text because FDQuery1 must me active and SQL text must be
// included
FDQuery1.SQL.Text:='SELECT 1';
FDQuery1.Active:= true;
// the following line of code, is supposed to copy data and structure
FDQuery1.CloneCursor(query,true,true);
finally
conn.Close();
query.Free();
conn.Close();
end;
// it seems from showmessage that records exist inside TFDQuery
showmessage(FDQuery1.RecordCount.ToString);
// when I execute the following query, it tells that such table does not
// exist
FDQuery1.Open('SELECT * FROM CAMPAIGNS');