Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите ускорить запрос по ET / 23 сообщений из 23, страница 1 из 1
23.02.2017, 18:45
    #39409663
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
Добрый день!

Помогите ускорить следующий запрос:
Код: sql
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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
create or alter procedure FIAS$GET_HOUSES_SOURCE
returns (
    OBJECT_ID D$GUID,
    OBJECT_FK D$GUID,
    HOUSENUM D$PREFIX_NAME,
    BUILDNUM D$PREFIX_NAME,
    STRUCNUM D$PREFIX_NAME,
    STRUCTYPE D$SMALLINT,
    DSTART D$SMALLINT,
    DEND D$SMALLINT,
    DTYPE D$SMALLINT,
    POSTALCODE D$POSTALCODE,
    OKATO D$OKATO,
    OKTMO D$OKTMO)
as
declare variable OLD_OID D$GUID;
BEGIN
  -- FIAS$HOUSES_SOURCE
  OLD_OID = NULL;
  FOR
    SELECT
      T.HOUSEGUID, T.AOGUID, T.HOUSENUM, T.BUILDNUM, T.STRUCNUM, IIF(T.STRUCNUM IS NULL, 0, T.STRUCTYPE),
      T.INTSTART, T.INTEND, T.INTSTATUS, T.POSTALCODE, T.OKATO, T.OKTMO
    FROM (
      SELECT
        CHAR_TO_UUID(HOUSEGUID) AS HOUSEGUID,
        CHAR_TO_UUID(AOGUID) AS AOGUID,
        NULLIF(UPPER(TRIM(HOUSENUM)), '') AS HOUSENUM,
        NULLIF(UPPER(TRIM(BUILDNUM)), '') AS BUILDNUM,
        NULLIF(UPPER(TRIM(STRUCNUM)), '') AS STRUCNUM,
        CAST(STRSTATUS AS SMALLINT) AS STRUCTYPE,
        NULL AS INTSTART,
        NULL AS INTEND,
        0 AS INTSTATUS,
        NULLIF(TRIM(POSTALCODE), '') AS POSTALCODE,
        NULLIF(TRIM(OKATO), '') AS OKATO,
        NULLIF(TRIM(OKTMO), '') AS OKTMO,
        STARTDATE,
        ENDDATE
      FROM FIAS$HOUSES_SOURCE
    ) T
    WHERE (
          T.HOUSENUM IS NOT NULL 
       OR T.BUILDNUM IS NOT NULL 
       OR T.STRUCNUM IS NOT NULL)
      AND CHAR_LENGTH(COALESCE(T.OKTMO, '')) IN (0, 8, 11)
    ORDER BY T.HOUSEGUID, T.ENDDATE DESC, T.STARTDATE DESC
  INTO :OBJECT_ID, :OBJECT_FK, :HOUSENUM, :BUILDNUM, :STRUCNUM, :STRUCTYPE, :DSTART, :DEND, :DTYPE, :POSTALCODE, :OKATO, :OKTMO DO
  BEGIN
    IF (OLD_OID IS DISTINCT FROM OBJECT_ID) THEN
    BEGIN
      SUSPEND;
      OLD_OID = OBJECT_ID;
    END
  END
END



Код: sql
1.
2.
select count(1)
from FIAS$GET_HOUSES_SOURCE



выполняется 22 минуты, что уж очень много. Как можно ускорить запрос? В таблице FIAS$HOUSES_SOURCE - 25 000 000 записей.
...
Рейтинг: 0 / 0
23.02.2017, 18:49
    #39409666
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
Если быть более точным, то:
Код: sql
1.
2.
select count(1), count(distinct HOUSEGUID)
from FIAS$HOUSES_SOURCE



Код: plaintext
1.
COUNT	COUNT1
25216110	25180449
...
Рейтинг: 0 / 0
23.02.2017, 19:03
    #39409673
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
Никак ты этот запрос не ускоришь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.02.2017, 19:37
    #39409687
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__,

- почему у тебя плоскй select from select? чисто чтоб красиво было? убери. ордер у тебя на внешнем селекте.
- эти NULLIF(UPPER(TRIM(HOUSENUM)), '') AS HOUSENUM, наверное лучше при вставки нулить/уперить если всегда нужны так
- смотри чтоб индекс был по ORDER BY T.HOUSEGUID, T.ENDDATE DESC

