powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение из БД
25 сообщений из 64, страница 1 из 3
Чтение из БД
    #39342215
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Oracle лежит таблица логов, она оптимизирована и select по 5000000 занимаю несколько ms

проблемы возникают при начитке ее со стороны сервера и отображения на клиенте

Код: java
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.
    @Override
    public List<UserActionsLogView> readPageUserActionLogView(
            UserActionsLogViewWrapper example,
            Integer first,
            Integer pageSize,
            String sortField,
            SortOrder sortOrder) {
        CriteriaBuilder qb = em.getCriteriaBuilder();
        CriteriaQuery<UserActionsLogView> query = qb.createQuery(UserActionsLogView.class);
        Root<UserActionsLogView> root = query.from(UserActionsLogView.class);
        Predicate[] restrictions = buildPredicates(example, qb, root);
        query.where(restrictions);
        query.orderBy(qb.desc(root.get(UserActionsLogView_.endTime)));
        if (sortField != null) {
            if (sortOrder.equals(SortOrder.ASCENDING)) {
                query.orderBy(qb.asc(root.get(sortField)));
            } else if (sortOrder.equals(SortOrder.DESCENDING)) {
                query.orderBy(qb.desc(root.get(sortField)));
            }
        }
        TypedQuery<UserActionsLogView> tq = em.createQuery(query);
        tq.setFirstResult(first);
        tq.setMaxResults(pageSize);
        return tq.setHint(QueryHints.READ_ONLY, HintValues.TRUE).getResultList();
//        return tq.getResultList();
    }

    private Predicate[] buildPredicates(UserActionsLogViewWrapper example, CriteriaBuilder qb, Root root) {
        ArrayList<Predicate> predicates = new ArrayList<Predicate>();

        if (example.getLogin() != null && !example.getLogin().isEmpty())
            predicates.add(qb.like(qb.upper(root.get(UserActionsLogView_.login)), "%" + example.getLogin().toUpperCase() + "%"));

        if (example.getFio() != null && !example.getFio().isEmpty())
            predicates.add(qb.like(qb.upper(root.get(UserActionsLogView_.fio)), "%" + example.getFio().toUpperCase() + "%"));

        if (example.getSessionkey() != null && !example.getSessionkey().isEmpty())
            predicates.add(qb.like(qb.upper(root.get(UserActionsLogView_.sessionkey)), "%" + example.getSessionkey().toUpperCase() + "%"));

        if (example.getStartTime() != null)
            predicates.add(qb.greaterThan(root.get(UserActionsLogView_.startTime), example.getStartTime()));

        if (example.getEndTime() != null)
            predicates.add(qb.lessThan(root.get(UserActionsLogView_.endTime), example.getEndTime()));

        return predicates.toArray(new Predicate[predicates.size()]);
    }



Что можно здесь подправить? Выполнение занимает уже секунды
...
Рейтинг: 0 / 0
Чтение из БД
    #39342239
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-Что можно здесь подправить?
- проставь временные метки и будет видно где задержки
...
Рейтинг: 0 / 0
Чтение из БД
    #39342244
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123-=Koba=-Что можно здесь подправить?
- проставь временные метки и будет видно где задержки


Бегал в debug задержка тут

return tq.setHint(QueryHints.READ_ONLY, HintValues.TRUE).getResultList();
...
Рейтинг: 0 / 0
Чтение из БД
    #39342245
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно не рассчитываю как напрямую запрос выполнииться в бд по времени

Но хотелось бы немного уменьшить время
...
Рейтинг: 0 / 0
Чтение из БД
    #39342246
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,
отправляемый sql можешь дать?
...
Рейтинг: 0 / 0
Чтение из БД
    #39342329
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,

Что такое "начитка"? Зачем вы сравниваете значения с помощью like и %?
...
Рейтинг: 0 / 0
Чтение из БД
    #39342364
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Зачем вы сравниваете значения с помощью like и %?
Правильно!
Несколько лайков, абсолютно ненужных тут, сильно тормозят время выборки.
И потом может имеет смысл отказаться от сортировки?
Код: java
1.
2.
3.
...
query.orderBy(qb.desc(root.get(UserActionsLogView_.endTime)));
...



Может быть потом List<...> проще отсортировать?
...
Рейтинг: 0 / 0
Чтение из БД
    #39342400
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-В Oracle лежит таблица логов, она оптимизирована и select по 5000000 занимаю несколько ms

с like и % в начале строки + order by

Не верю. Даже при индексах по времени.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342423
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-В Oracle лежит таблица логов, она оптимизирована и select по 5000000 занимаю несколько ms
проблемы возникают при начитке ее со стороны сервера и отображения на клиенте
Приведу аналогию - грузовик досок бригада разгрузит за 10 минут.
Если же вначале в кузове разобрать все доски на

