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
Reklámok

SQL SERVER 2016 Bulk insert optimalizáció – megoldás

Az előző postban írtam a bulk insert működésének módosulárásól és arról, hogy nincs megoldás. Most helyesbítenék, van megoldás, több is. A hivatalos, már régóta, csak nekem és még néhány embernek nem sikerül belefutni és a workaround.

A postban maradjunk a hivatalos megoldásnál, ennek a neve: Trace Flag 692. Hogy pontosan mi is ez, azt a hivatalos doksi elmondja itt, a lényege, hogy kikapcsolható az újfajta működés. Ha szükséges kikapcsolni, célszerű az SQL Server startup paraméteri közé betenni, de azonnal életbe lép globálisan, ha kiadjuk a dbcc traceon (692,-1) parancsot.

Leelenőrizni a dbcc tracestatus paranccsal tudjuk, hogy milyen trace flag-ek vannak éppen bekapcsolva.

 

Akit érdekel itt még talál infót az SQL Server 2016 Bullk load-ról.

SQL SERVER 2016 Bulk insert optimalizáció

Az SQL Server 2016-ban a bulk insert gyorsabb lett. Persze nem ingyen.
A gyorsulást úgy érik el, hogy 1-1 bulk insert-et érintő page-en több szabad helyet hagy az SQL szerver, mint eddig, arra számítva hogy még érkezik oda sor.
Nagy mennyiségű adat betöltésénél ez jól jön, de kis mennyiségnél azt látni, hogy jelentősen megnő a db mérete, mert sok üres hely marad a page-eken.

Ráadásul ez a működés nem befolyásolható, nincs visszafele kompatibilitás, stb.
Útálom az ilyen visszafele nincs kompatiblitás változtatásokat, ráadásul megint beigazolódott, a kevesebb feature kevesebb gond elmélet.