Еще подумай можеть есть смысл сохранить отдельно уникальные/активные записи по T.HOUSEGUID, T.ENDDATE DESC.
Если потом этот сет нужно будет джоинить, ограничивать записи (rows), сортировка, то через процедуру будет весело.
...
Рейтинг: 0 / 0
23.02.2017, 19:44
    #39409692
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
Dorin Marcoci__Avenger__,

- почему у тебя плоскй select from select? чисто чтоб красиво было? убери. ордер у тебя на внешнем селекте.
- эти NULLIF(UPPER(TRIM(HOUSENUM)), '') AS HOUSENUM, наверное лучше при вставки нулить/уперить если всегда нужны так
- смотри чтоб индекс был по ORDER BY T.HOUSEGUID, T.ENDDATE DESC

Еще подумай можеть есть смысл сохранить отдельно уникальные/активные записи по T.HOUSEGUID, T.ENDDATE DESC.
Если потом этот сет нужно будет джоинить, ограничивать записи (rows), сортировка, то через процедуру будет весело.

1.Эта процедура используется как процедура импорта, т.е. insert into [постоянная таблица] select from FIAS$GET_HOUSES_SOURCE. 2.Индексов быть не может, потому-что ExternalTable.
3.select from select, что бы в where еще раз данные не нормализовать.
...
Рейтинг: 0 / 0
23.02.2017, 20:03
    #39409703
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__,

попробуй увеличить TempCacheLimit в конфиге.
...
Рейтинг: 0 / 0
23.02.2017, 20:04
    #39409704
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__Если быть более точным, то:
Код: sql
1.
2.
select count(1), count(distinct HOUSEGUID)
from FIAS$HOUSES_SOURCE




Код: plaintext
1.
COUNT	COUNT1
25216110	25180449
А сколько времени этот запрос выполнялся ?
...
Рейтинг: 0 / 0
23.02.2017, 23:39
    #39409749
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
hvlad сколько времени этот запрос выполнялся ?

Время выполнения запроса = 1m 8s 766ms

TempCacheLimit - на 2.5.6 и так до максимума TempCacheLimit = 2097152000
...
Рейтинг: 0 / 0
28.02.2017, 18:49
    #39411928
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
У меня подозрение на строки
ORDER BY T.HOUSEGUID, T.ENDDATE DESC, T.STARTDATE DESC
и
IF (OLD_OID IS DISTINCT FROM OBJECT_ID) THEN

попробуй их закомментировать и посмотреть, что получится. Кстати, а что вообще вторая строка делает?
...
Рейтинг: 0 / 0
02.03.2017, 00:00
    #39412884
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
Василий №2У меня подозрение на строки
ORDER BY T.HOUSEGUID, T.ENDDATE DESC, T.STARTDATE DESC
и
IF (OLD_OID IS DISTINCT FROM OBJECT_ID) THEN

попробуй их закомментировать и посмотреть, что получится. Кстати, а что вообще вторая строка делает?

Это аналог запроса в MSSQL
Код: sql
1.
select top 1 with ties * from table order by row_number() over(partition by field order field) 



Так что эти два выражения нужны, без них запрос некорректен.
...
Рейтинг: 0 / 0
02.03.2017, 00:46
    #39412891
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__,

а всё же, интересно - без ORDER BY (и сортировки), сколько времени будет ?
...
Рейтинг: 0 / 0
02.03.2017, 11:16
    #39413013
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
hvlad__Avenger__,

а всё же, интересно - без ORDER BY (и сортировки), сколько времени будет ?

Время выполнения запроса = 4m 55s 388ms
...
Рейтинг: 0 / 0
02.03.2017, 12:08
    #39413043
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__,

значит это действительно сортировка занимает 3\4 времени.

__Avenger__TempCacheLimit = 2097152000 А сколько реально процесс FB выделяет памяти во время выполнения запроса ?
Кстати, если FB не 64-битный, то такое значение весьма вредно для него.
Файл сортировки не искал ? Размер его не смотрел ?
И какой размер файла с ET ?
...
Рейтинг: 0 / 0
02.03.2017, 13:03
    #39413070
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
hvlad,

