powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос!
19 сообщений из 19, страница 1 из 1
Запрос!
    #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
Запрос!
    #36934429
ananas2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может можно сделать какую-то проверку перед джойном: если в колонки все is NULL, тогда джойн выполнять не надо, а просто вывести 0 rows?
...
Рейтинг: 0 / 0
Запрос!
    #36934432
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а самому попробовать с индексом влом?
...
Рейтинг: 0 / 0
Запрос!
    #36934434
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ananas2
inner join tab2 on tab1.col1 = tab2.col2 where ...

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


При таких условиях выражение tab1.col1 = tab2.col2 будет всегда ложно (NULL не равно ничему, в том числи и другому NULL), следовательно, запрос всегда будет возвращать пустой набор. Таким образом, этот запрос можно просто не выполнять для достижения искомого результата.
...
Рейтинг: 0 / 0
Запрос!
    #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
Запрос!
    #36934516
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ananas2,

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

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

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

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

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

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

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

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

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

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

А надо так

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

потому что последний платеж был по этой карте!!!
...
Рейтинг: 0 / 0
Запрос!
    #37019804
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за не полноту предоставленой информации!!!
Есть 2 таблицы которые соединяются по номеру человека:
1- Человек
2- Платеж
...
Рейтинг: 0 / 0
Запрос!
    #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
Запрос!
    #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
Запрос!
    #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
Запрос!
    #37020220
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Николаха,

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

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


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