|
|
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Есть таблица затрат рабочего времени 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 полям для обеих таблиц есть) Код: plaintext 1. 2. 3. 4. 5. Гложет сомнение, что такое использование джойна с условием >=, не есть лучшее решение. Есть ли лучшие варианты? И еще теоретический вопрос. Допустим нужно запросить эти данные только для одного сотрудника. Как лучше сделать - добавить WHERE WORK.EMPLOYEE_ID = 5 или добавить в джойн AND WORK.EMPLOYEE_ID = 5? Вобще наш спец по DB2 говорит, что при создании запроса стоит заботиться только о его читабельности и наглядности, любая нормальная база все равно его соптимизит по своему усмотрению. Так ли это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 10:35 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
1. Афигенный у вас админ. Я, конечно, понимаю - "красивый самолёт и летать будет красиво", но всё же это не авиация... 2. Посмотри план и статистику. В плюсе - set autot exp stat, при этом у тебя должна быть роль plustrace (если роли нет, создать через $ORACLE_HOME/sqlplus/admin/plustrce.sql) 3. Не пиши запросы с конструкциями типа inner join someshit on someothershit - мало того, что такие конструкции крайне неудобно читать и понимать, оно ещё и не работает в oracle 8i и ниже. Есть гораздо более понятный и удобный синтаксис. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 10:43 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Пардон - set autot trace exp stat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 10:43 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Вообще-то есть сомнение в правильности запроса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 11:07 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
to Scott Tiger А что за синтаксис ты имеешь ввиду? В кратце мой вопрос, стоит ли избегать использовать >= в джойнах? Или на него нельзя ответить однозначно? По поводу не работает в oracle 8i : я начала с 9i, не могла знать. to ksukhonosenko Да действительно, я GROUP BY забыла. Извиняюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 11:18 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
to Scott Tiger Ты имеешь ввиду? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 11:31 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Насчёт избегания >= - сложно сказать. Обычно такие конструкции приводят к полному сканированию таблицы. Но надо смотреть план. Что касается синтаксиса - совершенно верно. Разве что следует добавить, что inner join аналогичен SELECT * FROM tab,tab2 WHERE col1=col2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 11:35 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Во-первых GROUP BY сотрудник, а во-вторых кажется что один и тот же duration используется при расчете по разным ставкам - не видно как duration раскладывается на "разнооплатные" составляющие. Может, правда я неверно проинтерпретировал значение атрибутов или у вас есть еще дополнительные правила, которые из запроса не следуют... Ручной расчет-то подтверждает результаты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 11:39 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Операция >= как правило приводит к индексному скану (если столбец индексирован). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 12:18 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
to Scott Tiger A если несколько джойнов то AND использовать? SELECT * FROM tab,tab2,tab3 WHERE col1=col2 and col3=col4 Выглядит несколько необычно. И что, действительно более удобочитаемо? to ksukhonosenko Насчет двойного использования ты был прав, надо еще добавить AND HOUR_RATE.CHANGE_DATE = (SELECT MAX(CHANGE_DATE) FROM HOUR_RATE WHERE CHANGE_DATE <= WORK.WORK_DATE) вот конечный запрос (с учетом пожелания Scott Tiger) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 12:53 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Теперь получается, что для каждой даты из табл. WORK ставится в соответствие одна запись из таблицы RATE (с макимальной датой, не превышающей дату в WORK) - это разве верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:18 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Да как раз, то что нужно. HOUR_RATE это история изменений ЗП. Например 01.04.2003 40$ 06.01.2003 50$ 09.01.2003 55$ Соответсвенно на все даты периода 01.04.2003 - 05.01.2003 действует ставка 40$ 06.01.2003 - 09.01.2003 - 50$ 09.01.2003 - - 55$ пока не добавится новая ставка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:30 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
С датами я нагородила, исправленный вариант Да как раз, то что нужно. HOUR_RATE это история изменений ЗП. Например 01.04.2003 40$ 01.06.2003 50$ 01.09.2003 55$ Соответсвенно на все даты периода 01.04.2003 - 31.05.2003 действует ставка 40$ 01.06.2003 - 31.08.2003 - 50$ 01.09.2003 - 55$ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:37 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
А что такое duration? Пересекать границы изменения ставки может? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:37 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
WORK_DURATION количество отработанного времени в часах на дату WORK_DATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:40 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Так пересекать границу изменения ставки может? Вы считаете по последней ставке, но по полной длительности. Если длительность больше последнего диапазона изменения ставки (то есть надо считать по нескольким ставкам), то вы считаете неверно имхо. Если же нужно считать по последней ставке, то запрос можно написать проще - взять последнюю ставку и умножить на длительность и суммировать нечего. Зачем тогда sum в селекте, если нужна только одна строка? Лучше б сначала на бумаге решение написать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:46 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Рекомендую всегда для таких таблиц заводить не поле ДАТА (кстати, не понимаю, неужели именовать объекты и атрибуты по-русски менее удобно, чем по ... не знаю даже по-какому :-) ), а поля ДАТА_КОН и ДАТА_НАЧ. ДАТА_КОН помещать в первичный ключ и поддерживать ёлку: например, НОМЕР | ДАТА_КОН | ДАТА_НАЧ | ЗНАЧЕНИЕ ... 1 05.01.2003 01.01.1980 100 ... 1 10.02.2003 05.01.2003 200 ... 1 01.01.3000 10.02.2003 500 ... ... В ключе НОМЕР И ДАТА_КОН. Плюс индекс на НОМЕР, ДАТА_КОН, ДАТА_НАЧ. В запросе использовать: :дНашаДата BETWEEN ДАТА_НАЧ AND ДАТА_КОН - 1 (либо BETWEEN ДАТА_НАЧ + 1 AND ДАТА_КОН, это уж как удобнее). Значительно жизнь упрощает. Никаких <= не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:49 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
to Angel для программера твой вариант конечно более удобен, а юзер просто хочет вводить дату начала действия новой ставки и ее значение. Конечно можно такой юзерский интерфейс поддерживать и с наличием ДАТА_НАЧ AND ДАТА_КОН, при добавлении новой ставки вычисляя ДАТА_КОН = [ДАТА_НАЧ новой ставки] - 1 день. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:55 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Именно так и надо. Не надо путать данные и их представление. Если пользователь хочет это видеть, не значит вовсе что так лучше и хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 13:57 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
>для программера твой вариант конечно более удобен, а юзер просто хочет вводить дату начала действия новой ставки и ее значение :-) Наверное, все же наоборот. Время отклика уменьшится. А как вводил он дату, так и будет вводить. Дело программиста, как ты и говоришь, строить елку (собственно триггер повесить и все). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 14:00 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
А почему "елка"? В смысле откуда такое название? Виолина, вы уверены в правильности расчета? Так как ставки у вас растут - в случае неверного расчета, по вашей вине будет перерасход - это значит "без премии" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 14:04 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Нарисовать, к сожалению, не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 14:08 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Раз есть желающие поразбираться (ksukhonosenko), давайте. Возьмем одного сотрудника и пару отчетов за даты с разными ставками. Допустим сотрудник 1 работал таким образом таблица WORK Код: plaintext 1. 2. 3. 4. 5. 6. Его почасовая ставка с 1 апреля 40 а с 1 мая 60 баков (быстро он поднялся!). таблица HOUR_RATE Код: plaintext 1. 2. 3. 4. Чуть чуть модифицируем исходный запрос, чтобы увидеть что же все таки суммируется Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. получаем (спул все таки класная штука!) Код: plaintext 1. 2. 3. 4. 5. 6. возвращаясь к сумме имеем Код: plaintext 1. 2. 3. Все ОК! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 15:12 |
|
||
|
Эффективен ли запрос если в условии джойна есть >=?
|
|||
|---|---|---|---|
|
#18+
Так я ж сразу спросил, duration может пересекать изменение ставки или нет. Я трактовал duration как длительность работы в днях. И кажется не только я - об этом свидетельствует разговор о "елках". А что касается "раз есть желающие поразбираться", то ваш изначальный запрос был неверен :) - где мое "спасибо", короче?. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2003, 15:23 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=2790&tid=1991029]: |
0ms |
get settings: |
12ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 430ms |

| 0 / 0 |
