Разделы
Публикации
Популярные
Новые
|
Главная » Оптимизация производительности transact 1 ... 39 40 41 42 43 44 45 ... 55 5p ps?. 14 (результат!)! co!<pauiei!b!) JiC.C GxecuLion completed. ! иВТС crintec erci msAqei i.-jiitact yci.r syster. acmlrlstrator, Retnevirg PSS л;о lor spid: ic -ser. <Hc\ 45C\KHEK PSS; PSS raOxlFF350f4 pSpd * 14 ni Cwl Gj .nF cCb ptackgrounc; = 0 pbSId U, 3.-J OiObOOOO OC0COC05 15COOCO0 0a423635 ff313668 ff47202c ffC300C0 Лбп.б .BdS sSecFlags - Oxle pdeadlccKpri - 0 pss stats - 0x20 ptickcount -~ 10593428S DCDut:ckcount = 47488887255395 ptimestamp 1999-07-07 14:35:15,273 pdatefomiat = 1 RemServer -poptions = 0x20000020 pcurstepno = 0 pcurcrad = 253 pretstat = 0 plangid = 0 Language = us engl is.h HostName - КНЕМ 45С phne = 1 pstatlist = 0 ptextsize = 64512 pslastbatchstarttTTie - 1900-Gl-Ol 00:00:00.003 hLicense 0 tpFlags = 0x1 fips nag = 0x0 sSaveSecFlags - 0x0 pfetcnstat = 0 pcrsrows - 0 pslastbatcntime - i999-0/-07 14:35:23.777 pNtDomam = KHEN 450 pubexecdb = 0 pdelimitor = pxcb = 0xlfffa028 pxcb lock -ecursion = 0 pdlckseq = 0 presSemCount = [0]8646092 pcpbtoi - 0 pcpucmdstart - 0 pbufread = 0 plogbjfread - 42 plogbufreadstart - 40 pbufwritestart = 0 pLockTinieout - 4294967295 рос poffsets = 0x0 ploginstamp 73 pr cwcount 23 pdatefirst = 7 UserName = KhEN 450\KHEN p0pt:or;s2 = 0xlf038 prowcOuPl 23 pseqstat = 0 pmeniusage = С isolatiun levei - 0 psaveob = 0 pNtUser - KF.EN finReplicatedProcExec = С pxcb->xcb xactcrt 0 presSemCount = [OJ8646092 pcputotstart = 0 pbufreadstart 0 pbufwrite - 0 ecid - 0 ec (;urckptdD = 0x0 ec cpucur = 201229 ec dbtable = Oxlf71B02B psrvproc->eclCllent = 2 psrvproc->pmo = 0x21e80028 psrvproc->ums context - Oxe45c90 psrvproc->pV7LoginRec ec stat = 0x0 ec lasierror - 0 ec ci!iderrs - С ec reswait = 0x0 psrvproc->status pcurdb - 5 ec preverror 0 ec timesiice = 16 ec dbindex = -1 128 psrvproc->bNewPacKei 00000000 00000010 00000020 b2000000 00000070 00100000 00000006 01010000 00000000 60830000 eOOlOOOO 09040000 56000800 00000000 00000000 CUDuOGjO cOCGibGC 90CC0/JO СССО;:СО0 5eC;C-;,;j ССОССО-О: ccCOCeOC гбССОбОС CC5CC-C- I-VjCjO-GQCeOOSC. 0GC0520C 0CQG4buC p i r V p r с с - >.Ti pwc fi L a ng В Li f f CCOCOOCC: 73i0650C 6cOC6500 6300/40C 2CGC2aC0 s.e. .e.c.r,. QCOCCGIG- 2C0066fiG 72QQ6G0 6dOG2GQG 61CC7bOG . G..о.n;. a O0C0CG2G; 74QG68GQ 6f00720C 7300Gd09 ОзСО t.h o.r s..... Dsrvp-GC CCOOGOGO 3GG0G01G 0OGOG020 0OG00O30 00000040 OCOOG05C 0000CC60 00000070 00000080 0OC00O9C OOOOOOaO OOOOOObO OOOOOOcO OOOOOOdO OQOOCCeC OOCOOOfO OOCOOIOC OOOGOliO 00000120 00000130 OOC00140 0OC0C150 C0000160 00000170 OOOG0180 00000190 OOOOOlaO OOOOOlbO OOOOOlcO OOOOOldO OOOOOleO OCGOOIfO 00C00200: various p: >srvio.OutDuff 040:08/7 OOOOOOCO 81090001 GLOSOGa; 0b000561 0G75CQ5f CC69C064 O0O0O0G8 GGa728C0 0B6IG075 0С5теО6с ООбеООб! OG6dO065 G0000008 0Ca7]400 08610075 005fC065 C06e006I OG6d0065 GOO0COC8 OOafCcOO 05700068 006f006o 006500GO 000900a7 28000761 G064GQ64 0C720C65 00730G73 0G0000G9 G0a71400 04630069 00740G79 000000C9 00af0200 05730074 00610074 00650300 000900af 0500037a 00690070 00000008 00320863 006f036e 0074G072 0Q6I0063 0G740Cdl 0O003137 322G3332 2а313137 36050057 68697465 07004a6f 686e736f 6e0c0034 30382034 39362d37 3232330f 00313039 33322042 69676765 2052642e Oa004d65 6e6c6f2C 5061726b 02004341 05003934 30323501 di0b0032 31332034 362d3839 31350500 47726565 6eG8004d 6l726a6f 7269650c 00343135 20393836 2d373032 301)0033 30392036 33726420 53742o20 23343131 07004f61 6b6c616e 64020043 41050039 34363138 OldlOoOO 3233382d 39352d37 37363606 00436172 736f6eC6 C0436865 72796c0c 00343135 20353438 2d373732 330e0035 38392044 61727769 6е204с6с 2e08C042 65726b65 6c5579C2 00434105 09393437 303501dl 0b003236 372d343i 2d323339 3407004f 274c656} 72790700 4d696368 61656cOc 00343038 20323836 2d323432 3814G032 3220436c 6576656c 616e6420 41762e2D 23313408 00536]6e 204a6f73 65020043 41050039 35313238 irvproc flags = 0x00000100
2-32-1176..Wnite ,.Johnson..408 4 96-7223..10932 В igge Rd.. .Men)о ,=a,-k. ,CA. ,94025, .,.213-46-8915 Green..Marjor:e. .415 986-7020. .3 09 63rd St. #411 ..Oakland CA.,9 4618,..,238-95-7 766 Carson..Che гу..415 548-772 3.,589 Darwin In ...Berkeley..CA. ,94705.. 257-41 -2394. .Cteary., Michael..408 286 2428.,22 Clcvel and Ay. #14. .San Jose,.CA..95128 DBCC execution completed. If DBCC printed error messages, contact your system administrator. Сама no с:ебе процедура ие слиии<;ом сложна, поскольку вся реальная работа выполняется с помощью DBCC. Процедура открывает курсор но таб.тице sysprocesses, вьиюлияет цикл по таблице и вы.зывает для каждого процесса соответствующую функцию DBCC. Процедура sp find root biocker Когда С5ДИ11 процесс длительное время б.чокнрует доступ к объекту другого про-песса, это обычно происходит потому, что его работу блокирует еще один иро-иесс. Такая ситуация может вызвать внртуа-чьную пень заблокированных ресурсов, которую довольно трудно отследить. В результате у администратора воз1ип<ает извечный вопрос: <sKto виноват? - загадка, для ретения которой необходим!; naiiTH первоначальных вшювников блокировок - процессы, блокируювще другие процессы, ио сами не заблоки|)ованпые. Лучши.м средство.м поиска в данной ситуации является, конечно, не лупа и не .микроскоп, а храним;1я процедура, отслеживающая блокировки процессов вп;10ть до tlx инициаторов. И.менио это вьии;лняет пр()целура sp find root blocker. Вот ее псхолпьй! код: USE master GO IF OBJ£CT [D(sp find root bloC<er) IS NOT NULl DROP PRGC sp find roct, D:ocker CREATE PROCEDURE sp firid rcot bocker Chelp c:caT(2)--NULL /* СОьен;! - sp find rocr, biccker Описание: Выполняет поиск Иг.иикаюрсь цепей от;окирс8а}гг-:ь1/ процессов Синтаксис: sp f.nG roct blocK,er Возвращаемое значение: идентификатор ьртс процесса. яв1;яющетося ичициаором цепи блокировок (если их иного, воззращае-ся последний из них) АвОр: Кеп Henderson. Еша'!; krienlphon.corn Версия: 6.0 Пример использования: sp f,nd root b ;ocker Дата создания: 1992-11-03, Дата послелнегс изменения: 1999-07-05, */ AS IF (@help=/?) GOTO Help IF EXISTS (SELECT * FROM master,.sysprocesses pi JOIN master..sysprocesses p? ON (pi,spTd=p2.blocked)) BEGIN DECLARE (Pspid int SELECT (aspTd=pl.spTd -- Получить иде.-оификатор последнего виновника -- блокировки FROM master, .sysprocesses pi JOIN master sysprocesses p2 ON (pi ,sp.o-p2.blocked) WHERE pl.blocked-O SELECT pi.spid, pi, status, loginame=LEFT(pl,loginame,20). hostname-substring(pi.hostname,1,20), blk=C0NVERT(char(3),pi,blocked), p:.c ia. pi-waitLyce i-ROM master..sysprocesses p; v,Oi,\ rr.asie . .syscocesses p2 GH (pi.5pid=p2.blocked) wHERc Pi.b!cc<eaC RLiUR.\(:3spid. -- Бз1ёест> /ййнма.атор ослеанс-го в/.човника олокировк ! END ELSE BEGIN PRINT No processes ere cur. -)iy bockinc oc.fes. RETURN4U) END RETURN и :ielp: EXEC sp jSaQe SoLjcci.ndTiebP firc; .oc:: bi.CF:c-;. б'ссс Finds the root offender;s) 1n the cndin(b) o blocked p-ocessos, parameters, retunsspid of tne root blocking process (returns the last one if there are multiple). (?author=;<en liendcrsor, Pemai i = knen(Pkhen.con,. (3version=6, (PrevisiOO, (adatecreatea19921103. @cateid5tchanced=199<C/Gb. Pexample=sp find root ciocker RETURN -1 sp fir,d root blocker (результаты cof<pauieiibi) Spid statLiS logmace hosinane bik db CT.d 7 runnabic SLbK CRE.\KF£N SLUK CR£a 0 pubs SELECT Чтобы HaiiTH процессы, блокирующие другие процессы, но не являющиеся заблокиропашнл.чп!, эта процедура выполняет объед1И1епне таблищл sysprocesses с caMoii собой. Зате.м она возврапшет набор данных, содержапин! список игпгциа-торов блокировок. Обратите В1Н1манне на присвоение значения возвращаемой пере.\[еннон @spicl. Когда для прнсвоення значе1П1я локальной пере.\[енной используется оператор SELECT, возв])аща1ощ1н'1 более одно: ! записи, пере.\[енной присваивается последнее возвращае.\юе занросо.м значение. Это значит, что, если BiHLOBHHKOB блокировок несколько, (@)spid возвратит идентификатор нослсднего из них. Процедура spJock verbose в SQL Server и.меется храни.мая процедура spjock, возвращающая полезную информацию, касающуюся блокировок ресурсов. К сожалению, она не столь удобна, как хотелось бы, из-за ее необъястимого лаконизма. Например, вместо того чтобы возвратить имя заблокированного обьекта, пронедура spjock возвращает его CHCTeNHibiH идентификатор. В.место вывода iLviemi базы даннььх заблокированного объекта она выдает только снсте.\н1ьн1 идентификатор базы данных. Кроме того, в выдавае.мо.м отчете нет ссылок на пользователей, накладывающих блокироики, - там есть то.плчо системны!! !mei!-i!!(i)iii4UTop блокирзлоначо процесса, что !ie дае! илк..лкл! информации без перекрестных ссылок на снстем-н\Ю таблицу sysprocesses. Обычно CHCTe.\H!i4ii ал.\!и!!!1сгратор за!1ускает 1цк)целуру spjock, а зате.м ире~ образо1зы!)ает иле!гги(})икаторы, иредстаиляющие iimepec, в соответствующие !1.мепа, используя подходяпше (})yi!iau!H п cc!>i.ikh па таб.1ини. Без 3Toii доволь-1В) скучной работы вгкмие .можно обойтись - вот хранн.м^тя процедура, которая выполняет все .зто .за вас: USl master GO IF CBJCC: Ij-spjocky/eroce) !b ng nul! drop PRGC so ;ocK verpose CRtATt PRGC sp loc< veroo!,e feoidl varcnaraOz-Nji! . Ut>-o/ vercr-.<jr(iO)-.NULI /* Сбьекг; so lcck verbose Описание: более инфориативная версия пооиейурЬ! sp :ock Синтаксис: sp iGC-; 7ert05e [(°:р1с11ид0!тификаОр проверяемого прсиесса][,!а5р1а2=и;!ентификатор второго проверяемого пр,И;есса] Возвращаемое значение: (нег! Ааюр: Кес Hendcson. ЬлаЛ: кг,епСо,<тег: com Версия- 4,2 Пример ис;и):ьзо8ания: sp lcc:verbose 16.2Ь -- Проберии, noo-jeccfci с идентифлкаюрами 18 и 25 Даа создания: 19у4 li-!8 Дг.та последнего изменения: 1999-06-01, */ AS se: nocoont on IF ((asp,61= ,,; GOiO I.elp DECLARE @doia varcF:ar(20), t=cbriame sysriai;*, &objr.ame sysname, (aobjio irit, (jexecstr varchar(8000). (Snexecstr nvarchar(400C) CREATE TABLE #iocks (spid int, cbio int. objid int, objc-ctname sysnaine NULL, ind:d int, type char(4;, resource ciiardS), mode cnar(lO). status char(6)) Получить общую Информацию о блок,1ровках v2 sp loc< INSERT #locks (spid, dpid, objid, indid, type, resource, mode, status) EXEC sp lock (Pspidi, (aspid2 - Цикл no рабочей табли14е и преобразование идентификатора каждого обьекта -- в имя обьекта DECLARE DBS CURSOR FOR SELECT DISTINCT dbid=CAST(dbid as varchar) FROM #locks OPEN DBS ЕЕГСН DBS INTO @abid WHILE ((a@FETCH STATUS0) BEGIN SET (adbna.me=DB NAMr(@dbid) EXEC master,.xp spr:ntf @execstr OUTPUT, UPDATE #locks SET cbjectname=o,name FROM ?s. .syscbjecis с UKbRL (#ocks.type- A3 OR #ос .ь.type- PAG ) AND dod-Ss AND #Vcks ,obj!d=c.-d, gcbraTie, ?dt;id EXEC((ae/ecstr) EXEC master. .xp spnntf (Pexecstr OUFPUT, UPDATE #:oc<s SET objectname-i .name FROM Is. .sysindexes i WHERE (#iccks,type- IDX OR #locks.iype= KEY ) AND ab.d%s AND #iocks,obj-d= i. id AND iocics. i.oidi. irdid, gcbnane, @dbid EXEC(Pexecstr) EXEC master..xp sprintf ?Gxecstr OUTPUT, UPDATE #iOcks SET objectnane=f.name FROM S;s. .sysfi ies f WHERE #Toc:<s.type= FlL AND dk-.C-is AND flocks.cbjid=f .fileid, gcbnaine. gdbid EXECOexecstr) FETCH DBS INTO Ccdbic END CLOSE DBS DEALLOCATE DBs Выда1Ь результат SELECT login=LEFT(p, ioy!r.ame,20), db LEFT(DB NAME( 1 .cb id) ,30), l.type, object=CASE wHEN 1,type=DB THEN LEFT(DB NAME(].dbid),30) ELSE LEFI(objectname,30) END, 1,resource, l,mode, 1.status, l,0Djid, 1,indid, l.spid FROM #locks 1 JOIN sysprocesses p ON (1.spid-p.spidj ORDER BY 1.2.3,4.5,6,7 DROP TABLE #locks RETURN 0 Help: EXEC sp jsage @objectname=sp lock verbose, @desc=A more verbose version of sp lock. @parameters=[@spidl=first spid to check][,@spid2=second spid to check]. @author=Ken Henderson ,@email = khoniakhen,com, @version=4 ,@revision-2, @datecreated=19941118, gdatelastchanged=19990601, @exampie= sp lock verbose 18,25 -- checks spids 18 and 25 RETURN -1 sp lock verbose (результаты сокращены)
Последовательность действий SToii ироцедуры довольно проста. Сначала она вызывает процедуру spjock и помещает полученный результат во временную таблицу, используя оператор INSERT...EXEC. Затем процедура выполняет цикл по временной таблице п обновляет поле objectname в зависимости от типа блокировки. Наконец, процедура возвращает в качестве набора данных отчет о блокт1-ровках, преобразуя при необходимости все оставшиеся идентификаторы. Может возникнуть вопрос: почему для преобразования идентификаторов объектов, возвращаемых процедурой spjock, используется не функция OBJECT NAME(), а прямой запрос к системны.м таблица.м? Причина в то.м, что функция OBJECT NAME() не работает вне связт! с контекстом базы данных. Это значит, что, если текущей! базой данных является pubs и вы передаете в качестве аргумента функции OBJECT NAME() иденттк})икатор объекта из базы данных Northwind, результатом ее выполнения будет NULL, если только этот идентификатор случайно не при.меняется в базе pubs. Поэтому при поиске имени объекта необходи.мо изыскать способ учета контекста базы данных. Один из способов - вставка перед выполпяемы.м оператором SQL вызова функции ЕХЕС() с api-ументом USE dbname, где dbname - имя базы, в которую .мы хотим переключиться. С точки зрения синтаксиса этот вартшит работает, ио не дает нужного результата. Функция OBJECT NAME() все равно возвращает NULL для идентификаторов объектов, не принадлежащих текущей базе данных. Кроме того, поскольку представления INFORMATION SCHEMA не содержат штентификаторы объектов, их нельзя использовать для исключения иря.мых запросов к системным таблицам. Так как процедура spjock возвращает только идентификаторы объектов, необходт1\ю применить перекрестные ссылки на таблицы, которые эти идентификаторы содержат - напри.мер, sysobjects, sysindexes и sysfiles. 436 Главах?. Административный Transact-SQL Процедуры каталогов Процедуры каталогов возвращают мегадаииые ooiaktoh, храни.чи.ьх на сервере. В SQL Server и.меется несколько таких процедур, но .можег оказаться, что ва.м нужно больше данных, че.м они вы.тают, нлн эти данные нужны в друго.м формате. По возможности следует избегать нря.мого обращения к таб.нша.м системного ката.юга и использовать в.место них либо прелсгав.кчтия INFORMATION SCHEMA, либо процедуры каталогов. Опосредованное обрашение к снсте.мтл.м таблица.м защитит ваш код от сбоев, даже если структура этих таблиц из.меиит-ся в следующей версии SQL Server. Процедура sp table SQL Server предостав.тяст несколько способов получения информации о столбцах, содержащихся в таблице или 111)едставленни, по ни один из них не отличается удобством. Например, процедура sp help выдает массу инфор.мацни, но формат, в котором она выдается, далек от совершенства. Во-первых, она выдает разные элементы .метаданнььх в разных наборах данных. Одна-ед1Н1Ствеииая таблица может сгенерировать полдюжины таких наборов. Во-вторых, она не допускает при.менения шаблонов, поэтому приходится анализировать каждую таб-Л11цу но отдельности. Наконец, она ие ут1)уждает себя ограничением нтртш! выводимых столбцов, и хтогпе из них требуют для отображения на экране значение, равное максимально! ! дл!!1!е типа sysname (128 символов). В результате приход!!тся долго переме1!1аться !i() экрану ,\юн1ггора только для toio, чтобы увидеть баЗОВу!0 С!1е!Н!ф!1Ка!Н!!0 столб!юв табли!ия. Представле!!1!е INFORMATION SCHEMA.COLUMNS имеет .множество !<ак тех же самых, так и своих собственных недостатко!!. В целях их устра1!е!!ня !i были иа-писань! приведе!!!1ь!е да-тее процедурь!. Воз,\!ожио, в h!ix есть сво!! проблемы, !ю, по крайней мере, это проблемы другого рода. Расс.\!0трп.\1 !1роцедуру sp table: USE master GO IF OBJECT ID(sp table) IS NOT NULL DROP PROC sp table CREATE PROC sp tabie @objectname sysname = T /* Обьект; sp table Описание: выдает список столбцов .таблицы Синтаксис: sp table [@оЬ0есЬпате1=имя таблицы или предС[ав)Тения (ло у.чолчанию meci значение %) Возвращаемое значение: (Hei) Автор; Ken Henderson, Email: khenPkhen.com Версия: 4,2 Пример использования: sp table authors Дата создания: 1994-G2-04. Дата последнего измепения: 1999-G4-II. SET NCCCUiV с: [г ((aotjecinaiiifc /?. G;;;o DECIARE Gbjecti CLl-SCR rCR SELEC fcr.i. FROM sysoDject: WHERE y:d:ne Ikc- ifubjLCtCidlt AND type in (U . S , V ; 0E\ Objects FETCH Objects INIO gobjectraniC IF (gC=FrTCH SrAlUS-~>0) BEGIN -- nei пи,.ед£.Яйи/ соье.чтсь CLOSE Objects CEALLGCATE Objtcts PRINT No table(s; C vie 4S/ were founa trai п.йТст 4:t;bjectran ie GOTO Help WHILE (&&FtiCl STAlLS-G; BEGIN PRINT Nana; +@objectnar,e PRINT Type: +CASE WHEN OBJECTPROPERTY(OBJFCi ID(C objectnai!ie). IsuserTabe)=1 THEN Table WHEN OBJECTPRGPERTY(OBJECi ID(?cbjectnanie), IsSyste-iiiable )-l THEN System labie WHEN 0BJECTPR0.DER:Y(0BJECr I0(5iobjectnaTie). Isview)=i IHEN View ENO PRINT CHAR(I3) SELECT No.=C.coiia. Na;ne=LErT(C.na:ne.30), Type=LEFT(CASE WHEN (T.nair.e IN {cnar.varciiar,nchar.nvarchar )) THEN T. na,Tie+ ( +LTRI M( RIR IM (STR; С, 1 erg t n))} <-) ELSE t.name END,3C}+ +CASF C,status WHEN 1 THEN NULL ELSE NOT NULL- ENJ FRCM syscolunrs с JOIN sysoojects с ON (c.iG - o.;d) JOIN systypes t ON (cxusertype - t.xusertype) WHERE o.name eobjectname ORDER B C.ccl;c FETCH Objects INTO Poojectname CLOSE Objects DEALLOCATE Objects RETURN G hep: EXtC sp usage ?Gbjectnai№ sp table. Jdesc-Lists the coluiTins in a table. Pparanieters=Lf?objectnan;ej=Na[Tie of table or view to list catalog mfo for (defaults to I ). (?exampleSp i3Dle autnors , @author= Ken Henderson. Pema i! khenCo<hen. co.m, Aversion--4. iarevision=2, C=Gatecre3ted= I99402G4. (ajatelastchanged-1999041] RETURN -1 GO (результагы сокращены) sp taole authors
Эта процедура выдает простой список столбцов представления или таблицы с помощью запроса к таблица.м syscolumns, sysobjects и systypes и фор.матирования выводимых данных до разумной длины. Данные форматируются подобно ко.манде DESC в Oracle и содержат краткое оннсание того, какие столбцы имеются в объекте. Рассмотренный пример не делает шщего особенного. Он не распознает ноль-зовательскне типы да1шых и не выдает всио.могательную 1И1формацию, касающуюся, например, ограничений, индексов или триггеров. Его основная задача -предоставить оперативные данные о структуре таблицы или представления, Он допускает применение шаблонов, по,этому можно вывести дашгые сразу о нескольких таблицах нз одной базы данных. Процедура sp dir к самостоягельны.м объекта.м баз данных относятся таблицы, храни.мые процедуры, триггеры, объекты-умолчашш, объекты-правила, а также пользовательские тины данных. В SQL Server ие хватает процедуры или представления, которые могли бы перечислить все эти объекты сразу. Не существует простого способа получить список всех объектов, которые вы создали в базе данных, не прнбепш к спецнальным запроса.м к систе.мны.м таблица.м. И.меино иоэто.му была наниса-на процедура sp dir. Она выдает листинг, наиом1Н1ающий тот, что выдает ко.манда операционной системы DIR, и включает все объекты, и.мена которых соответствуют указанно.му шаблону. Рассмотрим код этой пронедуры; USE master GO IF 0BJECT lDCsp Oir) IS NOT NULL OROP PROC sp dir CREATE PROCEDURE 5p dir @ma5k varcharOO) - %\ Pobtype varchar(2) = U. @orderby varchar(8000)=/N Обьект: sp dir 1 ... 39 40 41 42 43 44 45 ... 55 |
© 2004-2024 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки. |