Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Оптимизация запроса в Quest Central - WTF... / 9 сообщений из 9, страница 1 из 1
05.03.2009, 17:25
    #35854048
Nafigator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
В Quest Central, кто пользуется, есть SQL tuning.
Попытался его использовать, запустил Class Compare, смотрю на самый быстрый вариант в Rewritten SQL. Кое-что в порядке (не говоря о переменных-именах столбцов ($Cx), которые приходится везде заменять, чтобы получить валидный SQL. Но ведь там есть и полная бессмыслица типа
SELECT NULL, NULL, NULL
FROM (SELECT 1 FROM (VALUES 1) AS q104) ....

кое-какие куски исходного кода просто безвозвратно утрачены - например, вызовы функций. Именно утрачены, т.к. в некоторых случаях тело функции встраивается в запрос, но в иных оптимизатор просто про функции "забывает", убирая их подчистую.

Похоже, что этот rewritten sql - нечто вроде "полуфабриката". Я могу сравнить его с чем-то вроде бормотаний вслух во время раздумий :) Спрашивается: какой смысл в этом rewritten, если по нему нельзя написать оптимизированный запрос? Или же должно, помимо Quest Central, быть установлено что-либо еще, чтобы бессмыслица превратилась в "осмыслицу"??
...
Рейтинг: 0 / 0
05.03.2009, 18:38
    #35854251
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Оптимизатор в db2 использует шаг "rewrite query" для того, чтобы такой модифицированный запрос было легче оптимизировать.
Текст этого модиф. запроса действительно выходит не в форме, пригодной для выполнения.
Но именно этот модиф. запрос используется при детальном описании шагов, которые предпринимает оптимизатор.
...
Рейтинг: 0 / 0
05.03.2009, 20:36
    #35854425
Nafigator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Mark Barinstein,

Спасибо, буду иметь в виду :)
...
Рейтинг: 0 / 0
10.03.2009, 16:29
    #35860177
Nafigator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Марк, еще вопросик.

Вот решил я последовать рекомендациям "централи" и изменить запрос.
Мне было предложено в основном JOINы заменить обычными выборками из нескольких таблиц + WHERE

Самые "тяжелые" части запроса касаются одной таблицы (TSM.ACTLOG), в которой около миллиона записей (что-то вроде "лога"). Индексы там есть, но... :)

