powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Оптимизация запроса в Quest Central - WTF...
9 сообщений из 9, страница 1 из 1
Оптимизация запроса в Quest Central - WTF...
    #35854048
Nafigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 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
Оптимизация запроса в Quest Central - WTF...
    #35854251
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оптимизатор в db2 использует шаг "rewrite query" для того, чтобы такой модифицированный запрос было легче оптимизировать.
Текст этого модиф. запроса действительно выходит не в форме, пригодной для выполнения.
Но именно этот модиф. запрос используется при детальном описании шагов, которые предпринимает оптимизатор.
...
Рейтинг: 0 / 0
Оптимизация запроса в Quest Central - WTF...
    #35854425
Nafigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

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

Вот решил я последовать рекомендациям "централи" и изменить запрос.
Мне было предложено в основном 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
Оптимизация запроса в Quest Central - WTF...
    #35860189
Nafigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то у меня не стояла одна скобочка... :(
Но всё равно - сейчас в "псевдо" первая выборка делается заметно быстрее. Но зато потом постоянно отставание от оригинального
...
Рейтинг: 0 / 0
Оптимизация запроса в Quest Central - WTF...
    #35860267
Фотография I_love_MSDN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
SELECT *
Измените на более конкретные столбцы
- Абсолют' ный
-посковый робот по MSDN для
- ленивых
...
Рейтинг: 0 / 0
Оптимизация запроса в Quest Central - WTF...
    #35860273
Фотография I_love_MSDN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, с точки зрения книги "Настройка SQL. Для профессионалов" у Вас все правильно, кроме *.


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

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


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