powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Эффективность
4 сообщений из 4, страница 1 из 1
Эффективность
    #39912427
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет экспертам!

Может кто-то "на глаз" сказать, какой подход лучше? Из таблицы нужны данные с максимальной датой. В первом подходе берётся max с группировкой и подцепляется оригинальная таблица:

Код: plsql
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.
WITH
address_max_date as (
      SELECT
            CONTROL_ID,
            SSN,
            ADDRESS_KEY,
            MAX(EFF_DATE) EFF_DATE
      FROM ADDRESS_EFF_DATE
      WHERE EFF_DATE<=SYSDATE
        AND ADDRESS_KEY=0
      GROUP BY CONTROL_ID, SSN, ADDRESS_KEY
),
addresses as (
      SELECT
          CONTROL_ID,
          SSN,
          ADDRESS_1,
          ADDRESS_2,
          ADDRESS_3,
          CITY,
          STATE,
          ZIP,
          TELEPHONE,
          COUNTY,
          COUNTRY,
          EFF_DATE as ADDRESS_EFF_DATE
      FROM ADDRESS_EFF_DATE
      NATURAL JOIN address_max_date
)



Во втором - max берётся аналитичесой функцией:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH
addresses as (
      SELECT
          CONTROL_ID,
          SSN,
          ADDRESS_1,
          ADDRESS_2,
          ADDRESS_3,
          CITY,
          STATE,
          ZIP,
          TELEPHONE,
          COUNTY,
          COUNTRY,
          EFF_DATE as ADDRESS_EFF_DATE
      FROM (
        SELECT ADDRESS_EFF_DATE.*,
               MAX(EFF_DATE) OVER(PARTITION BY CONTROL_ID, SSN) AS MAX_EFF_DATE
        FROM ADDRESS_EFF_DATE
        WHERE EFF_DATE <= SYSDATE
          AND ADDRESS_KEY = 0
      )
      WHERE EFF_DATE = MAX_EFF_DATE
)



В третьем используется row_number и сортировка:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH
addresses as (
      SELECT
          CONTROL_ID,
          SSN,
          ADDRESS_1,
          ADDRESS_2,
          ADDRESS_3,
          CITY,
          STATE,
          ZIP,
          TELEPHONE,
          COUNTY,
          COUNTRY,
          EFF_DATE as ADDRESS_EFF_DATE
      FROM (
        SELECT ADDRESS_EFF_DATE.*,
               ROW_NUMBER() OVER(PARTITION BY CONTROL_ID, SSN ORDER BY EFF_DATE DESC) AS ROW_NUMBER
        FROM ADDRESS_EFF_DATE
        WHERE EFF_DATE <= SYSDATE
          AND ADDRESS_KEY = 0
      )
      WHERE ROW_NUMBER = 1
)



И в последнем - подзапрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH
addresses as (
    SELECT
          CONTROL_ID,
          SSN,
          ADDRESS_1,
          ADDRESS_2,
          ADDRESS_3,
          CITY,
          STATE,
          ZIP,
          TELEPHONE,
          COUNTY,
          COUNTRY,
          EFF_DATE as ADDRESS_EFF_DATE
    FROM address_eff_date a WHERE eff_date = (
        SELECT MAX(eff_date)
        FROM ADDRESS_EFF_DATE
        WHERE CONTROL_ID = a.CONTROL_ID
            AND SSN = a.SSN
            AND ADDRESS_KEY = 0
            AND EFF_DATE <= SYSDATE )
)



Понятно, что все вернут одинаковые данные. Непонятно, какой будет работать быстрее... Если чисто теоретически этого сказать нельзя, то как бы это измерить практически?

Српасибо.
...
Рейтинг: 0 / 0
Эффективность
    #39912496
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросы эффективности крайне сложно обсуждать в отсутствие конкретных объектов - таблиц, индексов, распределения данных в них, целей оптимизации.
Менее важно, но иногда решает информация о характере фоновой нагрузки, имеющихся ресурсах и т.д.
...
Рейтинг: 0 / 0
Эффективность
    #39912515
qlost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно надо смотреть на конкретных структурах и данных.
+ещё вариант в копилочку
Код: plsql
1.
MAX(limval) KEEP (DENSE_RANK LAST ORDER BY prodate)
...
Рейтинг: 0 / 0
Эффективность
    #39912559
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как видно, таблица там одна, 10 миллионов строк, распределение равномерное, цель - скорость. На счёт остального скажем так - при прочих равных...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table ADDRESS_EFF_DATE
(
  control_id     VARCHAR2(10) not null,
  ssn            VARCHAR2(10) not null,
  address_key    NUMBER(2) not null,
  address_1      VARCHAR2(75),
  address_2      VARCHAR2(75),
  city           VARCHAR2(50),
  state          VARCHAR2(2),
  zip            VARCHAR2(10),
  telephone      VARCHAR2(20),
  county         VARCHAR2(10),
  country        VARCHAR2(45),
  address_3      VARCHAR2(75),
  from_date      DATE,
  to_date        DATE,
  eff_date       DATE default TO_DATE('01/01/1900','MM/DD/YYYY') not null,
  transaction_id NUMBER
);
create index ADDRESS_EFF_DATE_IDX on ADDRESS_EFF_DATE (SSN);
create index ADDRESS_EFF_DATE_IDX1 on ADDRESS_EFF_DATE (SSN, ADDRESS_KEY, EFF_DATE DESC);
create index ADDRESS_EFF_DATE_TID on ADDRESS_EFF_DATE (TRANSACTION_ID);
alter table ADDRESS_EFF_DATE add constraint ADDRESS_EFF_DATE_PK primary key (CONTROL_ID, SSN, ADDRESS_KEY, EFF_DATE);
alter table ADDRESS_EFF_DATE add constraint ADDRESS_EFF_DATE_ODC foreign key (CONTROL_ID, SSN) references EMP_SSN (CONTROL_ID, SSN) on delete cascade;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Эффективность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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