Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите упросить запрос. Подвисает иногда  [new]
DSO
Member

Откуда: Украина
Сообщений: 186
Исходные: Есть в таблице TEMP_J1_18 платежи. Каждый из них имеет свой platkod (код платежа).

Необходимо: Создать выборку квитанций. Каждая квитанция состоит из списка 18 платежей у которых PlatKod =


AND  usl11.PlatKod = '19001'
AND  usl12.PlatKod = '20001'
AND  usl13.PlatKod = '21001'

AND  usl2.PlatKod = '40001'

AND  usl3.PlatKod = '22002'

AND  usl4.PlatKod = '22003'

AND  usl5.PlatKod = '22004'

AND  usl6.PlatKod = '22005'

AND  usl71.PlatKod = '19002'
AND  usl72.PlatKod = '20002'
AND  usl73.PlatKod = '21002'

AND  usl81.PlatKod = '35001'
AND  usl82.PlatKod = '35002'
AND  usl83.PlatKod = '35003'

AND  usl91.PlatKod = '19004' 
AND  usl92.PlatKod = '20004'
AND  usl93.PlatKod = '21004'

Объединять их нужно с помощью PersonalID


Есть запрос.

Select 
usl11.ID, 
usl11.LS, 
usl11.PlatData, 
usl11.PlatTime, 
usl11.NoKvit, 
usl11.Jeu,  
usl11.Ulica, 
usl11.Dom, 
usl11.Kv, 
usl11.Ns, 
usl11.PlatKod, 
usl11.Oper, 
usl11.OperComp, 

usl11.PlatSum  AS PlatSum11, 
usl12.PlatSum  AS PlatSum12, 
usl13.PlatSum  AS PlatSum13, 

usl2.PlatSum   AS PlatSum2, 
usl3.PlatSum   AS PlatSum3, 
usl4.PlatSum   AS PlatSum4, 
usl5.PlatSum   AS PlatSum5, 
usl6.PlatSum   AS PlatSum6, 


usl71.PlatSum   AS PlatSum71, 
usl72.PlatSum   AS PlatSum72, 
usl73.PlatSum   AS PlatSum73, 

usl81.PlatSum   AS PlatSum81, 
usl82.PlatSum   AS PlatSum82, 
usl83.PlatSum   AS PlatSum83, 

usl91.PlatSum   AS PlatSum91, 
usl92.PlatSum   AS PlatSum92, 
usl93.PlatSum   AS PlatSum93, 

usl10.PlatSum   AS PlatSum10, 

usl11.Otdelenie, 

usl11.PlatStatus AS PlatStatus, 
usl11.SrStatus, 
usl11.UlicaFull, 
usl11.Fio, 
usl11.OperDay, 
usl11.PersonalID, 

usl11.TKE_DOLG AS Dolg1,
usl2.TKE_DOLG  AS Dolg2,
usl3.TKE_DOLG  AS Dolg3,
usl4.TKE_DOLG  AS Dolg4,
usl5.TKE_DOLG  AS Dolg5,
usl6.TKE_DOLG  AS Dolg6,
usl71.TKE_DOLG  AS Dolg7,
usl81.TKE_DOLG  AS Dolg8,
usl91.TKE_DOLG  AS Dolg9,

usl10.TKE_DOLG  AS Dolg10,

usl11.TKE_FAKT	 AS Fakt1,
usl2.TKE_FAKT 	 	AS Fakt2,
usl3.TKE_FAKT 	 	AS Fakt3,
usl4.TKE_FAKT 	 	AS Fakt4,
usl5.TKE_FAKT 	 	AS Fakt5,
usl6.TKE_FAKT 	 	AS Fakt6,
usl71.TKE_FAKT 	 AS Fakt7,
usl81.TKE_FAKT 	 AS Fakt8,
usl91.TKE_FAKT 	 AS Fakt9,
usl10.TKE_FAKT 	 AS Fakt10,


