Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос! / 19 сообщений из 19, страница 1 из 1
02.11.2010, 16:52
    #36934386
ananas2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Добрый день!

Есть следующий запрос:

select tab1.*, tab2.* from tab1
inner join tab2 on tab1.col1 = tab2.col2 where ((tab2.date>='2008-04-08 10:59:07.193000' ) and (tab2.DATE<='2009-04-08 10:59:07.193000' ))

tab1~1M
tab2~1M
tab2.col2 - PK
tab2.date - index
tab1.col1 - нет индекса и колонка пустая, то бишь все NULL.

Запрос выполняется довольно долго ~30 секунд выдает естественно 0 значений.

Вопрос, если смысл добавлять индекс на tab1.col1? Не вызовет ли это сильного ухудшения перфоманса при insert/update/delete? Можно ли как-то переписать запрос, чтобы он выполнялся быстрее без добавления индекса на tab1.col1?

Заранее спасибо!
...
Рейтинг: 0 / 0
02.11.2010, 17:03
    #36934429
ananas2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Может можно сделать какую-то проверку перед джойном: если в колонки все is NULL, тогда джойн выполнять не надо, а просто вывести 0 rows?
...
Рейтинг: 0 / 0
02.11.2010, 17:03
    #36934432
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
а самому попробовать с индексом влом?
...
Рейтинг: 0 / 0
02.11.2010, 17:03
    #36934434
mustaccio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
ananas2
inner join tab2 on tab1.col1 = tab2.col2 where ...

tab1.col1 - нет индекса и колонка пустая, то бишь все NULL.


При таких условиях выражение tab1.col1 = tab2.col2 будет всегда ложно (NULL не равно ничему, в том числи и другому NULL), следовательно, запрос всегда будет возвращать пустой набор. Таким образом, этот запрос можно просто не выполнять для достижения искомого результата.
...
Рейтинг: 0 / 0
02.11.2010, 17:18
    #36934502
ananas2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
mustaccioananas2
inner join tab2 on tab1.col1 = tab2.col2 where ...

tab1.col1 - нет индекса и колонка пустая, то бишь все NULL.


При таких условиях выражение tab1.col1 = tab2.col2 будет всегда ложно (NULL не равно ничему, в том числи и другому NULL), следовательно, запрос всегда будет возвращать пустой набор. Таким образом, этот запрос можно просто не выполнять для достижения искомого результата.

Да, это так, но суть в том что данные в tab1.col1 когда-нибудь появятся, это сейчас их нет. А запрос уже используется вовсю.
...
Рейтинг: 0 / 0
02.11.2010, 17:22
    #36934516
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
ananas2,

Добрый день.
db2advis умеете пользоваться?
...
Рейтинг: 0 / 0
02.11.2010, 17:28
    #36934534
ananas2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
gardenmanа самому попробовать с индексом влом?

К сожалению нет доступа к этой базе. При создании виртуального индекса, access план ничего ничего хорошего не говорит. Кстати, если подскажете как потом проверить улучшение, ухудшение скорости операций insert/update/delete буду благодарен.
...
Рейтинг: 0 / 0
02.11.2010, 17:30
    #36934540
ananas2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Mark Barinsteinananas2,

Добрый день.
db2advis умеете пользоваться?

Умею, нет прав к этой базе. Есть ли смысл пробовать на тестовой базе, где намного меньшие объемы данных?
...
Рейтинг: 0 / 0
02.11.2010, 17:57
    #36934646
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
ananas2Умею, нет прав к этой базе. Есть ли смысл пробовать на тестовой базе, где намного меньшие объемы данных?Ну, если распределение данных примерно похоже, то да, имеет.
...
Рейтинг: 0 / 0
02.11.2010, 18:12
    #36934688
ananas2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Mark Barinsteinananas2Умею, нет прав к этой базе. Есть ли смысл пробовать на тестовой базе, где намного меньшие объемы данных?Ну, если распределение данных примерно похоже, то да, имеет.

Попробовал, он предлагает составной индекс сделать (tab2.col2 + tab2.date) вместо 2х текущих, чтобы сортировку избежать. Но это меня не особо интересует. так как основной стопор явно на джойне. По поводу tab1.col1 db2advis не говорит ничего.

Значит, толку от создания индекса tab1.col1 не будет никакого?
Но ведь если подумать - он проиндексирует столбец с нулями и при джойне не должен потом проверять каждый ноль соответственно скорость выполнения должна значительно увеличится. Или я неправильно рассуждаю?
...
Рейтинг: 0 / 0
08.11.2010, 10:14
    #36941532
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
ananas2Mark Barinsteinпропущено...
Ну, если распределение данных примерно похоже, то да, имеет.

Попробовал, он предлагает составной индекс сделать (tab2.col2 + tab2.date) вместо 2х текущих, чтобы сортировку избежать. Но это меня не особо интересует. так как основной стопор явно на джойне. По поводу tab1.col1 db2advis не говорит ничего.