Реальный размер файла ET - 8,6 ГБ (8 992 326 464 байт). FB отъел - 2 ГБ. Судя по ProcessMonitor - сортировка заняла 2 ГБ ( Offset: 2 010 779 712, Length: 187 840)
...
Рейтинг: 0 / 0
02.03.2017, 13:07
    #39413074
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__сортировка заняла 2 ГБ ( Offset: 2 010 779 712, Length: 187 840)
сортировка в файле на диске заняла 2 ГБ ( Offset: 2 010 779 712, Length: 187 840)
...
Рейтинг: 0 / 0
02.03.2017, 13:27
    #39413093
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__Реальный размер файла ET - 8,6 ГБ
...
сортировка заняла 2 ГБИнтересно. Не все поля задействованы в запросе ?
Или это CHAR_TO_UUID так съэкономил ?
Можно ещё немного сократить, выкинув поля INTSTART, INTEND, INTSTATUS из тела запроса.
...
Рейтинг: 0 / 0
02.03.2017, 13:32
    #39413099
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
hvlad__Avenger__Реальный размер файла ET - 8,6 ГБ
...
сортировка заняла 2 ГБИнтересно. Не все поля задействованы в запросе ?
Или это CHAR_TO_UUID так съэкономил ?
Можно ещё немного сократить, выкинув поля INTSTART, INTEND, INTSTATUS из тела запроса.

Да, не все поля задействованы. И сортировка заняла 4 Гб (2 в оперативке+ 2 на диске)
...
Рейтинг: 0 / 0
02.03.2017, 13:57
    #39413124
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__,

попробуй вот так

Код: sql
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.
WITH T AS (
SELECT
  S.HOUSEGUID AS ID
FROM FIAS$HOUSES_SOURCE S
WHERE (   NULLIF(TRIM(S.POSTALCODE), '') IS NOT NULL
       OR NULLIF(TRIM(S.OKATO), '') IS NOT NULL
       OR NULLIF(TRIM(S.OKTMO), '') IS NOT NULL)
      AND CHAR_LENGTH(COALESCE(S.OKTMO, '')) IN (0, 8, 11)
ORDER BY CHAR_TO_UUID(S.HOUSEGUID), S.STARTDATE DESC, S.ENDDATE DESC)
SELECT
        CHAR_TO_UUID(S.HOUSEGUID) AS HOUSEGUID,
        CHAR_TO_UUID(S.AOGUID) AS AOGUID,
        NULLIF(UPPER(TRIM(S.HOUSENUM)), '') AS HOUSENUM,
        NULLIF(UPPER(TRIM(S.BUILDNUM)), '') AS BUILDNUM,
        COALESCE(NULLIF(UPPER(TRIM(S.STRUCNUM)), ''), 0) AS STRUCNUM,
        CAST(S.STRSTATUS AS SMALLINT) AS STRUCTYPE,
        NULL AS INTSTART,
        NULL AS INTEND,
        0 AS INTSTATUS,
        NULLIF(TRIM(S.POSTALCODE), '') AS POSTALCODE,
        NULLIF(TRIM(S.OKATO), '') AS OKATO,
        NULLIF(TRIM(S.OKTMO), '') AS OKTMO,
        S.STARTDATE,
        S.ENDDATE
FROM T
JOIN FIAS$HOUSES_SOURCE S ON S.HOUSEGUID = T.ID
...
Рейтинг: 0 / 0
02.03.2017, 14:00
    #39413128
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
Симонов Денис,

это внешняя таблица на 25 млн строк. Какие джойны ? :)
...
Рейтинг: 0 / 0
02.03.2017, 14:08
    #39413141
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
hvlad,

ой. Ну тогда тут вряд ли запрос можно улучшить.

В 3.0 ведь можно задать TempCacheLimit > 2 Гб?

__Avenger__,

попробуй вынести константы из запроса, это хоть и не сильно должно уменьшить ширину резалтсета для сортировки

