Является ли LIMIT OFFSET лучшим решением для нумерации страниц? - PullRequest
0 голосов
/ 08 декабря 2018

Объяснение:

Я создаю систему выставления счетов с помощью 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 больше / следующих счетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...