Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
SQL, PL/SQL, T-SQL: запросы, DML DDL операторы, пакеты, процедуры, функции, триггеры и последовательности.
  • Страница:
  • 1
  • 2
  • 3
  • 4

ТЕМА: Oracle: Эффективен ли запрос если в условии джойна есть >=?

Oracle: Эффективен ли запрос если в условии джойна есть >=? 29 авг 2011 00:44 #3354

  • Daymon
  • Daymon аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 50
  • Спасибо получено: 0
Есть таблица затрат рабочего времени

WORK (EMPLOYEE_ID, WORK_DATE, WORK_DURATION)

есть таблица динамики почасовой ставки

HOUR_RATE (EMPLOYEE_ID, CHANGE_DATE, RATE_VALUE)

для каждого EMPLOYEE MIN(CHANGE_DATE) = MIN(WORK_DATE). Так что случай, что для некоторой WORK_DATE не определена RATE_VALUE, исключен.

Необходимо вычислить, сколько каждый сотрудник заработал. Для этого составила запрос (допустим индексы по EMPLOYEE_ID и DATE полям для обеих таблиц есть)
SELECT 

WORK.EMPLOYEE_ID, 

SUM(WORK.WORK_DURATION * HOUR_RATE.RATE_VALUE) AS COSTS 

FROM WORK 

INNER JOIN HOUR_RATE ON (WORK.EMPLOYEE_ID = HOUR_RATE.EMPLOYEE_ID AND 

                         WORK.WORK_DATE >= HOUR_RATE.CHANGE_DATE)
Гложет сомнение, что такое использование джойна с условием >=, не есть лучшее решение. Есть ли лучшие варианты?

И еще теоретический вопрос. Допустим нужно запросить эти данные только для одного сотрудника. Как лучше сделать - добавить WHERE WORK.EMPLOYEE_ID = 5 или добавить в джойн AND WORK.EMPLOYEE_ID = 5? Вобще наш спец по DB2 говорит, что при создании запроса стоит заботиться только о его читабельности и наглядности, любая нормальная база все равно его соптимизит по своему усмотрению. Так ли это?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle: Эффективен ли запрос если в условии джойна есть >=? 29 авг 2011 00:45 #3355

1. Афигенный у вас админ. Я, конечно, понимаю - "красивый самолёт и летать будет красиво", но всё же это не авиация...
2. Посмотри план и статистику. В плюсе - set autot exp stat, при этом у тебя должна быть роль plustrace (если роли нет, создать через $ORACLE_HOME/sqlplus/admin/plustrce.sql)
3. Не пиши запросы с конструкциями типа inner join someshit on someothershit - мало того, что такие конструкции крайне неудобно читать и понимать, оно ещё и не работает в oracle 8i и ниже. Есть гораздо более понятный и удобный синтаксис.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle: Эффективен ли запрос если в условии джойна есть >=? 29 авг 2011 00:48 #3356

Phoebe, а может set autot trace exp stat ?

Вообще-то есть сомнение в правильности запроса...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle: Эффективен ли запрос если в условии джойна есть >=? 29 авг 2011 00:51 #3357

  • Daymon
  • Daymon аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 50
  • Спасибо получено: 0
А что за синтаксис ты имеешь ввиду? В кратце мой вопрос, стоит ли избегать использовать >= в джойнах? Или на него нельзя ответить однозначно?

По поводу не работает в oracle 8i: я начал с 9i, не мог знать

Meverik Да действительно, я GROUP BY забыл. Извиняюсь.

Phoebe Ты имеешь ввиду?
SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2  - аналогичен запросу:

SELECT * FROM tab,tab2  WHERE col1=col2 (+)



SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2  - аналогичен запросу:

SELECT * FROM tab,tab2  WHERE col1 (+)=col2

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Daymon.

Re: Oracle: Эффективен ли запрос если в условии джойна есть >=? 29 авг 2011 00:52 #3358

Насчёт избегания >= - сложно сказать. Обычно такие конструкции приводят к полному сканированию таблицы. Но надо смотреть план.
Что касается синтаксиса - совершенно верно. Разве что следует добавить, что inner join аналогичен SELECT * FROM tab,tab2 WHERE col1=col2.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle: Эффективен ли запрос если в условии джойна есть >=? 29 авг 2011 00:53 #3359

Во-первых GROUP BY сотрудник, а во-вторых кажется что один и тот же duration используется при расчете по разным ставкам - не видно как duration раскладывается на "разнооплатные" составляющие. Может, правда я неверно проинтерпретировал значение атрибутов или у вас есть еще дополнительные правила, которые из запроса не следуют... Ручной расчет-то подтверждает результаты?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
  • 4