Значит, толку от создания индекса tab1.col1 не будет никакого?
Но ведь если подумать - он проиндексирует столбец с нулями и при джойне не должен потом проверять каждый ноль соответственно скорость выполнения должна значительно увеличится. Или я неправильно рассуждаю?Попробуйте создать этот индекс, может и поможет...
...
Рейтинг: 0 / 0
09.11.2010, 11:34
    #36944356
FireCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
ananas2,
Код: plaintext
1.
select tab1.*, tab2.*
...
Еще надо убедиться что действительно нужны все поля таблиц. По крайней мере виден один случай когда делается "дублирующий" фетч: tab1.col1 и tab2.col2.
Далеко не факт что сейчас поможет, но оптимальнее возвращать те поля которые действительно необходимы.
...
Рейтинг: 0 / 0
17.12.2010, 06:08
    #37019687
Николаха
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Mark Barinstein,

Есть запрос который получает номер человека и платежи по карте. Нужно получить номера людей и их номера карт по самому последнему платежу. Тут возможно так что человек в течении года платил по одной карте, а потом стал платить по-другой. У меня получилось что-то вроде этого:

...
12345 Иванов 111-222-333
12345 Иванов 444-555-666
...

А надо так

...
12345 Иванов 444-555-666
...

потому что последний платеж был по этой карте!!!
...
Рейтинг: 0 / 0
17.12.2010, 09:25
    #37019804
Николаха
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Извиняюсь за не полноту предоставленой информации!!!
Есть 2 таблицы которые соединяются по номеру человека:
1- Человек
2- Платеж
...
Рейтинг: 0 / 0
17.12.2010, 10:03
    #37019881
const64
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
как-то так...
Код: plaintext
1.
2.
3.
4.
5.
select c.id, c.name, p.cardnumber
from chelovek c
join platej p ON p.chelid=c.id
where p.dateoper in (select max(p1.dateoper)
                     from platej p1
                     where p1.chelid=p.chelid)
...
Рейтинг: 0 / 0
17.12.2010, 10:34
    #37019962
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
НиколахаMark Barinstein,

Есть запрос который получает номер человека и платежи по карте. Нужно получить номера людей и их номера карт по самому последнему платежу. Тут возможно так что человек в течении года платил по одной карте, а потом стал платить по-другой. У меня получилось что-то вроде этого:

...
12345 Иванов 111-222-333
12345 Иванов 444-555-666
...

А надо так

...
12345 Иванов 444-555-666
...

потому что последний платеж был по этой карте!!!
Зависит от того, как именно вы определяете "последний" платёж - по самой последней его дате, внутреннему номеру или ещё как...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare global temporary table customer (cust_id int, cust_name varchar( 20 )) on commit preserve rows not logged;
declare global temporary table payment (pay_id int, cust_id int, pay_date date, card_no varchar( 20 )) with replace on commit preserve rows not logged;

insert into session.customer values ( 1 , 'vova'), ( 2 , 'petya');
insert into session.payment values 
  ( 1 ,  1 , current date, '111-111-111')
, ( 2 ,  1 , current date +  1  day, '111-222-222')
, ( 3 ,  1 , current date +  1  day, '111-333-333')
, ( 4 ,  2 , current date, '222-111-111')
, ( 5 ,  2 , current date +  1  day, '222-222-222')
, ( 6 ,  2 , current date +  1  day, '222-333-333');

select c.*, p.*
from session.customer c
, table(
select p.* 
from session.payment p 
where p.cust_id=c.cust_id 
order by 
--p.pay_date desc
p.pay_id desc
fetch first  1  row only) p;
В вышеприведённом случае выберется одна запись для каждого человека, в случае:
Код: plaintext
1.
2.
3.
4.
...
order by 
p.pay_date desc
--p.pay_id desc
...
может быть выбрана другая.
...
Рейтинг: 0 / 0
17.12.2010, 11:27
    #37020148
Николаха
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Mark Barinstein,

да правильное решение, но видимо из-за того что я не правильно объяснил!!!
Платежей то может быть много, а из запроса видно, что возьмется одна запись
Например:
...
12345 Иванов 111-222-333
12345 Иванов 444-555-666
...
54321 Петров 123-123-123
54321 петров 321-321-321
...

А надо так:

...
12345 Иванов 444-555-666
...
54321 петров 321-321-321
...
...
Рейтинг: 0 / 0
17.12.2010, 11:48
    #37020220
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Николаха,

Я вас не понимаю.
Вы можете просто взять и выполнить мой пример как есть, без изменений, и по результатам показать, что именно вам не нравится?
...
Рейтинг: 0 / 0
20.12.2010, 05:36
    #37023938
Николаха
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос!
Mark Barinstein,

Спасибо, всё нормально. Я сам прогнал!!!
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос! / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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