Roinnt gnéithe de mhonatóireacht MS SQL Server. Treoirlínte chun Bratacha Rian a Shocrú

Réamhrá

Go minic, tagann úsáideoirí, forbróirí agus riarthóirí an MS SQL Server DBMS ar fhadhbanna feidhmíochta an bhunachair shonraí nó an DBMS ina iomláine, agus mar sin tá monatóireacht MS SQL Server an-ábhartha.
Tá an t-alt seo mar bhreis ar an alt Ag baint úsáide as Zabbix chun Monatóireacht a dhéanamh ar Bhunachar Sonraí Freastalaí MS SQL agus clúdóidh sé roinnt gnéithe den fhaireachán a dhéanamh ar MS SQL Server, go háirithe: conas a chinneadh go tapa cé na hacmhainní atá in easnamh, chomh maith le moltaí chun rianbhrait a shocrú.
Le go n-oibreoidh na scripteanna seo a leanas, ní mór duit scéimre inf a chruthú sa bhunachar sonraí atá uait mar seo a leanas:
Scéimre inf a chruthú

use <имя_БД>;
go
create schema inf;

Modh chun easpa RAM a bhrath

Is é an chéad táscaire ar an easpa RAM an cás nuair a itheann sampla de MS SQL Server suas an RAM go léir a leithdháileadh air.
Chun seo a dhéanamh, cruthóimid an léiriú seo a leanas de inf.vRAM:
An t-amharc inf.vRAM á chruthú

CREATE view [inf].[vRAM] as
select a.[TotalAvailOSRam_Mb]						--сколько свободно ОЗУ на сервере в МБ
		 , a.[RAM_Avail_Percent]					--процент свободного ОЗУ на сервере
		 , a.[Server_physical_memory_Mb]				--сколько всего ОЗУ на сервере в МБ
		 , a.[SQL_server_committed_target_Mb]			--сколько всего ОЗУ выделено под MS SQL Server в МБ
		 , a.[SQL_server_physical_memory_in_use_Mb] 		--сколько всего ОЗУ потребляет MS SQL Server в данный момент времени в МБ
		 , a.[SQL_RAM_Avail_Percent]				--поцент свободного ОЗУ для MS SQL Server относительно всего выделенного ОЗУ для MS SQL Server
		 , a.[StateMemorySQL]						--достаточно ли ОЗУ для MS SQL Server
		 , a.[SQL_RAM_Reserve_Percent]				--процент выделенной ОЗУ для MS SQL Server относительно всего ОЗУ сервера
		 --достаточно ли ОЗУ для сервера
		, (case when a.[RAM_Avail_Percent]<10 and a.[RAM_Avail_Percent]>5 and a.[TotalAvailOSRam_Mb]<8192 then 'Warning' when a.[RAM_Avail_Percent]<=5 and a.[TotalAvailOSRam_Mb]<2048 then 'Danger' else 'Normal' end) as [StateMemoryServer]
	from
	(
		select cast(a0.available_physical_memory_kb/1024.0 as int) as TotalAvailOSRam_Mb
			 , cast((a0.available_physical_memory_kb/casT(a0.total_physical_memory_kb as float))*100 as numeric(5,2)) as [RAM_Avail_Percent]
			 , a0.system_low_memory_signal_state
			 , ceiling(b.physical_memory_kb/1024.0) as [Server_physical_memory_Mb]
			 , ceiling(b.committed_target_kb/1024.0) as [SQL_server_committed_target_Mb]
			 , ceiling(a.physical_memory_in_use_kb/1024.0) as [SQL_server_physical_memory_in_use_Mb]
			 , cast(((b.committed_target_kb-a.physical_memory_in_use_kb)/casT(b.committed_target_kb as float))*100 as numeric(5,2)) as [SQL_RAM_Avail_Percent]
			 , cast((b.committed_target_kb/casT(a0.total_physical_memory_kb as float))*100 as numeric(5,2)) as [SQL_RAM_Reserve_Percent]
			 , (case when (ceiling(b.committed_target_kb/1024.0)-1024)<ceiling(a.physical_memory_in_use_kb/1024.0) then 'Warning' else 'Normal' end) as [StateMemorySQL]
		from sys.dm_os_sys_memory as a0
		cross join sys.dm_os_process_memory as a
		cross join sys.dm_os_sys_info as b
		cross join sys.dm_os_sys_memory as v
	) as a;