Код: sql
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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
create or alter procedure FIAS$GET_HOUSES_SOURCE
returns (
    OBJECT_ID D$GUID,
    OBJECT_FK D$GUID,
    HOUSENUM D$PREFIX_NAME,
    BUILDNUM D$PREFIX_NAME,
    STRUCNUM D$PREFIX_NAME,
    STRUCTYPE D$SMALLINT,
    DSTART D$SMALLINT,
    DEND D$SMALLINT,
    DTYPE D$SMALLINT,
    POSTALCODE D$POSTALCODE,
    OKATO D$OKATO,
    OKTMO D$OKTMO)
as
declare variable OLD_OID D$GUID;
BEGIN
  DSTART = NULL; 
  DEND = NULL ; 
  DTYPE = 0;
  -- FIAS$HOUSES_SOURCE
  OLD_OID = NULL;
  FOR
    SELECT
      T.HOUSEGUID, T.AOGUID, T.HOUSENUM, T.BUILDNUM, T.STRUCNUM, IIF(T.STRUCNUM IS NULL, 0, T.STRUCTYPE),
      T.INTSTART, T.INTEND, T.INTSTATUS, T.POSTALCODE, T.OKATO, T.OKTMO
    FROM (
      SELECT
        CHAR_TO_UUID(HOUSEGUID) AS HOUSEGUID,
        CHAR_TO_UUID(AOGUID) AS AOGUID,
        NULLIF(UPPER(TRIM(HOUSENUM)), '') AS HOUSENUM,
        NULLIF(UPPER(TRIM(BUILDNUM)), '') AS BUILDNUM,
        NULLIF(UPPER(TRIM(STRUCNUM)), '') AS STRUCNUM,
        CAST(STRSTATUS AS SMALLINT) AS STRUCTYPE,
        NULLIF(TRIM(POSTALCODE), '') AS POSTALCODE,
        NULLIF(TRIM(OKATO), '') AS OKATO,
        NULLIF(TRIM(OKTMO), '') AS OKTMO,
        STARTDATE,
        ENDDATE
      FROM FIAS$HOUSES_SOURCE
    ) T
    WHERE (
          T.HOUSENUM IS NOT NULL 
       OR T.BUILDNUM IS NOT NULL 
       OR T.STRUCNUM IS NOT NULL)
      AND CHAR_LENGTH(COALESCE(T.OKTMO, '')) IN (0, 8, 11)
    ORDER BY T.HOUSEGUID, T.ENDDATE DESC, T.STARTDATE DESC
  INTO :OBJECT_ID, :OBJECT_FK, :HOUSENUM, :BUILDNUM, :STRUCNUM, :STRUCTYPE, :POSTALCODE, :OKATO, :OKTMO DO
  BEGIN
    IF (OLD_OID IS DISTINCT FROM OBJECT_ID) THEN
    BEGIN
      SUSPEND;
      OLD_OID = OBJECT_ID;
    END
  END
END

...
Рейтинг: 0 / 0
02.03.2017, 14:33
    #39413159
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
hvladСимонов Денис,

это внешняя таблица на 25 млн строк. Какие джойны ? :)

Вы не поверите, этот запрос выполняется за 7 минут.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
План
PLAN MERGE (SORT (FIAS$HOUSES_SOURCE NATURAL), SORT (SORT (FIAS$HOUSES_SOURCE NATURAL)))

------ Информация о производительности ------
Время подготовки запроса = 1s 903ms
Время выполнения запроса = 7m 24s 431ms
Среднее время на получение одной записи = 444 431,00 ms
Current memory = 35 258 872
Max memory = 0
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 6



Я сам в шоке...
...
Рейтинг: 0 / 0
02.03.2017, 14:37
    #39413163
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__Я сам в шоке...

Но есть и недостаток, запрос
Код: sql
1.
2.
3.
SELECT ...
FROM T
JOIN FIAS$HOUSES_SOURCE S ON S.HOUSEGUID = T.ID



вернет мне результат с нужной сортировкой?
...
Рейтинг: 0 / 0
02.03.2017, 14:40
    #39413167
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос по ET
__Avenger__,

если бы в плане был не MERGE, то да. А так хз
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите ускорить запрос по ET / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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