1. хвойные или лиственные
2. по длине
3. по ширине
4. по толщие
5. чтобы не было сучков

то сколько займет времени разгрузка досок, соответствующих этим критериям?
...
Рейтинг: 0 / 0
Чтение из БД
    #39342441
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBez-=Koba=-В Oracle лежит таблица логов, она оптимизирована и select по 5000000 занимаю несколько ms

с like и % в начале строки + order by

Не верю. Даже при индексах по времени.

lile и % в начале строки - а индекс в оракле используется в этом случае ?
...
Рейтинг: 0 / 0
Чтение из БД
    #39342454
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,

по строке нет

здесь наверняка по дате есть, что ТС и имеет ввиду, что выборка оптимизирована. Но выбрать 5 млн. и отсортировать. Ну не будет это меряться в ms. ИМХО
...
Рейтинг: 0 / 0
Чтение из БД
    #39342467
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBezНо выбрать 5 млн.
вопрос в "выбрать куда"? Пусть выбирает с пагинацией. И тогда сортировка не проблема.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342591
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

пофиг куда. Из кода видно что в условии запроса некоторые поля могут опускаться. Грубо

select startTime, FIO
и
select startTime, login

для оптимальной выборки требуют аналогичных индексов. Даже без % и like.
Держать кучу индексов под различные варианты запросов просто невозможно. На инсертах затормозишь БД.

PS. Уже много раз видел как кто-нибудь выполняет запрос в SQLDeveloper, видит первые 50 строк за 2ms и считает что запрос уже выполнен. И море удивления когда прокручиваешь вниз записи, опа а там тормозульки. И тут до чела доходит: то что он увидел первые строки на экране еще не гарантирует что запрос полностью выполнился. Что-то мне кажется ТС так же оценивает скорость sql запроса
...
Рейтинг: 0 / 0
Чтение из БД
    #39342608
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBezPS. Уже много раз видел как кто-нибудь выполняет запрос в SQLDeveloper, видит первые 50 строк за 2ms и считает что запрос уже выполнен. И море удивления когда прокручиваешь вниз записи, опа а там тормозульки. И тут до чела доходит: то что он увидел первые строки на экране еще не гарантирует что запрос полностью выполнился.
не видел такого ни разу. Там вроде один поток работает. Если не выполнился, то часики тикают и ГУИ замёрзшее.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342617
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBezSQLDeveloper
доказать очень просто? только у PL/SQL Developer:
- взять запрос с блобами
- сузить видимую область до 3-х строк.
- запрос выполняется 15 сек.
- расширить сплиттер на 15 строк и время возрастёт.
Всё у него хорошо работает и прогеры продукта молодцы.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342660
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123sanBezPS. Уже много раз видел как кто-нибудь выполняет запрос в SQLDeveloper, видит первые 50 строк за 2ms и считает что запрос уже выполнен. И море удивления когда прокручиваешь вниз записи, опа а там тормозульки. И тут до чела доходит: то что он увидел первые строки на экране еще не гарантирует что запрос полностью выполнился.
не видел такого ни разу. Там вроде один поток работает. Если не выполнился, то часики тикают и ГУИ замёрзшее.
Например ToAD для Oracle тоже быстро выгружает 500 строк, а остальные по запросу.
Паджинация со стрелками.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342710
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz-=Koba=-,

Что такое "начитка"? Зачем вы сравниваете значения с помощью like и %?

Не совсем понял, ваш ответ. А как мне искать по условию 'Иван Ив'?
...
Рейтинг: 0 / 0
Чтение из БД
    #39342711
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008Blazkowicz Зачем вы сравниваете значения с помощью like и %?
Правильно!
Несколько лайков, абсолютно ненужных тут, сильно тормозят время выборки.
И потом может имеет смысл отказаться от сортировки?
Код: java
1.
2.
3.
...
query.orderBy(qb.desc(root.get(UserActionsLogView_.endTime)));
...



Может быть потом List<...> проще отсортировать?
Попробую передлать на локальную сортировку.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342718
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBez-=Koba=-В Oracle лежит таблица логов, она оптимизирована и select по 5000000 занимаю несколько ms

с like и % в начале строки + order by

Не верю. Даже при индексах по времени.

Да немного погорячился

CriteriaBuilder формирует такой запрос
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
/* Formatted on 07/11/2016 15:32:57 (QP5 v5.300) */
SELECT *
  FROM (SELECT /*+ FIRST_ROWS */
              a.*, ROWNUM rnum
          FROM (  SELECT ID       AS a1,
                         END_TIME AS a2,
                         ERRORCODE AS a3,
                         FIO      AS a4,
                         LOGIN_NAME AS a5,
                         PARAMS   AS a6,
                         REQUEST  AS a7,
                         RESPONSE AS a8,
                         SERVICE  AS a9,
                         SESSIONKEY AS a10,
                         START_TIME AS a11
                    FROM USER_ACTIONS_LOG_VIEW
                   WHERE (    UPPER (LOGIN_NAME) LIKE '%RETAILOLD%'
                          AND UPPER (FIO) LIKE '%ТРОФИМОВИЧ%')
                ORDER BY END_TIME DESC) a
         WHERE ROWNUM <= 15)
 WHERE rnum > 0