Ansin is féidir leat a chinneadh go n-ídíonn sampla de MS SQL Server an chuimhne ar fad a leithdháiltear dó ag an gceist seo a leanas:

select  SQL_server_physical_memory_in_use_Mb,  SQL_server_committed_target_Mb
from [inf].[vRAM];

Má tá SQL_server_physical_memory_in_use_Mb comhsheasmhach níos mó ná nó cothrom le SQL_server_committed_target_Mb, ansin ba chóir na staitisticí feithimh a sheiceáil.
Chun an easpa RAM a chinneadh trí staitisticí feithimh, cruthaímid an t-amharc inf.vWaits:
Ag cruthú an Amharc inf.vWaits

CREATE view [inf].[vWaits] as
WITH [Waits] AS
    (SELECT
        [wait_type], --имя типа ожидания
        [wait_time_ms] / 1000.0 AS [WaitS],--Общее время ожидания данного типа в миллисекундах. Это время включает signal_wait_time_ms
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],--Общее время ожидания данного типа в миллисекундах без signal_wait_time_ms
        [signal_wait_time_ms] / 1000.0 AS [SignalS],--Разница между временем сигнализации ожидающего потока и временем начала его выполнения
        [waiting_tasks_count] AS [WaitCount],--Число ожиданий данного типа. Этот счетчик наращивается каждый раз при начале ожидания
        100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
        ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
    FROM sys.dm_os_wait_stats
    WHERE [waiting_tasks_count]>0
		and [wait_type] NOT IN (
        N'BROKER_EVENTHANDLER',         N'BROKER_RECEIVE_WAITFOR',
        N'BROKER_TASK_STOP',            N'BROKER_TO_FLUSH',
        N'BROKER_TRANSMITTER',          N'CHECKPOINT_QUEUE',
        N'CHKPT',                       N'CLR_AUTO_EVENT',
        N'CLR_MANUAL_EVENT',            N'CLR_SEMAPHORE',
        N'DBMIRROR_DBM_EVENT',          N'DBMIRROR_EVENTS_QUEUE',
        N'DBMIRROR_WORKER_QUEUE',       N'DBMIRRORING_CMD',
        N'DIRTY_PAGE_POLL',             N'DISPATCHER_QUEUE_SEMAPHORE',
        N'EXECSYNC',                    N'FSAGENT',
        N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
        N'HADR_CLUSAPI_CALL',           N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'HADR_LOGCAPTURE_WAIT',        N'HADR_NOTIFICATION_DEQUEUE',
        N'HADR_TIMER_TASK',             N'HADR_WORK_QUEUE',
        N'KSOURCE_WAKEUP',              N'LAZYWRITER_SLEEP',
        N'LOGMGR_QUEUE',                N'ONDEMAND_TASK_QUEUE',
        N'PWAIT_ALL_COMPONENTS_INITIALIZED',
        N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
        N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
        N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
        N'SERVER_IDLE_CHECK',           N'SLEEP_BPOOL_FLUSH',
        N'SLEEP_DBSTARTUP',             N'SLEEP_DCOMSTARTUP',
        N'SLEEP_MASTERDBREADY',         N'SLEEP_MASTERMDREADY',
        N'SLEEP_MASTERUPGRADED',        N'SLEEP_MSDBSTARTUP',
        N'SLEEP_SYSTEMTASK',            N'SLEEP_TASK',
        N'SLEEP_TEMPDBSTARTUP',         N'SNI_HTTP_ACCEPT',
        N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
        N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
        N'SQLTRACE_WAIT_ENTRIES',       N'WAIT_FOR_RESULTS',
        N'WAITFOR',                     N'WAITFOR_TASKSHUTDOWN',
        N'WAIT_XTP_HOST_WAIT',          N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
        N'WAIT_XTP_CKPT_CLOSE',         N'XE_DISPATCHER_JOIN',
        N'XE_DISPATCHER_WAIT',          N'XE_TIMER_EVENT')
    )