В общем, оптимизатор мне "обещал" 140%-прирост производительности.
На деле почему-то измененный запрос получился более долгий! :(
В чем же дело?

Исходный
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT distinct
	Wizard.AlertConfig.ALERT_ID,
	TSMALERTCONFIG.ACTIVITYLOGMESSAGE.ID as Alert_Config_ID,
	TSM.TSMSERVER.CLIENT_ID,			
	TSM.ACTLOG.*		
FROM
	TSMALERTCONFIG.ACTIVITYLOGMESSAGE
	JOIN Wizard.AlertConfig ON Wizard.AlertConfig.ID = TSMALERTCONFIG.ACTIVITYLOGMESSAGE.ALERT_CONFIG_ID AND Wizard.AlertConfig.Active =  1 
	JOIN Wizard.Alert ON Wizard.Alert.ID = Wizard.AlertConfig.ALERT_ID AND Wizard.Alert.ACTIVE =  1 
	JOIN TSM.TSMSERVER ON TSM.TSMSERVER.CLIENT_ID = Wizard.AlertConfig.CLIENT_ID	
	JOIN TSM.ACTLOG ON TSM.ACTLOG.SERVER_ID = TSM.TSMSERVER.ID 
	left join TSMALERTCONFIG.ACTIVITYLOGMESSAGEINCLUSIONLIKE as d on SYSFUN.LOCATE(UPPER(REPLACE(d.NODENAME, '*', '')), UPPER(TSM.ACTLOG.NODENAME)) >  0  and d.ALERT_CONFIG_ID = TSMALERTCONFIG.ACTIVITYLOGMESSAGE.ID
	left join TSMALERTCONFIG.ACTIVITYLOGMESSAGEINCLUSIONLIKE as g on ( 1 = 1 ) and g.ALERT_CONFIG_ID = TSMALERTCONFIG.ACTIVITYLOGMESSAGE.ID
WHERE  
	(TSMALERTCONFIG.ACTIVITYLOGMESSAGE.SERVER_ID = TSM.ACTLOG.SERVER_ID OR TSMALERTCONFIG.ACTIVITYLOGMESSAGE.SERVER_ID IS NULL)
	AND (TSMALERTCONFIG.ACTIVITYLOGMESSAGE.ORIGINATOR = TSM.ACTLOG.ORIGINATOR OR TSMALERTCONFIG.ACTIVITYLOGMESSAGE.ORIGINATOR IS NULL)
	AND (TSMALERTCONFIG.ACTIVITYLOGMESSAGE.SCHEDNAME = TSM.ACTLOG.SCHEDNAME OR TSMALERTCONFIG.ACTIVITYLOGMESSAGE.SCHEDNAME IS NULL)
	AND (TSMALERTCONFIG.ACTIVITYLOGMESSAGE.SEVERITY = TSM.ACTLOG.SEVERITY OR TSMALERTCONFIG.ACTIVITYLOGMESSAGE.SEVERITY IS NULL)
	AND (TSMALERTCONFIG.ACTIVITYLOGMESSAGE.TSMMSG_MASK = TSM.ACTLOG.TSMMSG OR TSMALERTCONFIG.ACTIVITYLOGMESSAGE.TSMMSG_MASK = '')
	AND (WIZARD.LOCATE_LIKE(TSMALERTCONFIG.ACTIVITYLOGMESSAGE.MESSAGE_MASK, TSM.ACTLOG.MESSAGE) <> 'not matches')
	AND (TSM.HOURSDIFF(CURRENT_TIMESTAMP, TSM.ACTLOG.DATE_TIME) <= TSMALERTCONFIG.ACTIVITYLOGMESSAGE.HOURS)
	AND ((g.NODENAME is null) or (g.NODENAME is not null and d.NODENAME is not null))
	AND WIZARD.LOCATE_LIKE(d.NODENAME, TSM.ACTLOG.NODENAME) <> 'not matches';

Псевдооптимизация
Код: 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.
SELECT *
FROM
	(SELECT
		Q2.alert_id, 
		Q2.alert_config_id,
		Q2.tsmmsg_mask,
		Q2.message_mask,
		Q2.client_id,
		Q2.server_id,
		Q2.date_time,
		Q2.severity,
		Q2.schedname,
		Q2.originator,
		Q2.nodename,
		Q2.d_nodename,
		Q2.tsmmsg,
		Q2.message,
		g.nodename as g_nodename
	FROM
		(SELECT
			Q1.alert_id, 
			Q1.alert_config_id,
			Q1.tsmmsg_mask,
			Q1.message_mask,
			Q1.client_id,
			Q1.server_id,
			Q1.date_time,
			Q1.severity,
			Q1.schedname,
			Q1.originator,
			Q1.nodename,
			Q1.tsmmsg,
			Q1.message,
			d.nodename as d_nodename
		FROM
			(SELECT DISTINCT
				wizard.alertconfig.alert_id, 
				tsmalertconfig.activitylogmessage.id AS alert_config_id,
				tsmalertconfig.activitylogmessage.tsmmsg_mask,
				tsmalertconfig.activitylogmessage.message_mask,
				tsm.tsmserver.client_id,
				tsm.actlog.server_id,
				tsm.actlog.date_time,
				tsm.actlog.severity,
				tsm.actlog.schedname,
				tsm.actlog.originator,
				tsm.actlog.nodename,
				tsm.actlog.tsmmsg,
				tsm.actlog.message
			FROM 
				wizard.alertconfig,
				tsmalertconfig.activitylogmessage,
				wizard.alert,
				tsm.tsmserver,
				tsm.actlog
			WHERE
				wizard.alertconfig.id = tsmalertconfig.activitylogmessage.alert_config_id 
				AND wizard.alertconfig.active =  1  
				AND wizard.alert.id = wizard.alertconfig.alert_id 
				AND wizard.alert.active =  1  
				AND tsm.tsmserver.client_id = wizard.alertconfig.client_id 
				AND tsm.actlog.server_id = tsm.tsmserver.id 
				AND (tsm.Hoursdiff(CURRENT_TIMESTAMP,tsm.actlog.date_time) <= tsmalertconfig.activitylogmessage.hours)
				AND (tsmalertconfig.activitylogmessage.severity = tsm.actlog.severity OR tsmalertconfig.activitylogmessage.severity is null)
				AND (tsmalertconfig.activitylogmessage.schedname = tsm.actlog.schedname OR tsmalertconfig.activitylogmessage.schedname IS NULL)
				AND (tsmalertconfig.activitylogmessage.originator = tsm.actlog.originator OR tsmalertconfig.activitylogmessage.originator IS NULL)
				AND (tsmalertconfig.activitylogmessage.server_id = tsm.actlog.server_id OR tsmalertconfig.activitylogmessage.server_id IS NULL)) Q1
			LEFT JOIN tsmalertconfig.activitylogmessageinclusionlike AS d 
				ON sysfun.Locate(Upper(Replace(d.nodename,'*','')),Upper(Q1.nodename)) >  0  AND d.alert_config_id = Q1.alert_config_id) Q2
		LEFT JOIN tsmalertconfig.activitylogmessageinclusionlike AS g 
			ON g.alert_config_id = Q2.alert_config_id) Q3
WHERE
	(Q3.tsmmsg_mask = Q3.tsmmsg OR Q3.tsmmsg_mask = '')
	AND (wizard.Locate_like(Q3.message_mask, Q3.message) <> 'not matches')
	AND ((Q3.g_nodename IS NULL) OR (Q3.g_nodename IS NOT NULL AND Q3.d_nodename IS NOT NULL)) 
  AND wizard.Locate_like(Q3.d_nodename,Q3.nodename) <> 'not matches';
...
Рейтинг: 0 / 0
10.03.2009, 16:33
    #35860189
Nafigator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Вообще-то у меня не стояла одна скобочка... :(
Но всё равно - сейчас в "псевдо" первая выборка делается заметно быстрее. Но зато потом постоянно отставание от оригинального
...
Рейтинг: 0 / 0
10.03.2009, 17:01
    #35860267
I_love_MSDN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Код: plaintext
SELECT *
Измените на более конкретные столбцы
- Абсолют' ный
-посковый робот по MSDN для
- ленивых
...
Рейтинг: 0 / 0
10.03.2009, 17:03
    #35860273
I_love_MSDN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Кстати, с точки зрения книги "Настройка SQL. Для профессионалов" у Вас все правильно, кроме *.


- Абсолют' ный
-посковый робот по MSDN для
- ленивых
...
Рейтинг: 0 / 0
10.03.2009, 17:04
    #35860279
I_love_MSDN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
Составьте план 1 запроса, и второго. Посмотрите.
- Абсолют' ный
-посковый робот по MSDN для
- ленивых
...
Рейтинг: 0 / 0
11.03.2009, 13:59
    #35862146
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса в Quest Central - WTF...
А в первоначальном запросе можно:
1. Избавиться от DISTINCT
2. Переписать запросы с OR в UNION ALL
3. Избавиться от '<>' в пользу IN ()

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


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