Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение из БД / 25 сообщений из 64, страница 1 из 3
06.11.2016, 21:25
    #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
06.11.2016, 22:09
    #39342239
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из БД
-=Koba=-Что можно здесь подправить?
- проставь временные метки и будет видно где задержки
...
Рейтинг: 0 / 0
06.11.2016, 22:19
    #39342244
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из БД
Petro123-=Koba=-Что можно здесь подправить?
- проставь временные метки и будет видно где задержки


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

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

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

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



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

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

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

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

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

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

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

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

по строке нет

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

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

select startTime, FIO
и
select startTime, login

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

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

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

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



Может быть потом List<...> проще отсортировать?
Попробую передлать на локальную сортировку.
...
Рейтинг: 0 / 0
07.11.2016, 15:34
    #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
07.11.2016, 15:38
    #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
07.11.2016, 16:54
    #39342787
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из БД
-=Koba=-,

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

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

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

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

ЗЫ
Где я че напутал по SQLDev и Toad каюсь. Грешен. Склероз
...
Рейтинг: 0 / 0
07.11.2016, 17:39
    #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
07.11.2016, 17:41
    #39342825
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из БД
Чтобы узнать, использует ли СУБД индекс - надо читать план запроса. Но это совсем не здесь.
...
Рейтинг: 0 / 0
07.11.2016, 17:42
    #39342828
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из БД
-=Koba=-Это разные индексы
дак что с пагинацией?
Она важнее ваших индексов на миллионах записей.
...
Рейтинг: 0 / 0
07.11.2016, 17:43
    #39342830
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из БД
Petro123-=Koba=-Это разные индексы
дак что с пагинацией?
Она важнее ваших индексов на миллионах записей.
Какая польза от "пагинации" когда order by на все записи?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение из БД / 25 сообщений из 64, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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