usl11.TKE_TARIF 	 AS Tarif1,
usl2.TKE_TARIF 	 AS Tarif2,
usl3.TKE_TARIF 	 AS Tarif3,
usl4.TKE_TARIF	 AS Tarif4,
usl5.TKE_TARIF  	 AS Tarif5,
usl6.TKE_TARIF	 AS Tarif6,
usl71.TKE_TARIF 	 AS Tarif7,
usl81.TKE_TARIF 	 AS Tarif8,
usl91.TKE_TARIF 	 AS Tarif9,
usl10.TKE_TARIF 	 AS Tarif10,

usl11.TKE_SUM   AS Nach1,
usl2.TKE_SUM   AS Nach2,
usl3.TKE_SUM   AS Nach3,
usl4.TKE_SUM   AS Nach4,
usl5.TKE_SUM   AS Nach5,
usl6.TKE_SUM   AS Nach6,
usl71.TKE_SUM   AS Nach7,
usl81.TKE_SUM   AS Nach8,
usl91.TKE_SUM   AS Nach9,
usl10.TKE_SUM   AS Nach10,

usl11.TKE_SUBS  AS Subs1,
usl2.TKE_SUBS   AS Subs2,
usl3.TKE_SUBS   AS Subs3,
usl4.TKE_SUBS   AS Subs4,
usl5.TKE_SUBS   AS Subs5,
usl6.TKE_SUBS   AS Subs6,
usl71.TKE_SUBS   AS Subs7,
usl81.TKE_SUBS   AS Subs8,
usl91.TKE_SUBS   AS Subs9,
usl10.TKE_SUBS   AS Subs10,

usl11.TKE_OPLPRED AS OplPred1,
usl2.TKE_OPLPRED  AS OplPred2,
usl3.TKE_OPLPRED  AS OplPred3,
usl4.TKE_OPLPRED  AS OplPred4,
usl5.TKE_OPLPRED  AS OplPred5,
usl6.TKE_OPLPRED  AS OplPred6,
usl71.TKE_OPLPRED  AS OplPred7,
usl81.TKE_OPLPRED  AS OplPred8,
usl91.TKE_OPLPRED  AS OplPred9,
usl10.TKE_OPLPRED  AS OplPred10,

usl11.TRK_OPL   AS Opl1,
usl2.TRK_OPL    AS Opl2,
usl3.TRK_OPL    AS Opl3,
usl4.TRK_OPL    AS Opl4,
usl5.TRK_OPL    AS Opl5,
usl6.TRK_OPL     AS Opl6,
usl71.TRK_OPL    AS Opl7,
usl81.TRK_OPL    AS Opl8,
usl91.TRK_OPL    AS Opl9,
usl10.TRK_OPL    AS Opl10,

usl11.TKE_DolgNa,
usl11.OplID

-- USL11
-- USL12
-- USL13

from    TEMP_J1_18 usl11,  
	TEMP_J1_18 usl12,
	TEMP_J1_18 usl13,
	TEMP_J1_18 usl2, 
	TEMP_J1_18 usl3, 
	TEMP_J1_18 usl4, 
	TEMP_J1_18 usl5, 
	TEMP_J1_18 usl6, 
	TEMP_J1_18 usl71, 
	TEMP_J1_18 usl72, 
	TEMP_J1_18 usl73, 
	TEMP_J1_18 usl81, 
	TEMP_J1_18 usl82, 
	TEMP_J1_18 usl83, 
	TEMP_J1_18 usl91, 
	TEMP_J1_18 usl92, 
	TEMP_J1_18 usl93, 
	TEMP_J1_18 usl10

where


      usl11.PersonalId = usl12.PersonalId
AND   usl11.PersonalId = usl13.PersonalId	

AND   usl11.PersonalId = usl2.PersonalId	

AND   usl11.PersonalId = usl3.PersonalId	

AND   usl11.PersonalId = usl4.PersonalId	

AND   usl11.PersonalId = usl5.PersonalId	

AND   usl11.PersonalId = usl6.PersonalId	

AND   usl11.PersonalId = usl71.PersonalId	
AND   usl11.PersonalId = usl72.PersonalId	
AND   usl11.PersonalId = usl73.PersonalId	

AND   usl11.PersonalId = usl81.PersonalId	
AND   usl11.PersonalId = usl82.PersonalId	
AND   usl11.PersonalId = usl83.PersonalId	

AND   usl11.PersonalId = usl91.PersonalId	
AND   usl11.PersonalId = usl92.PersonalId	
AND   usl11.PersonalId = usl93.PersonalId	

