Skip to content

Commit b3b5d4e

Browse files
committed
Updates
1 parent 77ef024 commit b3b5d4e

73 files changed

Lines changed: 12168 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎MySQL/README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# MySQL
2+
3+
Dieser Root-Ordner ist fuer MySQL-spezifische Trainingsunterlagen und Crosslinks reserviert.
4+
5+
## Verwandte Langform-Artikel
6+
7+
- [Blog - Update with Join: Warum Kardinalitaet wichtiger ist als Syntax](../blog/update-with-join/README.md)
8+
- [Blog - Index Disable + Rebuild vs. Drop + Create: Wann welche Strategie sinnvoll ist](../blog/index_disable_rebuild_drop_create/README.md)
9+
- [Blog - Partitionierung: Wann mehrere Partitionen wirklich helfen - und wann nicht](../blog/partitionierung/README.md)
10+
- [Blog - Horizontale Partitionierung: eine partitionierte Tabelle oder mehrere Tabellen?](../blog/horizontale_partitionierung/README.md)

‎Oracle/README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Oracle
2+
3+
Dieser Root-Ordner ist fuer Oracle-spezifische Trainingsunterlagen und Crosslinks reserviert.
4+
5+
## Verwandte Langform-Artikel
6+
7+
- [Blog - Update with Join: Warum Kardinalitaet wichtiger ist als Syntax](../blog/update-with-join/README.md)
8+
- [Blog - Index Disable + Rebuild vs. Drop + Create: Wann welche Strategie sinnvoll ist](../blog/index_disable_rebuild_drop_create/README.md)
9+
- [Blog - Partitionierung: Wann mehrere Partitionen wirklich helfen - und wann nicht](../blog/partitionierung/README.md)
10+
- [Blog - Horizontale Partitionierung: eine partitionierte Tabelle oder mehrere Tabellen?](../blog/horizontale_partitionierung/README.md)

‎PostgreSQL/README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# PostgreSQL
2+
3+
Dieser Root-Ordner ist fuer PostgreSQL-spezifische Trainingsunterlagen und Crosslinks reserviert.
4+
5+
## Verwandte Langform-Artikel
6+
7+
- [Blog - Update with Join: Warum Kardinalitaet wichtiger ist als Syntax](../blog/update-with-join/README.md)
8+
- [Blog - Index Disable + Rebuild vs. Drop + Create: Wann welche Strategie sinnvoll ist](../blog/index_disable_rebuild_drop_create/README.md)
9+
- [Blog - Partitionierung: Wann mehrere Partitionen wirklich helfen - und wann nicht](../blog/partitionierung/README.md)
10+
- [Blog - Horizontale Partitionierung: eine partitionierte Tabelle oder mehrere Tabellen?](../blog/horizontale_partitionierung/README.md)

