Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выпущен DB2 8.1.6 (FixPack 6) / 10 сообщений из 10, страница 1 из 1
25.06.2004, 19:55
    #32578369
Alexey Antonov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
ftp://ftp.software.ibm.com/ps/products/db2/fixes/russian/db2winIA32v8/fixpak/FP6_WR21340/APARLIST.html
...
Рейтинг: 0 / 0
29.06.2004, 16:15
    #32581623
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
Сейчас я особо отметил для себя в 6-м фикспаке

LOCAL PREDICATES NOT PUSHED THROUGH LEFT OUTER JOIN
http://www-306.ibm.com/cgi-bin/db2www/data/db2/udb/winos2unix/support/aparlib.d2w/display_apar_details?aparno=IY53213
(важно для моих запросов)

а также -901 SQLNO_PROP_ANTIJOIN_CARD()DURING QUERY COMPILE
http://www.ibm.com/cgi-bin/db2www/data/db2/udb/winos2unix/support/aparlib.d2w/display_apar_details?aparno=IY53698
может, они в этой функции что-то еще поправили?

Я изобразил небольшой тест с подсчетом телефонных звонков. Некая таблица, 18 миллионов записей и сотня служебных номеров, которые не должны учитываться, и group by по всему этому (в итоге тыща строк). Это "не должны учитываться" может быть записано двумя способами:

t1.phone not in (select t2.phone from t2)

и

not exists (select * from t2 where t1.phone = t2.phone)

Стоимость второго запроса (с antijoin) по плану втрое меньше первого, но реально работает во много раз первого (потому что сортирует 18-миллионную таблицу, для чего создает временную таблицу в temporary tablespace).

В первом случае оптимизатор считает, что после применения условия у меня останется 88 тысяч строк, во втором случае он считает (именно это должно называться "antijoin cardinality"), что одна строка(!!!). В реальности же минует фильтр более 17 миллионов.

Объяснить DB2 при помощи selectivity действительное положение дел мне не удалось. Интересно будет проверить, не получшеет ли от 6-го фикспака, и как с этим запросом будет справляться Stinger.
...
Рейтинг: 0 / 0
29.06.2004, 18:52
    #32582037
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
table1 has 8088418 rows
table2 has 225363

Three queries, each returns 31662 rows.

1 query:

select .....
from table1 join......
where .......
and
(
uid not in (select uid from table2 where table1.uid=table2.uid)
or
uid in (select uid from table2 where table1.uid=table2.uid and table1.timestamp>table2.timestamp)
)
estimated cost 833090.937500, works 13.729 seconds

2 query:
(
uid not in ( <the same> )
or exists (<the same> )
)
estimated cost 833090.937500, works 14.076 seconds

3 query:
(
not exists (<the same>)
or exists (<the same>)
)
estimated cost 1741.127075 (!), works 15.705 seconds

