Объяснение:
Я создаю систему выставления счетов с помощью SQLite.Таблицы базы данных включают в себя: клиентов и счета.Каждый invoiceOBJ (14 столбцов данных) содержит customerOBJ (4 столбца данных), в то время как каждый invoiceOBJ будет содержать customerID для извлечения соответствующего клиента.
Я случайно сгенерировал 1 миллион записей в таблице счетов из моегопонимание и исследование (outDated?) 1 миллион записей слегка подталкивает его к sqlite (с точки зрения производительности)
Мой запрос на загрузку счетов в табличное представление javaFX:
ResultSet rs = stmt.executeQuery(String.format("SELECT id,year,vin,carModel,condition,licenseState,regNum,stage,vehicleID,paintCode,dateOfInvoice," +
"bodyStyle,manufacturer, customerID FROM invoices LIMIT 100 OFFSET (SELECT COUNT(*) FROM invoices)-%d", indexStart));
indexStart - это количество страниц в накладных через графический интерфейс: либо -100, либо + 100.
Что мне интересно , если это лучшее решение с sqlite, как каждый разпользователь решает перейти на следующую страницу с 1 миллионом счетов / записей, это занимает в среднем 250-264 мс.Затем каждый запрос на получение customerOBJ при выставлении счета-фактуры в среднем составляет 0,6-1 мс * 100 (лимит), что обычно составляет около 300 мс для каждой итерации.
Реально, 1 млн счетов-фактур на 98% больше уничтожениядля чего это нужно, но для образовательных целей я пытаюсь сделать его максимально эффективным.
Просто чтобы уточнить, я не спрашиваю, является ли этот sqlite лучшим способом сделать это, но еслиэто лучший способ в sqlite сделать это.
sqlitedb Object, соответствующие методы:
public void connect() {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:school.sqlite");
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<invoiceOBJ> listInvoices(int indexStart) {
//invoiceAmount = invoices to index.
ArrayList<invoiceOBJ> invoices = new ArrayList<>();
//System.out.println(indexStart + "index start");
try {
connect();
stmt = c.createStatement();
stmt.setFetchSize(100);
ResultSet rs = stmt.executeQuery(String.format("SELECT id,year,vin,carModel,condition,licenseState,regNum,stage,vehicleID,paintCode,dateOfInvoice," +
"bodyStyle,manufacturer, customerID FROM invoices LIMIT 100 OFFSET (SELECT COUNT(*) FROM invoices)-%d", indexStart));
int id;
String customerID;
String year;
String vin;
String carModel;
String condition;
String licenseState;
String regNum;
String stage;
String vehicleID;
String paintCode;
String dateOfInvoice;
String bodyStyle;
String manufacturer;
c.setAutoCommit(false);
while (rs.next()) {
id = rs.getInt(1);
year = rs.getString(2);
vin = rs.getString(3);
carModel = rs.getString(4);
condition = rs.getString(5);
licenseState = rs.getString(6);
regNum = rs.getString(7);
stage = rs.getString(8);
vehicleID = rs.getString(9);
paintCode = rs.getString(10);
dateOfInvoice = rs.getString(11);
bodyStyle = rs.getString(12);
manufacturer = rs.getString(13);
customerID = rs.getString(14);
// System.out.println(String.format("ID: %d , CustomerID: %s Year: %s, Vin: %s, \ncarModel %s, condition: %s, licenseState: %s \n" +
// "regNum: %s, stage: %s vehicleID: %s, paintCode: %s, dateOfInvoice: %s, bodyStyle:%s", id, customerID, year, vin, carModel
// , condition, licenseState, regNum, stage, vehicleID, paintCode, dateOfInvoice, bodyStyle));
//add to invoice list.
invoices.add(new invoiceOBJ(id,
carModel, manufacturer,
vin, condition, licenseState,
regNum, stage, vehicleID, paintCode,
bodyStyle, year, dateOfInvoice, findCustomer(customerID)));
// System.out.println("added A customer");
}
stmt.close();
rs.close();
c.close();
//System.out.println("load complete..");
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println(System.currentTimeMillis() - time);
return invoices;
}
public HashMap<String, String> findCustomer(String id) {
String sql = String.format("SELECT firstName, lastName,id, date FROM customers WHERE id=%s", id);
HashMap<String, String> customerData = new HashMap<>();
try {
Statement stmt = c.createStatement();
ResultSet data = stmt.executeQuery(sql);
customerData.put("firstName", data.getString(1));
customerData.put("lastName", data.getString(2));
customerData.put("date", data.getString(4));
customerData.put("id", data.getString(3));
stmt.close();
data.close();
} catch (Exception e) {
e.printStackTrace();
}
return customerData;
}
public void disconnect() {
try {
c.close();
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
PS Это моя первая попытка и первый раз, когда у меня естьИспользовал SQL, поэтому любые дополнительные объяснения приветствуются!Спасибо!
РЕДАКТИРОВАТЬ: Некоторые из ресурсов, которые я уже прочитал:
SQlite повысить эффективность запросов
Класс хранения SQLite И извлечениеэффективность
Ускорение нумерации страниц в Mysql - почему заказ с ограничением и смещением является медленным?
Нет идей, если это хорошо / актуально, просто для дополнительной информации.
И функциональность в изображениях:
https://imgur.com/a/pczeCSO: до
https://imgur.com/a/kZT3l9C: +100 больше / следующих счетов.