Benutzer:

Passwort:

Claus Rothe

Derzeit im Umbau... Dient vor allem meinem privaten Zweck, wer es trotzdem findet, viel Spaß. ;)


Datenbank Blog

2012-02-14: Zeitdimension

Im BI Bereich braucht man öffters mal eine Zeitdimension. Hier eine simple Tabelle mit berechnetten Spalten für jeden Zweck. Diese muss dann nur noch mit Zeitwerten befüllt werden.

z.B. While Schleife mit inseret into getdate()+@i

select dt,
YEAR(dt) as Jahr,
YEAR(dateadd(month, 6, dt)) as Geschäftsjahr,
'FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as GeschäftsjahrVoll,
DATEPART(Quarter, dt) as Quartal,
DATEPART(Quarter,dateadd(month, 6, dt)) as Geschäftsquartal,
'Q'
	+convert(varchar(4),DATEPART(Quarter,dateadd(month, 6, dt)))
	+' FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as QuartalVoll,
'Q'
	+convert(varchar(4),DATEPART(Quarter,dateadd(month, 6, dt)))
	+' FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as GeschäftsquartalVoll,
	case 
			when DATEPART(Month, dt)>9 
				then convert(varchar(2),DATEPART(Month, dt))
			else '0'+convert(varchar(2),DATEPART(Month, dt))
		end as Monat,
	case 
		when DATEPART(Month, dt)>9 
			then convert(varchar(2),DATEPART(Month, dt))
		else '0'+convert(varchar(2),DATEPART(Month, dt))
	end
	+'.'
	+convert(varchar(4),YEAR(dt) )
	 as MonatVoll,
'M'
	+ case 
			when DATEPART(Month, dt)>9 
				then convert(varchar(2),DATEPART(Month, dt))
			else '0'+convert(varchar(2),DATEPART(Month, dt))
		end
	+' FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as GeschäftsmonatVoll,
case DATEPART(Month, dt) 
	when 1 then 'Januar'
	when 2 then 'Februar'
	when 3 then 'März'
	when 4 then 'April'
	when 5 then 'Mai'
	when 6 then 'Juni'
	when 7 then 'Juli'
	when 8 then 'August'
	when 9 then 'September'
	when 10 then 'Oktober'
	when 11 then 'November'
	when 12 then 'Dezember'
end as MonatText,
case DATEPART(Month, dt) 
	when 1 then 'Januar'
	when 2 then 'Februar'
	when 3 then 'März'
	when 4 then 'April'
	when 5 then 'Mai'
	when 6 then 'Juni'
	when 7 then 'Juli'
	when 8 then 'August'
	when 9 then 'September'
	when 10 then 'Oktober'
	when 11 then 'November'
	when 12 then 'Dezember'
end +
	+' FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as GeschäftsmonatTextVoll,	
CONVERT(varchar(10), dt, 104) as DatumVoll,	
	case 
		when DATEPART(Day, dt)>9 
			then convert(varchar(2), DATEPART(Day, dt))
		else  '0' + convert(varchar(2), DATEPART(Day, dt))
	end 
	+'. ' 
	+ case DATEPART(Month, dt) 
		when 1 then 'Januar'
		when 2 then 'Februar'
		when 3 then 'März'
		when 4 then 'April'
		when 5 then 'Mai'
		when 6 then 'Juni'
		when 7 then 'Juli'
		when 8 then 'August'
		when 9 then 'September'
		when 10 then 'Oktober'
		when 11 then 'November'
		when 12 then 'Dezember'
	end 
	+' '
	+convert(varchar(4),YEAR( dt)) 
	as DatumTextVoll,	
	case 
		when DATEPART(Day, dt)>9 
			then convert(varchar(2), DATEPART(Day, dt))
		else  '0' + convert(varchar(2), DATEPART(Day, dt))
	end 
	+'.' 
	+ case 
			when DATEPART(Month, dt)>9 
				then convert(varchar(2),DATEPART(Month, dt))
			else '0'+convert(varchar(2),DATEPART(Month, dt))
		end
	+'. FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as GeschäftsDatumVoll,	
	case 
		when DATEPART(Day, dt)>9 
			then convert(varchar(2), DATEPART(Day, dt))
		else  '0' + convert(varchar(2), DATEPART(Day, dt))
	end 
	+'. ' 
	+ case DATEPART(Month, dt) 
		when 1 then 'Januar'
		when 2 then 'Februar'
		when 3 then 'März'
		when 4 then 'April'
		when 5 then 'Mai'
		when 6 then 'Juni'
		when 7 then 'Juli'
		when 8 then 'August'
		when 9 then 'September'
		when 10 then 'Oktober'
		when 11 then 'November'
		when 12 then 'Dezember'
	end 
	+' FY '
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))-1) 
	+'/'
	+convert(varchar(4),YEAR(dateadd(month, 6, dt))) as GeschäftsDatumTextVoll,	