"Интересно будет проверить, не получшеет ли от 6-го фикспака, и как с этим запросом будет справляться Stinger." -> the same here.
...
Рейтинг: 0 / 0
30.06.2004, 13:57
    #32583308
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
Мой скриптец (вчера я данные LOAD'ом грузил, а сейчас слегка переписал)

Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
connect to ****** user vvm using ********;

UPDATE COMMAND OPTIONS USING C OFF;

DROP TABLE phone_codes;
DROP TABLE excl_phones;
DROP TABLE calls;

CREATE TABLE phone_codes(
  townCode INTEGER NOT NULL,
  townName VARCHAR( 20 ) NOT NULL
) NOT LOGGED INITIALLY;

INSERT INTO phone_codes
WITH 
  temp(x,y) AS (
    VALUES( 0 , 'Town #0')
    UNION ALL
    SELECT x+ 1 , 'Town #'||CHAR(x+ 1 )
    FROM temp
    WHERE x< 999 
  )
SELECT x,y
FROM temp;
  
CREATE UNIQUE INDEX phonecodes1 ON phone_codes(townCode) ALLOW REVERSE SCANS;
CREATE UNIQUE INDEX phonecodes2 ON phone_codes(townCode, townName) ALLOW REVERSE SCANS;
ALTER TABLE phone_codes ADD CONSTRAINT pk_pc PRIMARY KEY(townCode);
RUNSTATS ON TABLE vvm.phone_codes WITH DISTRIBUTION AND DETAILED INDEXES ALL;
COMMIT;
 --SELECT * FROM phone_codes;
 

CREATE TABLE excl_phones(
  phone BIGINT NOT NULL
) NOT LOGGED INITIALLY;

INSERT INTO excl_phones
WITH 
  temp(x) AS (
    VALUES( 0 )
    UNION ALL
    SELECT x+ 1 
    FROM temp
    WHERE x < 1000 
  )
SELECT x+ 1234500000 
FROM temp;
CREATE UNIQUE INDEX exclphones1 ON excl_phones(phone) ALLOW REVERSE SCANS;
RUNSTATS ON TABLE vvm.phone_codes WITH DISTRIBUTION AND DETAILED INDEXES ALL;
COMMIT;
 --SELECT * FROM excl_phones;
 

CREATE TABLE calls(
  phone    BIGINT  NOT NULL,
  duration INTEGER NOT NULL,
  townCode INTEGER NOT NULL
)  NOT LOGGED INITIALLY;

 -- T1
 
VALUES(current timestamp);

INSERT INTO calls
WITH 
  temp(n, phone, code, duration) AS (
    VALUES( 1 , RAND( 1 )* 1000000 , RAND()* 100 , RAND()* 1000  )
    UNION ALL
    SELECT n+ 1 , RAND()* 1000000 , RAND()* 100 , RAND()* 1000  
    FROM temp
    WHERE n< 20000000 
  )
SELECT phone+code* 10000000 , duration, code
FROM temp;
 -- T2
 
VALUES(current timestamp);
CREATE INDEX calls1 ON calls(townCode, phone, duration) ALLOW REVERSE SCANS;
RUNSTATS ON TABLE vvm.calls WITH DISTRIBUTION AND DETAILED INDEXES ALL;

 -- T3
 
VALUES(current timestamp);

COMMIT;
SELECT 
   char(cast(phone as decimal( 10 , 0 ))) phone, 
   char(cast(townCode as decimal( 3 , 0 ))) townCode, 
   duration 
FROM calls
FETCH FIRST  100  ROWS ONLY;

 -- T4
 
VALUES(current timestamp);

SELECT T2.townCode, T2.townName, SUM(T1.duration) AS SUM
FROM
  (SELECT tt1.townCode, tt1.duration
   FROM calls tt1
   WHERE tt1.duration >  10 
     AND NOT tt1.phone IN (SELECT tt2.phone FROM excl_phones tt2)
  ) T1
  RIGHT JOIN phone_codes T2 ON T1.townCode = T2.townCode
GROUP BY T2.townCode, T2.townName;
  
 -- T5
 
VALUES(current timestamp);

SELECT T2.townCode, T2.townName, SUM(T1.duration) AS SUM
FROM
  (SELECT tt1.townCode, tt1.duration
   FROM calls tt1
   WHERE tt1.duration >  10 
     AND NOT EXISTS (SELECT * FROM excl_phones tt2 where tt1.phone=tt2.phone)
  ) T1
  RIGHT JOIN phone_codes T2 ON T1.townCode = T2.townCode
GROUP BY T2.townCode, T2.townName;

 -- T6
 
VALUES(current timestamp);

SELECT T2.townCode, T2.townName, T1.duration_sum AS SUM
FROM
  (SELECT tt1.townCode, SUM(tt1.duration) duration_sum
   FROM calls tt1
   WHERE tt1.duration >  10 
     AND NOT tt1.phone IN (SELECT tt2.phone FROM excl_phones tt2)
   GROUP BY tt1.townCode
  ) T1
  RIGHT JOIN phone_codes T2 ON T1.townCode = T2.townCode
;
  
 -- T7
 
VALUES(current timestamp);

SELECT T2.townCode, T2.townName, T1.duration_sum AS SUM
FROM
  (SELECT tt1.townCode, SUM(tt1.duration) duration_sum
   FROM calls tt1
   WHERE tt1.duration >  10 
     AND NOT EXISTS (SELECT * FROM excl_phones tt2 where tt1.phone=tt2.phone)
   GROUP BY tt1.townCode
  ) T1
  RIGHT JOIN phone_codes T2 ON T1.townCode = T2.townCode
;

 -- T8
 
VALUES(current timestamp);

 -- TERMINATE;
 


...
Рейтинг: 0 / 0
30.06.2004, 14:01
    #32583317
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
Ха-ха, при выключенном автокоммите CURRENT TIMESTAMP ничего не даст ;-).
Ладно, через db2batch запросы прогоню.
...
Рейтинг: 0 / 0
30.06.2004, 14:07
    #32583336
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
Нет, тут что-то не так. Я помню, что когда-то раньше CURRENT TIMESTAMP был константой в транзакции? Или я глючу?

Теперь, во всяком случае - константа в SQL-выражении, то есть обкладывать и перемежать выражения VALUES(CURRENT TIMISTAMP) вполне можно.
...
Рейтинг: 0 / 0
30.06.2004, 14:35
    #32583437
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
Потрясающе.

1 108.119 Not Collected 1000 1
2 85.216 Not Collected 1000 1
3 77.765 Not Collected 1000 1
4 60.289 Not Collected 1000 1

Дома у меня not exists безнадежно проигрывал, а на местном сервере выигрывает. Попробовать удесятерить количество данных?
...
Рейтинг: 0 / 0
30.06.2004, 14:43
    #32583466
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
И примерное число строк в плане правильное. Чудеса, да и только.

Видимо, дело в данных. Буду разбираться.
...
Рейтинг: 0 / 0
01.07.2004, 09:37
    #32584563
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
На разных данных (примерно одинакового объема) разное поведение. Но и там, и там они сгенерированы при помощи генератора случайных чисел с равномерным распределением. Интересная задача - понять разницу.
...
Рейтинг: 0 / 0
01.07.2004, 13:26
    #32585111
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выпущен DB2 8.1.6 (FixPack 6)
Хотел попробовать посмотреть разницу между интелловским серваком и AS/400, только на AS'ке IN не принимает список. Это в V5R2M0, а в V5R3 - это уже есть? Кто знает?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выпущен DB2 8.1.6 (FixPack 6) / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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