Megjelent az SQL Operations Studio SQL Szerverhez

2017-ben megjelent az SQL Operations Studio Linux, MAC és Windows alá ami folyamatosan fejlődik. Ez a koncepció már nagyon hiányzott és most, hogy az SQL Server multiplatform, ideje volt készíteni egy multiplatform toolt is hozzá. Bár az ötlet jó, de nagy dolgokra még ne számítsunk az eszközzel kapcsolatban, képességei jóval a Management Studio alatt vannak. A célközönség alapvetően a fejlesztők (lesznek) viszont van néhány egyéb terület (pl: BI-Analyst), ahol ez az eszköz jól használható (lenne).

Nekem ezek hiányoznak:

  1. Kapcsolat elnevezése. SSMS-ben ez a registed szerver neve.
  2. Transaction Isolation Level Default beállítása. Kevéssé hozzáértőknek jó, ha ez READ UNCOMMITTED
  3. Kapcsolat és / vagy annak tulajdonságainak utólagos szerkesztése jelenleg csak “kódból” megy.

Ami viszont biztató:

  1. Verzió követés integráció (Git)
  2. Több egyszerű de hasznos dashboard
  3. MS-től megszokott módon egy viszonylag jó dokumentáció

Akinek van kedve egy próbát megér játszadozni vele.

Reklámok

Viszlát SQL Server 2012

Elérkezett az idő, amikor az utolsó SQL Server 2012 verziójú szervereinknek is búcsút intünk. Egyikük 4 éve fut, szolgál ki és termeli a pénzt megállás nélkül. Ennyi idő alatt sikerült jól összebarátkozni vele és megállapítani a tényt, hogy ez a verzió igen stabilra sikeredett és határozottan alkalmas OLTP rendszerek kiszolgálására.

Nézzük meg ezt az időt számokban.

Összesítve 4 év adata:

  • Uptime: 4 év
  • Batch Requests total: 267 milliárd db
  • Index Searches total: 1444 milliárd db
  • Lock Requests total: 4086 milliárd db
  • Logins total: 54 milliárd db
  • Deadlocks total: 192 db
Lekérdezés:

use [master]
go

select
    [counter_name], [cntr_value]
from [sys].[dm_os_performance_counters]
where [counter_name] in ('batch requests/sec', 'Logins/sec', 'Index Searches/sec')
    or ([counter_name] = 'Number of Deadlocks/sec' and [instance_name] = '_Total')
    or ([counter_name] like 'lock_requ%' and [instance_name] = '_Total')
order by 1

Eredmény:

 

Másodpercenkénti átlagok:

  • Batch Requests/sec: 2082
  • Index Searches/sec: 11253
  • Lock Requests/sec : 31836
  • Logins/sec : 425

 

Lekérdezés:


use [master]
go

select
    cast([sqlserver_start_time] as date) as [sqlserver_start_time],
    datediff(year, [sqlserver_start_time], getdate()) as sql_server_uptime_in_year,
    serverproperty('ProductVersion') as product_version,
    serverproperty('Edition') as edition,
    left(@@VERSION, 31) as version_info,
    [c].[cntr_value] / datediff(second, [sqlserver_start_time], getdate()) as avg_batch_request_per_sec,
    [lr].[cntr_value] / datediff(second, [sqlserver_start_time], getdate()) as avg_lock_request_per_sec,
    [ls].[cntr_value] / datediff(second, [sqlserver_start_time], getdate()) as avg_login_per_sec,
    [dl].[cntr_value] as sum_deadlock,
    [iss].[cntr_value] / datediff(second, [sqlserver_start_time], getdate()) as avg_index_search_per_sec
from sys.[dm_os_sys_info] o
cross join sys.[dm_os_performance_counters] c
cross join sys.[dm_os_performance_counters] lr
cross join sys.[dm_os_performance_counters] ls
cross join sys.[dm_os_performance_counters] dl
cross join sys.[dm_os_performance_counters] iss
where c.[counter_name] like 'batch requests/sec%'
    and lr.[counter_name] like 'lock_requ%'
    and lr.[instance_name] = '_Total'
    and [ls].[counter_name] = 'Logins/sec'
    and [dl].[counter_name] = 'Number of Deadlocks/sec'
    and [dl].[instance_name] = '_Total'
    and iss.[counter_name] = 'Index Searches/sec'

Eredmény:

 

A számokból látszik, hogy bár nem lett túlhajtva a szerver, de azért nem is unatkozott.

 

Mennyi lyuk van a tábla id-jában?

Sokan szeretnék, ha egy tábla id-jában nem lennének lyukak. Ezt nem egyszerű megoldani, a legtöbb esetben nem is kell. Viszont ha kíváncsiak vagyunk, hogy mennyi ilyen van, akkor itt egy lekérdezés, amivel ezt megnézhetjük.


;with cte as (
    select
        id,
        id - row_number() over(order by id) as rn
from <table name> 

)

select
    row_number() over(order by (select null)) as group_id,
    min(id) as min_id,
    max(id) as max_id
from cte
group by rn
order by min_id

 

Demozzuk le

1.) Készítsünk egy táblát 100.000 sorral

drop table if exists #tmp 
go

select top 100000
	row_number() over(order by (select null)) as id
into #tmp
from sys.columns c1
cross join sys.columns c2
cross join sys.columns c3
cross join sys.columns c4
cross join sys.columns c5
go

2.) Töröljünk belőle, hogy tudjuk ellenőrizni a script-et

delete from #tmp 
where id between 1000 and 5000 
	or id between 10000 and 15000
	or id between 25000 and 35000
go

3.) Ellenőrizzük le

;with cte as (
	select
		id, 
		id - row_number() over(order by id) as rn
	from #tmp 
	
)


select
	row_number() over(order by (select null)) as group_id,
	min(id) as min_id, 
	max(id) as max_id
from cte 
group by rn
order by min_id

És az eredmény:

group_id             min_id               max_id
-------------------- -------------------- --------------------
1                    1                    999
2                    5001                 9999
3                    15001                24999
4                    35001                100000