Löschen eines Indexes in einer MSSQL Datenabnk ist nicht mehr möglich
Hallo Zusammen,
ich betreue seit neuestem einen MSSQL 2012 Server. Nach eingehender Prüfung des Servers habe ich festegellt das hier die INdexe nie gepflegt wurden. Ich habe mir ein Script gebaut welches alle Indexe mit einer Fragmentierung zwischen 5 und 20% Neu Reorganisiert und alle die über 20 % liegen neu baut. ( Fragmentierungsgrad lag teilweise bei 99,8% und mehr )
Es bleibt aber nun ein Bodensatz über. Diesen kann ich teilweise nicht mal mehr löschen ( drop Index ) und wenn ich den gelöscht bekomme und neu anlege ist er direkt wieder massiv fragmentiert.
Ich habe einmal über das Studio gearbeitet und mit folgenden Scripten
Eine echte Replikation gibt es noch nciht. Aktuell habe ich nur noch die Idee eine Datenreplikation aufzubauen und die Indexe dann auf der Abonnentenseite neu anzulegen. Hat einer von euhc noch eine Idee?
Danke und Gruss
Sven
ich betreue seit neuestem einen MSSQL 2012 Server. Nach eingehender Prüfung des Servers habe ich festegellt das hier die INdexe nie gepflegt wurden. Ich habe mir ein Script gebaut welches alle Indexe mit einer Fragmentierung zwischen 5 und 20% Neu Reorganisiert und alle die über 20 % liegen neu baut. ( Fragmentierungsgrad lag teilweise bei 99,8% und mehr )
Es bleibt aber nun ein Bodensatz über. Diesen kann ich teilweise nicht mal mehr löschen ( drop Index ) und wenn ich den gelöscht bekomme und neu anlege ist er direkt wieder massiv fragmentiert.
Ich habe einmal über das Studio gearbeitet und mit folgenden Scripten
USE xxx;
GO
EXEC sp_updatestats;
GO
DECLARE @DBID int
SELECT @DBID = DB_ID()
DBCC FLUSHPROCINDB (@DBID)
USE xxx;
GO
truncate table DBADMIN.DBO.indexreorg;
truncate table DBADMIN.DBO.index_reorg_cmd;
insert into DBADMIN.DBO.indexreorg select
OBJECT_NAME(ps.object_id) AS Tab,
i.name AS Idx,
ps.avg_fragmentation_in_percent AS Required
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'limited') AS ps
INNER JOIN sys.indexes AS i ON i.index_id = ps.index_id AND i.object_id = ps.object_id
WHERE (OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1);
insert into DBADMIN.DBO.index_reorg_cmd SELECT 'alter index ' + QUOTENAME(Idx) + ' on ' + 'xxx.DBO.' + QUOTENAME(Tab) + ' ' + ' REORGANIZE ' as befehl
FROM DBADMIN.DBO.IndexReorg
WHERE Required > 5 and Required < 31 AND (Tab LIKE 'T_%');
insert into DBADMIN.DBO.index_reorg_cmd
select 'alter index ' + QUOTENAME(Idx) + ' on ' + 'xxx.DBO.' + QUOTENAME(Tab) + ' ' + ' REBUILD '
from DBADMIN.DBO.IndexReorg where Required > 30 AND (Tab LIKE 'T_%');
DECLARE @cmd nvarchar(max);
DECLARE index_remake CURSOR FOR
select * from DBADMIN.DBO.index_reorg_cmd
OPEN index_remake
fetch next from index_remake into @cmd;
while @@FETCH_STATUS = 0
begin
print @cmd;
exec(@cmd);
SET @cmd = '';
fetch next from index_remake into @cmd;
end
close index_remake;
deallocate index_remake;
Eine echte Replikation gibt es noch nciht. Aktuell habe ich nur noch die Idee eine Datenreplikation aufzubauen und die Indexe dann auf der Abonnentenseite neu anzulegen. Hat einer von euhc noch eine Idee?
Danke und Gruss
Sven
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 347718
Url: https://administrator.de/contentid/347718
Ausgedruckt am: 16.11.2024 um 23:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Sven,
das wird Dir auch nichts nützen. Die Lösung bzw. die Information, daß es nicht geht, findest Du in der SQL Server Hilfe bei "ALTER INDEX":
Hinweis:
Das erneute Erstellen oder Reorganisieren von kleinen Indizes verringert oft nicht die Fragmentierung. Die Seiten kleiner Indizes werden in gemischten Blöcken gespeichert. Gemischte Blöcke sind für bis zu acht Objekte freigegeben, sodass die Fragmentierung in einem kleinen Index durch die Reorganisation oder das erneute Erstellen des Index möglicherweise nicht verringert wird. Weitere Informationen zu gemischten Blöcken finden Sie unter Grundlegendes zu Seiten und Blöcken.
Gruß, Mad Max
das wird Dir auch nichts nützen. Die Lösung bzw. die Information, daß es nicht geht, findest Du in der SQL Server Hilfe bei "ALTER INDEX":
Hinweis:
Das erneute Erstellen oder Reorganisieren von kleinen Indizes verringert oft nicht die Fragmentierung. Die Seiten kleiner Indizes werden in gemischten Blöcken gespeichert. Gemischte Blöcke sind für bis zu acht Objekte freigegeben, sodass die Fragmentierung in einem kleinen Index durch die Reorganisation oder das erneute Erstellen des Index möglicherweise nicht verringert wird. Weitere Informationen zu gemischten Blöcken finden Sie unter Grundlegendes zu Seiten und Blöcken.
Gruß, Mad Max
Diesen kann ich teilweise nicht mal mehr löschen ( drop Index )
Was kommt den als Fehler?Ein weiterer Punkt ist die Große der Indizes, sind die Indizes eventuell sehr sehr klein, bei denen sich der Fragmentierungsgrad nicht senken lässt?
Das scheint normal zu sein beim SQL Server: https://dba.stackexchange.com/questions/18372/why-index-rebuild-does-not ...
Zur Index Maintenance kann ich Ola Hallgrens SQL Maintenance Solution empfehlen: https://ola.hallengren.com/
Das sind (kostenlose) SQL Skripte zum Einplanen von Backups, Index/Statistik Updates etc.
Edit: Ich brauche einfach zu lange zum Tippen.
Hallo Sven,
daß sich ein Index nicht löschen läßt, kann daran liegen, daß er noch für einen Fremdschlüssel benötigt wird. Ansonsten gibt es natürlich eine Fehlermeldung, die näheres dazu sagen könnte.
Das mit der Fragmentierung bei größeren Indices macht mich jetzt neugierig, das prüfe ich mal bei uns.
Gruß, Mad Max
daß sich ein Index nicht löschen läßt, kann daran liegen, daß er noch für einen Fremdschlüssel benötigt wird. Ansonsten gibt es natürlich eine Fehlermeldung, die näheres dazu sagen könnte.
Das mit der Fragmentierung bei größeren Indices macht mich jetzt neugierig, das prüfe ich mal bei uns.
Gruß, Mad Max