‎SQLHana/README.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# SQLHana
2+
3+
Dieser Root-Ordner ist fuer SQL-HANA-spezifische Trainingsunterlagen und Crosslinks reserviert.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
IF OBJECT_ID('tempdb..#LogSpace') IS NOT NULL
2+
DROP TABLE #LogSpace;
3+
4+
CREATE TABLE #LogSpace
5+
(
6+
[Database Name] SYSNAME,
7+
[Log Size (MB)] DECIMAL(18,2),
8+
[Log Space Used (%)] DECIMAL(18,2),
9+
[Status] INT
10+
);
11+
12+
INSERT INTO #LogSpace
13+
EXEC ('DBCC SQLPERF(LOGSPACE)');
14+
15+
SELECT
16+
ls.[Database Name] AS DatabaseName,
17+
d.recovery_model_desc AS RecoveryModel,
18+
CAST(ls.[Log Size (MB)] AS DECIMAL(18,2)) AS LogSizeMB,
19+
CAST(ls.[Log Space Used (%)] AS DECIMAL(18,2)) AS LogUsedPct,
20+
d.log_reuse_wait_desc
21+
FROM #LogSpace AS ls
22+
INNER JOIN sys.databases AS d
23+
ON d.name = ls.[Database Name]
24+
WHERE ls.[Log Space Used (%)] >= 85
25+
ORDER BY ls.[Log Space Used (%)] DESC;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
IF OBJECT_ID('tempdb..#LogSpace') IS NOT NULL
2+
DROP TABLE #LogSpace;
3+
4+
CREATE TABLE #LogSpace
5+
(
6+
[Database Name] SYSNAME,
7+
[Log Size (MB)] DECIMAL(18,2),
8+
[Log Space Used (%)] DECIMAL(18,2),
9+
[Status] INT
10+
);
11+
12+
INSERT INTO #LogSpace
13+
EXEC ('DBCC SQLPERF(LOGSPACE)');
14+
15+
SELECT
16+
ls.[Database Name] AS DatabaseName,
17+
d.state_desc AS DatabaseState,
18+
d.recovery_model_desc AS RecoveryModel,
19+
CAST(ls.[Log Size (MB)] AS DECIMAL(18,2)) AS LogSizeMB,
20+
CAST(ls.[Log Space Used (%)] AS DECIMAL(18,2)) AS LogUsedPct,
21+
CAST(ls.[Log Size (MB)] * ls.[Log Space Used (%)] / 100.0 AS DECIMAL(18,2)) AS LogUsedMB,
22+
CAST(ls.[Log Size (MB)] * (100.0 - ls.[Log Space Used (%)]) / 100.0 AS DECIMAL(18,2)) AS LogFreeMB,
23+
d.log_reuse_wait_desc,
24+
CASE
25+
WHEN ls.[Log Space Used (%)] >= 95 THEN 'KRITISCH'
26+
WHEN ls.[Log Space Used (%)] >= 85 THEN 'HOCH'
27+
WHEN ls.[Log Space Used (%)] >= 70 THEN 'BEOBACHTEN'
28+
ELSE 'OK'
29+
END AS LogStatus
30+
FROM #LogSpace AS ls
31+
LEFT JOIN sys.databases AS d
32+
ON d.name = ls.[Database Name]
33+
ORDER BY
34+
ls.[Log Space Used (%)] DESC,
35+
ls.[Log Size (MB)] DESC;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
DECLARE @DBName SYSNAME = N'BI_DWH';
2+
3+
SELECT
4+
d.name AS DatabaseName,
5+
d.state_desc,
6+
d.recovery_model_desc,
7+
ls.total_log_size_mb,
8+
ls.active_log_size_mb,
9+
CAST(
10+
CASE
11+
WHEN ls.total_log_size_mb > 0
12+
THEN (ls.active_log_size_mb * 100.0) / ls.total_log_size_mb
13+
ELSE 0
14+
END
15+
AS DECIMAL(10,2)
16+
) AS LogUsedPct,
17+
d.log_reuse_wait_desc,
18+
ls.log_truncation_holdup_reason,
19+
ls.log_since_last_log_backup_mb,
20+
ls.log_backup_time
21+
FROM sys.databases AS d
22+
CROSS APPLY sys.dm_db_log_stats(d.database_id) AS ls
23+
WHERE d.name = @DBName;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
SELECT
2+
d.name AS DatabaseName,
3+
d.state_desc,
4+
d.recovery_model_desc,
5+
ls.total_log_size_mb,
6+
ls.active_log_size_mb,
7+
CAST(
8+
CASE
9+
WHEN ls.total_log_size_mb > 0
10+
THEN (ls.active_log_size_mb * 100.0) / ls.total_log_size_mb
11+
ELSE 0
12+
END
13+
AS DECIMAL(10,2)
14+
) AS LogUsedPct,
15+
d.log_reuse_wait_desc,
16+
ls.log_truncation_holdup_reason,
17+
ls.log_since_last_log_backup_mb,
18+
ls.log_backup_time,
19+
CASE d.log_reuse_wait_desc
20+
WHEN 'NOTHING' THEN 'Der Log kann wiederverwendet werden; akuter Reuse-Blocker ist nicht sichtbar.'
21+
WHEN 'CHECKPOINT' THEN 'Bei SIMPLE wird Log-Space typischerweise erst nach Checkpoint wiederverwendbar.'
22+
WHEN 'ACTIVE_TRANSACTION' THEN 'Eine lange/offene Transaktion verhindert die Log-Wiederverwendung.'
23+
WHEN 'ACTIVE_BACKUP_OR_RESTORE' THEN 'Backup- oder Restore-Vorgang blockiert aktuell die Wiederverwendung.'
24+
WHEN 'REPLICATION' THEN 'Replikation/Verteilung hält Log-Einträge noch fest.'
25+
WHEN 'DATABASE_MIRRORING' THEN 'Spiegelung/entsprechende Synchronisation blockiert die Wiederverwendung.'
26+
WHEN 'AVAILABILITY_REPLICA' THEN 'Eine Availability Replica hält die Wiederverwendung zurück.'
27+
WHEN 'XTP_CHECKPOINT' THEN 'In-Memory-OLTP-Checkpoint hält die Wiederverwendung zurück.'
28+
ELSE 'Details über log_reuse_wait_desc bzw. log_truncation_holdup_reason prüfen.'
29+
END AS Interpretation
30+
FROM sys.databases AS d
31+
CROSS APPLY sys.dm_db_log_stats(d.database_id) AS ls
32+
WHERE d.recovery_model_desc = 'SIMPLE'
33+
ORDER BY
34+
LogUsedPct DESC,
35+
ls.active_log_size_mb DESC;

‎T-SQL/19_Transaktions/SQLScripts/ReuseWait_REPLICATION.sql‎