AND   usl11.PersonalId = usl10.PersonalId	


AND  usl11.PlatKod = '19001'
AND  usl12.PlatKod = '20001'
AND  usl13.PlatKod = '21001'

AND  usl2.PlatKod = '40001'

AND  usl3.PlatKod = '22002'

AND  usl4.PlatKod = '22003'

AND  usl5.PlatKod = '22004'

AND  usl6.PlatKod = '22005'

AND  usl71.PlatKod = '19002'
AND  usl72.PlatKod = '20002'
AND  usl73.PlatKod = '21002'

AND  usl81.PlatKod = '35001'
AND  usl82.PlatKod = '35002'
AND  usl83.PlatKod = '35003'

AND  usl91.PlatKod = '19004' 
AND  usl92.PlatKod = '20004'
AND  usl93.PlatKod = '21004'

AND  usl10.PlatKod = '20005'

но он тяжелый, временами подвисает и если не через аналайзер запускать а через интерфейс то отображает "Время ожидания истекло". Запрос может выполняться как 3 секунды так и 30 не завися от итогового колличества квитанций.
16 дек 09, 13:04    [8074817]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упросить запрос. Подвисает иногда  [new]
vino
Member

Откуда:
Сообщений: 1191
DSO
...Запрос может выполняться как 3 секунды так и 30 не завися от итогового колличества квитанций.
Если это OLTP, то неравномерность выполнения запроса на загруженном серваке - обычное явление.
Почему бы не выполнять такой запрос на копии, расположенной на другом сервере?
Как не лучший вариант - понизьте уровень блокировок, например, с чтением грязных данных, если для вас это не критично. Попробуйте хотя бы так
from    TEMP_J1_18 usl11 WITH(NOLOCK),  
	TEMP_J1_18 usl12 WITH(NOLOCK),
	TEMP_J1_18 usl13 WITH(NOLOCK),
	TEMP_J1_18 usl2 WITH(NOLOCK), 
	TEMP_J1_18 usl3 WITH(NOLOCK), 
	TEMP_J1_18 usl4 WITH(NOLOCK), 
	TEMP_J1_18 usl5 WITH(NOLOCK), 
	TEMP_J1_18 usl6 WITH(NOLOCK), 
	TEMP_J1_18 usl71 WITH(NOLOCK), 
	TEMP_J1_18 usl72 WITH(NOLOCK), 
	TEMP_J1_18 usl73 WITH(NOLOCK), 
	TEMP_J1_18 usl81 WITH(NOLOCK), 
	TEMP_J1_18 usl82 WITH(NOLOCK), 
	TEMP_J1_18 usl83 WITH(NOLOCK), 
	TEMP_J1_18 usl91 WITH(NOLOCK), 
	TEMP_J1_18 usl92 WITH(NOLOCK), 
	TEMP_J1_18 usl93 WITH(NOLOCK), 
	TEMP_J1_18 usl10 WITH(NOLOCK)

16 дек 09, 13:28    [8075003]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упросить запрос. Подвисает иногда  [new]
Amal
Member

Откуда:
Сообщений: 14
Я так понял надо таблицу из нормальной формы преобразовать в "строки".
я бы разбил задачу на 2а этапа
1. преобразование каждой "нормальной строки" к новому виду
Что то типа

Select 
usl.ID, 
usl.LS, 
usl.PlatData, 
usl.PlatTime, 
usl.NoKvit, 
usl.Jeu,  
usl.Ulica, 
usl.Dom, 
usl.Kv, 
usl.Ns, 
usl.PlatKod, 
usl.Oper, 
usl.OperComp, 

Case(when usl.PlatKod = '19001'  then usl.PlatSum else null)  AS PlatSum11, 
Case(when usl.PlatKod = '20001'  then usl.PlatSum else null)   AS PlatSum12, 
...
from    TEMP_J1_18 usl

2. Свернуть полученные строки по нужным нам критериям
например
Select .... ,Sum(PlatSum11),sum(PlatSum12),...
Group by ...

В принципе можно объединить в один селект. Но это после того как убедимся что все делается как надо.
16 дек 09, 16:02    [8076414]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить