powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / оптимизация запроса
7 сообщений из 7, страница 1 из 1
оптимизация запроса
    #36860164
gda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет ...


как переписать запрос чтобы несколько раз не изпользовать одну и туже таблицу в жойне

Код: 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.
select
count(*)
FROM deal_master DM
JOIN #SMUserPermission SUP(index indx_#SMUserPermission)
ON SUP.deal_id = DM.deal_id 

JOIN tranche_master TM
ON DM.deal_id = TM.deal_id 

LEFT OUTER JOIN ratings..debt_ratifer RF
ON TM.debt_num = RF.debt_num
and RF.shadow_cd <> "ULR"
and RF.ratg_typ_cd = "LT"

LEFT OUTER JOIN ratings..debt_ratgs DR
ON TM.debt_num = DR.debt_num
and DR.ratifer_num = RF.ratifer_num
and DR.ratg_indc = "Y"
and DR.ratg_typ_cd = RF.ratg_typ_cd
and DR.ratg_expire_dt is null 

LEFT OUTER JOIN LookUp LKP
ON LKP.lookUpDesc = DR.ratg_txt
and LKP.lookUpCategory= 10  

LEFT OUTER JOIN ratings..debt_watchlist DW
ON DW.debt_num = RF.debt_num
AND RF.ratifer_num = DW.ratifer_num
AND DW.ratg_typ_cd = "LT"
AND DW.watch_expire_dt is null
 
LEFT OUTER JOIN ratings..debt_ratgs PR
ON PR.debt_num = RF.debt_num
and PR.ratifer_num = RF.ratifer_num
and PR.ratg_indc = "Y"
and PR.ratg_typ_cd = "LT"
and PR.ratg_expire_dt is not null
and PR.ratg_dt = (select max(DPR.ratg_dt) from ratings..debt_ratgs DPR
                where DPR.debt_num = RF.debt_num
                and DPR.ratifer_num = RF.ratifer_num
                and DPR.ratg_indc = "Y"
                and DPR.ratg_typ_cd = "LT"
                and DPR.ratg_expire_dt is not null
                )

LEFT OUTER JOIN ratings..debt_ratifer RF_ST
ON TM.debt_num = RF_ST.debt_num
and RF_ST.shadow_cd <> "ULR"
and RF_ST.ratg_typ_cd = "ST"
 
LEFT OUTER JOIN ratings..debt_ratgs DR_ST
ON TM.debt_num = DR_ST.debt_num
and DR_ST.ratifer_num = RF_ST.ratifer_num
and DR_ST.ratg_indc = "Y"
and DR_ST.ratg_typ_cd = RF_ST.ratg_typ_cd
and DR_ST.ratg_expire_dt is null

LEFT OUTER JOIN ratings..debt_ratifer RF_ULR
ON TM.debt_num = RF_ULR.debt_num
and RF_ULR.shadow_cd = "ULR" 

LEFT OUTER JOIN ratings..debt_ratgs DR_ULR
ON TM.debt_num = DR_ULR.debt_num
and DR_ULR.ratifer_num = RF_ULR.ratifer_num
and DR_ULR.ratg_indc = "Y"
and DR_ULR.publish_indc = "Y"
and DR_ULR.ratg_txt not like '(P)%'
and (DR_ULR.ratg_expire_dt is null or DR_ULR.ratg_expire_dt > getdate())


сейчас запрос работает 23 сек.
...
Рейтинг: 0 / 0
оптимизация запроса
    #36860814
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых, желательно приводить структуру таблиц и индексов, чтобы получить качественный ответ)

Во вторых, я бы такой запрос разбил на несколько удобочитаемых отдельных запросов.

В третьих, если вы любите писать монстров, то используйте: круглые скобки, операторы case/and/or и будет вам счастье и монстры будут жить вечно :)
...
Рейтинг: 0 / 0
оптимизация запроса
    #36861089
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая там таблица несколько раз? (извините, но такой длинный запрос парасать мозгом лень).
Чисто стилистически лично предпочитаю связи для соединения писать в join, а условия фильтрации в where. Так легче читается запрос, а на план исполнения оно никак не влияет.
...
Рейтинг: 0 / 0
оптимизация запроса
    #36870869
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldА какая там таблица несколько раз? (извините, но такой длинный запрос парасать мозгом лень).
Чисто стилистически лично предпочитаю связи для соединения писать в join, а условия фильтрации в where. Так легче читается запрос, а на план исполнения оно никак не влияет.

почему не влияет? :)

там же LEFT JOINы. Это не только на план влияет, н ои на выборку в целом :)
Видимо вам сильно "лень" :)
...
Рейтинг: 0 / 0
оптимизация запроса
    #36870923
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gda wrote:
> как переписать запрос чтобы несколько раз не изпользовать одну и туже
> таблицу в жойне

> сейчас запрос работает 23 сек.

Как бы это достаточно сложно, и к тому же не думай, что если ты этого добьёшься,
то запрос станет работать быстро.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
оптимизация запроса
    #36870929
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gda wrote:

> сейчас запрос работает 23 сек.

Вот как бы костяк запроса.

select count(*)
FROM deal_master DM
JOIN #SMUserPermission SUP(index indx_#SMUserPermission) ON SUP.deal_id =
DM.deal_id
JOIN tranche_master TM ON DM.deal_id = TM.deal_id



Условий поиска тут тебе РОВНО НОЛЬ. Т.е. будет обрабатываться вся таблица
deal_master целиком. А если #SMUserPermission является мощным фильтром для
неё, для сделок, (вообще не должна, поскольку это судя по названию
только фильтр по правам, он мало должен отсекать), то тебе нужно
пропихивать таблицу #SMUserPermission в плане вверх. Но такой план
будет не очень подходящим к каждому пользователю, я подозреваю.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
оптимизация запроса
    #36870931
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gda wrote:

> сейчас запрос работает 23 сек.

Забыл сказать, Вообще запрос плохой. быстро и хорошо не будет работать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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