, ress as (
	SELECT
	    [W1].[wait_type] AS [WaitType],
	    CAST ([W1].[WaitS] AS DECIMAL (16, 2)) AS [Wait_S],--Общее время ожидания данного типа в миллисекундах. Это время включает signal_wait_time_ms
	    CAST ([W1].[ResourceS] AS DECIMAL (16, 2)) AS [Resource_S],--Общее время ожидания данного типа в миллисекундах без signal_wait_time_ms
	    CAST ([W1].[SignalS] AS DECIMAL (16, 2)) AS [Signal_S],--Разница между временем сигнализации ожидающего потока и временем начала его выполнения
	    [W1].[WaitCount] AS [WaitCount],--Число ожиданий данного типа. Этот счетчик наращивается каждый раз при начале ожидания
	    CAST ([W1].[Percentage] AS DECIMAL (5, 2)) AS [Percentage],
	    CAST (([W1].[WaitS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgWait_S],
	    CAST (([W1].[ResourceS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgRes_S],
	    CAST (([W1].[SignalS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgSig_S]
	FROM [Waits] AS [W1]
	INNER JOIN [Waits] AS [W2]
	    ON [W2].[RowNum] <= [W1].[RowNum]
	GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[WaitS],
	    [W1].[ResourceS], [W1].[SignalS], [W1].[WaitCount], [W1].[Percentage]
	HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95 -- percentage threshold
)
SELECT [WaitType]
      ,MAX([Wait_S]) as [Wait_S]
      ,MAX([Resource_S]) as [Resource_S]
      ,MAX([Signal_S]) as [Signal_S]
      ,MAX([WaitCount]) as [WaitCount]
      ,MAX([Percentage]) as [Percentage]
      ,MAX([AvgWait_S]) as [AvgWait_S]
      ,MAX([AvgRes_S]) as [AvgRes_S]
      ,MAX([AvgSig_S]) as [AvgSig_S]
  FROM ress
  group by [WaitType];

Sa chás seo, is féidir leat an easpa RAM a chinneadh leis an gceist seo a leanas:

SELECT [Percentage]
      ,[AvgWait_S]
  FROM [inf].[vWaits]
  where [WaitType] in (
    'PAGEIOLATCH_XX',
    'RESOURCE_SEMAPHORE',
    'RESOURCE_SEMAPHORE_QUERY_COMPILE'
  );

Anseo ní mór duit aird a thabhairt ar na táscairí Céatadán agus AvgWait_S. Má tá siad suntasach ina n-iomláine, tá dóchúlacht an-ard ann nach bhfuil go leor RAM ann don chás MS SQL Server. Socraítear luachanna suntasacha ina n-aonar do gach córas. Mar sin féin, is féidir leat tosú leis an méid seo a leanas: Céatadán>=1 agus AvgWait_S>=0.005.
Chun táscairí a aschur chuig córas monatóireachta (mar shampla, Zabbix), is féidir leat an dá cheist seo a leanas a chruthú:

  1. cé mhéad cineál feithimh atá á n-áitiú ag RAM ina chéatadán (suim gach cineál feithimh den sórt sin):
    select coalesce(sum([Percentage]), 0.00) as [Percentage]
    from [inf].[vWaits]
           where [WaitType] in (
               'PAGEIOLATCH_XX',
               'RESOURCE_SEMAPHORE',
                'RESOURCE_SEMAPHORE_QUERY_COMPILE'
      );
    
  2. cé mhéad cineálacha feithimh RAM a thógann i milleasoicindí (uasluach na meánmhoill do gach cineál feithimh den sórt sin):
    select coalesce(max([AvgWait_S])*1000, 0.00) as [AvgWait_MS]
    from [inf].[vWaits]
           where [WaitType] in (
               'PAGEIOLATCH_XX',
               'RESOURCE_SEMAPHORE',
                'RESOURCE_SEMAPHORE_QUERY_COMPILE'
      );
    

Bunaithe ar dhinimic na luachanna faighte don dá tháscaire seo, is féidir linn a thabhairt i gcrích an bhfuil go leor RAM ann le haghaidh MS SQL Server.

Modh Braite Overload CPU

Chun an easpa ama próiseálaí a aithint, is leor an t-amharc córais sys.dm_os_schedulers a úsáid. Anseo, má bhíonn an runnable_tasks_count i gcónaí níos mó ná 1, tá dóchúlacht ard ann nach leor líon na gcroíthe don chás MS SQL Server.
Chun táscaire a aschur chuig córas monatóireachta (mar shampla, Zabbix), is féidir leat an cheist seo a leanas a chruthú:

select max([runnable_tasks_count]) as [runnable_tasks_count]
from sys.dm_os_schedulers
where scheduler_id<255;

Bunaithe ar dhinimic na luachanna faighte don táscaire seo, is féidir linn a thabhairt i gcrích an bhfuil go leor ama próiseálaí (líon na gcroí LAP) le haghaidh sampla de MS SQL Server.
Mar sin féin, tá sé tábhachtach a choinneáil i gcuimhne gur féidir le hiarratais iad féin a iarraidh snáitheanna iolracha ag an am céanna. Agus uaireanta ní féidir leis an optimizer castacht an fhiosrúcháin féin a mheas i gceart. Ansin féadfar an iomarca snáitheanna a leithdháileadh ar an iarratas nach féidir a phróiseáil ag an am céanna ag an am ar leith. Agus is cúis leis seo freisin cineál feithimh a bhaineann le heaspa ama próiseálaí, agus fás na scuaine do sceidealóirí a úsáideann croíleacáin LAP ar leith, i.e. fásfaidh an táscaire runnable_tasks_count i gcoinníollacha den sórt sin.
Sa chás seo, sula n-ardóidh líon na gcroí LAP, is gá airíonna comhthreomharais an MS SQL Server féin a chumrú i gceart, agus ó leagan 2016, airíonna comhthreomharachta na mbunachair shonraí riachtanacha a chumrú i gceart:
Roinnt gnéithe de mhonatóireacht MS SQL Server. Treoirlínte chun Bratacha Rian a Shocrú

Roinnt gnéithe de mhonatóireacht MS SQL Server. Treoirlínte chun Bratacha Rian a Shocrú
Anseo ba chóir duit aird a thabhairt ar na paraiméadair seo a leanas:

  1. Céim Uasta Comhthreomhaireachta - socraítear an t-uaslíon snáitheanna is féidir a leithdháileadh ar gach iarratas (is é 0 an réamhshocrú - teoranta ag an gcóras oibriúcháin féin agus ag eagrán MS SQL Server amháin)
  2. Tairseach Costais don Chomhthreomhaireacht - costas measta na comhthreomhar (5 réamhshocraithe)
  3. Max DOP - socraíonn sé an t-uaslíon snáitheanna is féidir a leithdháileadh ar gach ceist ag leibhéal an bhunachair shonraí (ach ní mó ná luach na maoine "Uasmhéid Comhthreomhaireachta") (is é 0 an réamhshocrú - teoranta ag an gcóras oibriúcháin féin amháin agus an t-eagrán de MS SQL Server, chomh maith leis an srian ar an maoin "Max Degree of Parallelism" den ásc iomlán de MS SQL Server)

Anseo ní féidir oideas chomh maith a thabhairt do gach cás, i.e. ní mór duit ceisteanna troma a anailísiú.
Ó mo thaithí féin, molaim an t-algartam gníomhartha seo a leanas do chórais OLTP chun airíonna comhthreomhaireachta a bhunú:

  1. díchumasaigh an comhthreomhaireacht ar dtús tríd an gCéim Uasta Comhthreomhaireachta a shocrú go dtí 1
  2. anailís a dhéanamh ar na hiarratais is troime agus roghnaigh an líon snáitheanna is fearr dóibh
  3. socraigh an Chéim Uasta Comhthreomhaireachta go dtí an líon optamach roghnaithe snáitheanna a fuarthas ó chéim 2, agus le haghaidh bunachair shonraí ar leith socraigh an Uasmhéid DOP a fhaightear ó chéim 2 do gach bunachar sonraí
  4. anailís a dhéanamh ar na hiarrataí is troime agus an iarmhairt dhiúltach a bhaineann le il-snáithe a shainaithint. Más amhlaidh atá, méadaigh an Tairseach Costais don Chomhthreomhaireacht.
    I gcás córais ar nós 1C, Microsoft CRM agus Microsoft NAV, i bhformhór na gcásanna, tá toirmeasc ar multithreading oiriúnach

Chomh maith leis sin, má tá eagrán Caighdeánach, ansin i bhformhór na gcásanna tá an toirmeasc ar multithreading oiriúnach mar gheall ar an bhfíric go bhfuil an t-eagrán seo teoranta i líon na cores LAP.
I gcás córais OLAP, níl an algartam a thuairiscítear thuas oiriúnach.
Ó mo thaithí féin, molaim an t-algartam gníomhartha seo a leanas do chórais OLAP chun airíonna comhthreomhaireachta a bhunú:

  1. anailís a dhéanamh ar na hiarratais is troime agus roghnaigh an líon snáitheanna is fearr dóibh
  2. socraigh an Chéim Uasta Comhthreomhaireachta go dtí an líon optamach roghnaithe snáitheanna a fuarthas ó chéim 1, agus le haghaidh bunachair shonraí ar leith socraigh an Uasmhéid DOP a fhaightear ó chéim 1 do gach bunachar sonraí
  3. anailís a dhéanamh ar na ceisteanna is troime agus an tionchar diúltach a theorannú concurrency a aithint. Más ea, ísligh an Tairseach Costais le haghaidh Comhthreomhaireachta, nó déan céimeanna 1-2 den algartam seo arís

Is é sin le rá, do chórais OLTP a théann muid ó aon-snáithe go il-snáithe, agus do OLAP-chórais, ar a mhalairt, a théann muid ó il-snáithe go aon-snáithe. Mar sin, is féidir leat na socruithe comhthreomhaireachta is fearr is féidir a roghnú do bhunachar sonraí ar leith agus do chás iomlán MS SQL Server.
Tá sé tábhachtach freisin a thuiscint gur gá socruithe na n-airíonna comhthreomhara a athrú le himeacht ama, bunaithe ar thorthaí monatóireachta ar fheidhmíocht MS SQL Server.

Treoirlínte chun Bratacha Rian a Shocrú

Ó mo thaithí féin agus ó thaithí mo chomhghleacaithe, ar mhaithe le feidhmíocht optamach, molaim na rianta rian seo a leanas a shocrú ag leibhéal reáchtála na seirbhíse MS SQL Server le haghaidh leaganacha 2008-2016:

  1. 610 - Logánú ionsáite laghdaithe i dtáblaí innéacsaithe. Is féidir leis cabhrú le hionchuir i dtáblaí le go leor taifead agus go leor idirbheart, agus is minic a bhíonn WRITELOG ag fanacht le hathruithe ar innéacsanna
  2. 1117 - Má chomhlíonann comhad i ngrúpa comhad na ceanglais tairsí uathfhás, fásann gach comhad sa ghrúpa comhad
  3. 1118 - Cuireann sé iallach ar gach réad a bheith suite i méideanna éagsúla (toirmeasc ar mhéideanna measctha), rud a íoslaghdaíonn an gá atá le leathanach SGAM a scanadh, a úsáidtear chun méideanna measctha a rianú
  4. 1224 - Díchumasaigh géarú an ghlais bunaithe ar líon na glais. Mar sin féin, féadann úsáid iomarcach cuimhne ardú glais a spreagadh
  5. 2371 - Athraíonn sé an tairseach seasta uathoibríoch nuashonraithe staidrimh go dtí an tairseach dinimiciúil um nuashonrú staidrimh uathoibríoch. Tábhachtach chun pleananna fiosrúcháin a nuashonrú le haghaidh táblaí móra, nuair a bhíonn pleananna feidhmithe earráideacha mar thoradh ar chomhaireamh mícheart taifead
  6. 3226 - Sochtann cúltaca teachtaireachtaí ratha sa loga earráide
  7. 4199 - Áirítear leis seo athruithe ar an leas iomlán a bhaint as fiosrúcháin a scaoiltear in CUanna agus i bPacáistí Seirbhíse Freastalaí SQL
  8. 6532-6534 - Áirítear feabhsuithe feidhmíochta le haghaidh oibríochtaí fiosrúcháin ar chineálacha sonraí spáis
  9. 8048 - Athraíonn sé rudaí cuimhne deighilte NUMA go cinn deighilte LAP
  10. 8780 - Ligeann sé seo leithdháileadh ama breise do phleanáil fiosrúcháin. Seans go ndiúltófar roinnt iarratas gan an bhratach seo toisc nach bhfuil plean fiosrúcháin acu (fabht fíor-annamh)
  11. 8780 - 9389 - Cumasaíonn sé maolán cuimhne deontais dinimiciúil breise le haghaidh ráitis mhodha baisce, a ligeann don oibreoir mód baisc cuimhne bhreise a iarraidh agus sonraí a bhogadh go tempdb a sheachaint má tá cuimhne bhreise ar fáil

Chomh maith leis sin roimh 2016, tá sé úsáideach rian bratach 2301 a chumasú, rud a chumasaíonn leas iomlán a bhaint as tacaíocht cinnidh níos fearr agus dá bhrí sin cabhraíonn sé le pleananna fiosrúcháin níos cearta a roghnú. Ó leagan 2016, áfach, is minic a bhíonn tionchar diúltach aige ar amanna forghníomhaithe fiosrúchán iomlán sách fada.
Chomh maith leis sin, le haghaidh córais le go leor innéacsanna (mar shampla, le haghaidh bunachair shonraí 1C), molaim rian bratach 2330 a chumasú, rud a dhíchumasaíonn bailiú úsáide innéacs, a mbíonn tionchar dearfach aige ar an gcóras go ginearálta.
Chun tuilleadh eolais a fháil faoi bhratacha rian, féach anseo
Ón nasc thuas, tá sé tábhachtach freisin leaganacha agus tógálacha de MS SQL Server a mheas, mar i gcás leaganacha níos nuaí, tá roinnt rianbhrataí cumasaithe de réir réamhshocraithe nó níl aon éifeacht acu.
Is féidir leat an rian-bhratach a chasadh air agus as leis na horduithe DBCC TRACEON agus DBCC TRACEOFF, faoi seach. Le haghaidh tuilleadh sonraí féach anseo
Is féidir leat stádas na bratacha rian a fháil ag baint úsáide as an ordú DBCC TRACESTATUS: níos mó
Ionas gur féidir rian-bratacha a chur san áireamh in uath-thosú na seirbhíse MS SQL Server, ní mór duit dul go Bainisteoir Cumraíochta Freastalaí SQL agus na bratacha rian seo a chur leis via -T sna hairíonna seirbhíse:
Roinnt gnéithe de mhonatóireacht MS SQL Server. Treoirlínte chun Bratacha Rian a Shocrú

Torthaí

San Airteagal seo, rinneadh anailís ar roinnt gnéithe de mhonatóireacht MS SQL Server, le cabhair ar féidir leat a aithint go tapa ar an easpa RAM agus am saor LAP, chomh maith le roinnt fadhbanna eile nach bhfuil chomh soiléir. Rinneadh athbhreithniú ar na rianbhrait is coitianta a úsáidtear.

Foinsí:

» Staitisticí fanacht freastalaí SQL
» Staitisticí fan Freastalaí SQL nó inis dom le do thoil nuair a ghortaíonn sé
» Amharc córais sys.dm_os_schedulers
» Ag baint úsáide as Zabbix chun Monatóireacht a dhéanamh ar Bhunachar Sonraí Freastalaí MS SQL
» Stíl Mhaireachtála SQL
» Rian Bratacha
» sql.ru

Foinse: will.com

Add a comment