Whitespace-only changes.
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
SET NOCOUNT ON;
2+
3+
DECLARE @DBName SYSNAME = N'DeineDatenbank';
4+
DECLARE @ReserveAfterShrinkMB INT = 512; -- freier Puffer nach dem Shrink
5+
DECLARE @MinimumTargetSizeMB INT = 256; -- Logdatei nie kleiner als dieser Wert
6+
DECLARE @MinShrinkGainMB INT = 256; -- nur shrinken, wenn mindestens so viele MB frei werden
7+
8+
DECLARE @RecoveryModelBefore NVARCHAR(60);
9+
DECLARE @RecoveryModelAfter NVARCHAR(60);
10+
DECLARE @LogReuseWaitDesc NVARCHAR(120);
11+
12+
DECLARE @LogSizeMB DECIMAL(18,2);
13+
DECLARE @LogUsedPct DECIMAL(18,2);
14+
DECLARE @LogUsedMB DECIMAL(18,2);
15+
DECLARE @LogFreeMB DECIMAL(18,2);
16+
17+
DECLARE @LogFileCount INT;
18+
DECLARE @LogFileId INT;
19+
20+
DECLARE @ShrinkTargetMB INT;
21+
DECLARE @ShrinkGainMB DECIMAL(18,2);
22+
23+
DECLARE @sql NVARCHAR(MAX);
24+
DECLARE @Action NVARCHAR(4000) = N'';
25+
DECLARE @DidShrink BIT = 0;
26+
27+
IF DB_ID(@DBName) IS NULL
28+
BEGIN
29+
THROW 50000, 'Die angegebene Datenbank existiert nicht.', 1;
30+
END;
31+
32+
IF OBJECT_ID('tempdb..#LogSpace') IS NOT NULL
33+
DROP TABLE #LogSpace;
34+
35+
CREATE TABLE #LogSpace
36+
(
37+
[Database Name] SYSNAME,
38+
[Log Size (MB)] DECIMAL(18,2),
39+
[Log Space Used (%)] DECIMAL(18,2),
40+
[Status] INT
41+
);
42+
43+
INSERT INTO #LogSpace
44+
EXEC ('DBCC SQLPERF(LOGSPACE)');
45+
46+
SELECT
47+
@RecoveryModelBefore = d.recovery_model_desc,
48+
@LogReuseWaitDesc = d.log_reuse_wait_desc,
49+
@LogSizeMB = ls.[Log Size (MB)],
50+
@LogUsedPct = ls.[Log Space Used (%)],
51+
@LogUsedMB = CAST(ls.[Log Size (MB)] * ls.[Log Space Used (%)] / 100.0 AS DECIMAL(18,2)),
52+
@LogFreeMB = CAST(ls.[Log Size (MB)] * (100.0 - ls.[Log Space Used (%)]) / 100.0 AS DECIMAL(18,2))
53+
FROM sys.databases AS d
54+
INNER JOIN #LogSpace AS ls
55+
ON ls.[Database Name] = d.name
56+
WHERE d.name = @DBName;
57+
58+
SELECT
59+
@LogFileCount = COUNT(*),
60+
@LogFileId = CASE WHEN COUNT(*) = 1 THEN MAX(file_id) END
61+
FROM sys.master_files
62+
WHERE database_id = DB_ID(@DBName)
63+
AND type = 1; -- LOG
64+
65+
SELECT
66+
[Step] = 'Before',
67+
DatabaseName = @DBName,
68+
RecoveryModel = @RecoveryModelBefore,
69+
LogReuseWaitDesc = @LogReuseWaitDesc,
70+
LogFileCount = @LogFileCount,
71+
LogSizeMB = @LogSizeMB,
72+
LogUsedPct = @LogUsedPct,
73+
LogUsedMB = @LogUsedMB,
74+
LogFreeMB = @LogFreeMB;
75+
76+
IF @RecoveryModelBefore <> N'SIMPLE'
77+
BEGIN
78+
SET @sql = N'ALTER DATABASE ' + QUOTENAME(@DBName) + N' SET RECOVERY SIMPLE;';
79+
EXEC sys.sp_executesql @sql;
80+
SET @Action = N'Recovery Model wurde auf SIMPLE gesetzt. ';
81+
END
82+
ELSE
83+
BEGIN
84+
SET @Action = N'Datenbank war bereits SIMPLE. ';
85+
END;
86+
87+
SET @sql = N'USE ' + QUOTENAME(@DBName) + N'; CHECKPOINT;';
88+
EXEC sys.sp_executesql @sql;
89+
90+
TRUNCATE TABLE #LogSpace;
91+
92+
INSERT INTO #LogSpace
93+
EXEC ('DBCC SQLPERF(LOGSPACE)');
94+
95+
SELECT
96+
@RecoveryModelAfter = d.recovery_model_desc,
97+
@LogReuseWaitDesc = d.log_reuse_wait_desc,
98+
@LogSizeMB = ls.[Log Size (MB)],
99+
@LogUsedPct = ls.[Log Space Used (%)],
100+
@LogUsedMB = CAST(ls.[Log Size (MB)] * ls.[Log Space Used (%)] / 100.0 AS DECIMAL(18,2)),
101+
@LogFreeMB = CAST(ls.[Log Size (MB)] * (100.0 - ls.[Log Space Used (%)]) / 100.0 AS DECIMAL(18,2))
102+
FROM sys.databases AS d
103+
INNER JOIN #LogSpace AS ls
104+
ON ls.[Database Name] = d.name
105+
WHERE d.name = @DBName;
106+
107+
SET @ShrinkTargetMB =
108+
CASE
109+
WHEN CEILING(@LogUsedMB + @ReserveAfterShrinkMB) > @MinimumTargetSizeMB
110+
THEN CAST(CEILING(@LogUsedMB + @ReserveAfterShrinkMB) AS INT)
111+
ELSE @MinimumTargetSizeMB
112+
END;
113+
114+
SET @ShrinkGainMB = CAST(@LogSizeMB - @ShrinkTargetMB AS DECIMAL(18,2));
115+
116+
SELECT
117+
[Step] = 'After Recovery Change / Checkpoint',
118+
DatabaseName = @DBName,
119+
RecoveryModel = @RecoveryModelAfter,
120+
LogReuseWaitDesc = @LogReuseWaitDesc,
121+
LogFileCount = @LogFileCount,
122+
LogSizeMB = @LogSizeMB,
123+
LogUsedPct = @LogUsedPct,
124+
LogUsedMB = @LogUsedMB,
125+
LogFreeMB = @LogFreeMB,
126+
ShrinkTargetMB = @ShrinkTargetMB,
127+
ShrinkGainMB = @ShrinkGainMB;
128+
129+
IF @LogFileCount <> 1
130+
BEGIN
131+
SET @Action = @Action + N'Kein Shrink durchgeführt, da die Datenbank nicht genau eine Logdatei hat.';
132+
END
133+
ELSE IF @ShrinkGainMB < @MinShrinkGainMB
134+
BEGIN
135+
SET @Action = @Action + N'Kein Shrink durchgeführt, da das Shrink-Potenzial kleiner als der Schwellwert ist.';
136+
END
137+
ELSE IF @ShrinkTargetMB >= CEILING(@LogSizeMB)
138+
BEGIN
139+
SET @Action = @Action + N'Kein Shrink durchgeführt, da die Zielgröße nicht kleiner als die aktuelle Größe ist.';
140+
END
141+
ELSE
142+
BEGIN
143+
SET @sql =
144+
N'USE ' + QUOTENAME(@DBName) + N';
145+
DBCC SHRINKFILE (' + CAST(@LogFileId AS NVARCHAR(20)) + N', ' + CAST(@ShrinkTargetMB AS NVARCHAR(20)) + N');';
146+
147+
EXEC sys.sp_executesql @sql;
148+
149+
SET @DidShrink = 1;
150+
SET @Action = @Action + N'Logdatei wurde geschrumpft.';
151+
END;
152+
153+
TRUNCATE TABLE #LogSpace;
154+
155+
INSERT INTO #LogSpace
156+
EXEC ('DBCC SQLPERF(LOGSPACE)');
157+
158+
SELECT
159+
@LogReuseWaitDesc = d.log_reuse_wait_desc,
160+
@LogSizeMB = ls.[Log Size (MB)],
161+
@LogUsedPct = ls.[Log Space Used (%)],
162+
@LogUsedMB = CAST(ls.[Log Size (MB)] * ls.[Log Space Used (%)] / 100.0 AS DECIMAL(18,2)),
163+
@LogFreeMB = CAST(ls.[Log Size (MB)] * (100.0 - ls.[Log Space Used (%)]) / 100.0 AS DECIMAL(18,2))
164+
FROM sys.databases AS d
165+
INNER JOIN #LogSpace AS ls
166+
ON ls.[Database Name] = d.name
167+
WHERE d.name = @DBName;
168+
169+
SELECT
170+
[Step] = 'Final',
171+
DatabaseName = @DBName,
172+
RecoveryModel = @RecoveryModelAfter,
173+
LogReuseWaitDesc = @LogReuseWaitDesc,
174+
LogFileCount = @LogFileCount,
175+
LogSizeMB = @LogSizeMB,
176+
LogUsedPct = @LogUsedPct,
177+
LogUsedMB = @LogUsedMB,
178+
LogFreeMB = @LogFreeMB,
179+
ShrinkTargetMB = @ShrinkTargetMB,
180+
ShrinkPerformed = @DidShrink,
181+
ActionSummary = @Action;

0 commit comments

Comments
 (0)