Time 45-80 ms
Код: java
1.
select * count from USER_ACTIONS_LOG_VIEW



Результат 5004121 (выполняется чуть более секунды, только, что заметил)
...
Рейтинг: 0 / 0
Чтение из БД
    #39342723
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
USER_ACTIONS_LOG_VIEW это View join 2 таблиц
Индексы стоят на

1 таблица
sesssionKey
startTime
endTime

2 таблица
login
lastName (во вьешке USER_ACTIONS_LOG_VIEW FIO - это соединение трех столбцов)


Код: java
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.
/* Formatted on 07/11/2016 15:38:16 (QP5 v5.300) */
CREATE OR REPLACE FORCE USER_ACTIONS_LOG_VIEW
(
    ID,
    SESSIONKEY,
    LOGIN_NAME,
    FIO,
    SERVICE,
    START_TIME,
    END_TIME,
    REQUEST,
    RESPONSE,
    ERRORCODE,
    PARAMS
)
AS
    SELECT t1.ID,
           t1.SESSIONKEY,
           t2.LOGIN_NAME,
           (t2.LAST_NAME || ' ' || t2.FIRST_NAME || ' ' || t2.MIDDLE_NAME)
               AS FIO,
           t1.SERVICE,
           t1.START_TIME,
           t1.END_TIME,
           t1.REQUEST,
           t1.RESPONSE,
           t1.ERRORCODE,
           t1.PARAMS
      FROM USER_ACTIONS_LOG  t1
           LEFT OUTER JOIN USER_INFO t2 ON (t2.ID = t1.USERID);
...
Рейтинг: 0 / 0
Чтение из БД
    #39342787
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,

Я думаю ты уже сам уже понял что к джаве данный вопрос отношения не имеет.

По ораклу наверно надо определиться с порядком столбцов в первом индексе. Потому что запросы по сессии будут проскакивать быстро. А насколько часто они используются реальным юзером? Индекс-то под программиста кажется запилен :))
И не лучше ли выгадать на запросах по startTime?

и насколько нужен в
2 таблица
login
lastName (во вьешке USER_ACTIONS_LOG_VIEW FIO - это соединение трех столбцов)

второй столбец в индексе если наверно отношение login к lastName один к одному. Может вообще вначале вытащить логин(ы) из второй таблицы и по вьющке запрашивать условие только по полю login. Ну это так, фантазии мои...

ЗЫ
Где я че напутал по SQLDev и Toad каюсь. Грешен. Склероз
...
Рейтинг: 0 / 0
Чтение из БД
    #39342819
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBez-=Koba=-,

Я думаю ты уже сам уже понял что к джаве данный вопрос отношения не имеет.

По ораклу наверно надо определиться с порядком столбцов в первом индексе. Потому что запросы по сессии будут проскакивать быстро. А насколько часто они используются реальным юзером? Индекс-то под программиста кажется запилен :))
И не лучше ли выгадать на запросах по startTime?

и насколько нужен в
2 таблица
login
lastName (во вьешке USER_ACTIONS_LOG_VIEW FIO - это соединение трех столбцов)

второй столбец в индексе если наверно отношение login к lastName один к одному. Может вообще вначале вытащить логин(ы) из второй таблицы и по вьющке запрашивать условие только по полю login. Ну это так, фантазии мои...

ЗЫ
Где я че напутал по SQLDev и Toad каюсь. Грешен. Склероз

Это разные индексы

1 таблица
sesssionKey - indx 1
startTime - indx 2
endTime - indx 3

2 таблица
login - indx 4
lastName (во вьешке USER_ACTIONS_LOG_VIEW FIO - это соединение трех столбцов) - indx 5
...
Рейтинг: 0 / 0
Чтение из БД
    #39342825
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы узнать, использует ли СУБД индекс - надо читать план запроса. Но это совсем не здесь.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342828
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-Это разные индексы
дак что с пагинацией?
Она важнее ваших индексов на миллионах записей.
...
Рейтинг: 0 / 0
Чтение из БД
    #39342830
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123-=Koba=-Это разные индексы
дак что с пагинацией?
Она важнее ваших индексов на миллионах записей.
Какая польза от "пагинации" когда order by на все записи?
...
Рейтинг: 0 / 0
25 сообщений из 64, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение из БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]