powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите ускорить запрос по ET
23 сообщений из 23, страница 1 из 1
Помогите ускорить запрос по ET
    #39409663
__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
  -- 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
Помогите ускорить запрос по ET
    #39409666
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если быть более точным, то:
Код: sql
1.
2.
select count(1), count(distinct HOUSEGUID)
from FIAS$HOUSES_SOURCE



Код: plaintext
1.
COUNT	COUNT1
25216110	25180449
...
Рейтинг: 0 / 0
Помогите ускорить запрос по ET
    #39409673
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак ты этот запрос не ускоришь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите ускорить запрос по ET
    #39409687
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), сортировка, то через процедуру будет весело.
...
Рейтинг: 0 / 0
Помогите ускорить запрос по ET
    #39409692
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите ускорить запрос по ET
    #39409703
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

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




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

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

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

попробуй их закомментировать и посмотреть, что получится. Кстати, а что вообще вторая строка делает?
...
Рейтинг: 0 / 0
Помогите ускорить запрос по ET
    #39412884
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий №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
Помогите ускорить запрос по ET
    #39412891
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

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

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

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

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

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

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

Да, не все поля задействованы. И сортировка заняла 4 Гб (2 в оперативке+ 2 на диске)
...
Рейтинг: 0 / 0
Помогите ускорить запрос по ET
    #39413124
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__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
Помогите ускорить запрос по ET
    #39413128
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

это внешняя таблица на 25 млн строк. Какие джойны ? :)
...
Рейтинг: 0 / 0
Помогите ускорить запрос по ET
    #39413141
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите ускорить запрос по ET
    #39413159
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите ускорить запрос по ET
    #39413163
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Я сам в шоке...

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



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

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


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