DATEPART(WEEKDAY, dt) as TagDerWoche,
case DATEPART(WEEKDAY, dt) 
	when 1 then 'Montag'
	when 2 then 'Dienstag'
	when 3 then 'Mittwoch'
	when 4 then 'Donnerstag'
	when 5 then 'Freitag'
	when 6 then 'Samstag'
	when 7 then 'Sonntag'
end as TagDerWocheText
from kalender

2012-02-14: Replianalyse - Gelösche Datensätze

Wenn man einzelne Datensätze in der Replikation sucht und schaut obdie Replikation abgeschossen ist, ob was schief gegangen ist... Diese Codesnipples helfen vielleicht.

------------------- Gelöschte Datensätze -------------------
select COUNT(*) from dbo.MSmerge_tombstone


------------------- Sessions und History -------------------
select * from MSmerge_sessions
select * from MSmerge_history


-- ------------------- Übertragene Datensätze mit Generations -------------------
select top 1000 * from MSmerge_contents

-- ------------------- Generationstatus -------------------
-- Genstatus > 0 = Abgeschlossene Generation
select * from MSmerge_genhistory


-- ------------------- Tablenick Auflösung -------------------
select name from sysmergearticles where nickname = 146419005
select OBJECT_NAME(objid), * from sysmergearticles where nickname = 146419005

2012-02-14: Replistatus per Script abfragen

exec sp_helpdistpublisher N'DUKE'

use [master]
exec [distribution].sys.sp_replmonitorhelpsubscription @publisher = N'[SERVER]', @publisher_db = N'[DATENBANK]', @publication = N'[Publikation]', @mode = 0, @exclude_anonymous = 0, @refreshpolicy = N'0'

exec [distribution].sys.sp_replmonitorhelpmergesession @agent_name = N'[Agentname]', @hours = -24, @session_type = 1

exec [distribution].sys.sp_replmonitorhelpmergesessiondetail @session_id = [SessionID]

2012-02-14: Indexfragmentierung

Gibt die Indices der aktuellen Datenbank aus, die mehr als 10% Fragmentierung haben.
Indices mit der ID 0 sind die Tabellen selbst (enthalten dann keinen clustered Index)
Indices mit der ID 1 sind clustered Indices

SELECT
    OBJECT_NAME(dm.object_id) AS objectid,
    ind.index_id,
    ind.name,
    partition_number,
    avg_fragmentation_in_percent 
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') dm
inner join sys.indexes Ind 
on dm.object_id = ind.object_id 
and dm.index_id = ind.index_id
WHERE avg_fragmentation_in_percent > 10.0;



Und hier das ganze als automatisches Script zum Rebuild / Reorg

declare @reorg varchar(1000)
declare @rebuild varchar(1000)
declare @count int
declare @frag decimal(16,2)

set @count = 0

declare IndexReorgCur cursor for
SELECT
    'ALTER INDEX [' + ixname.name + '] ON ['+tbschema.name+'].[' + tbname.name + '] REORGANIZE' as reorg,
    'ALTER INDEX [' + ixname.name + '] ON ['+tbschema.name+'].[' + tbname.name + '] REBUILD' as rebuid,
    i.avg_fragmentation_in_percent as frag
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') i
inner join sys.objects tbname
on i.object_id = tbname.object_id
inner join sys.schemas tbschema
on tbname.schema_id = tbschema.schema_id
inner join sys.indexes ixname
on i.index_id = ixname.index_id
and i.object_id = ixname.object_id
WHERE i.avg_fragmentation_in_percent > 10.0 
AND i.index_id > 0
--and (tbname.is_ms_shipped = 1  --Systemtabellen
--	or tbname.name like 'MSMERGE%') --Replitabellen

open IndexReorgCur

FETCH NEXT
   FROM IndexReorgCur
   INTO @reorg, @rebuild, @frag
   
WHILE @@FETCH_STATUS = 0
    BEGIN
		set @count = @count + 1
		
		if @frag < 30
			exec (@reorg)
		else
			exec (@rebuild)
    
		FETCH NEXT
		FROM IndexReorgCur
		INTO @reorg, @rebuild, @frag
    end
    
CLOSE IndexReorgCur
DEALLOCATE IndexReorgCur

2012-02-14: Reportnutzung

Wie oft wurde ein Report benutzt und wann zum letzten mal von wem? Hier ist die Antwort:

use ReportServer

select a.*,els2.UserName from (
	select c.name, c.Path, count(*) as anzahl, max(els.TimeStart) as timestart
	from Catalog c
	left outer join ExecutionLogStorage els
	on els.ReportID = c.ItemID
	where c.Type = 2
	group by c.name, c.Path
	) as a
inner join ExecutionLogStorage els2
on a.timestart = els2.TimeStart

order by 3 , 2 


Seite zurück [1] [2] [3] [4] [5] [6] Seite weiter

Impressum

Claus Rothe

Mobil: +49 176 81188859

E-Mail: post@...