Defragmentierter Index

17. Dezember 2010 12:51

Hallo,

beim Import der Datenbank habe ich eine Warung wegen einem Fragmentierten Indexbekommen.

Kann ich das vorher schon irgendwie beheben, damit das nicht beim Import gelöst wird?

Viele Grüße
Pascal

Re: Defragmentierter Index

18. Dezember 2010 11:05

Hallo Pascal,

Indizes auf Datenbanken kannst du mit dem SQL-Server Manager beheben. Dort gibt es Funktionen, um einen Index neu aufzuarbeiten. Dies sollte eigentlich durch den Admin als automatische Aufgabe eingerichtet werden und je nach Datenvolumen und Änderungen auf der Datenbank täglich bis wöchentlich ausgeführt werden. Ich richte eigentlich immer wöchentliche Jobs für diese Aufgabe ein.

Re: Defragmentierter Index

20. Dezember 2010 10:37

Guten Morgen,

ist dafür das hier beschriebene Script für CRM zulässig?

http://msdn.microsoft.com/de-de/library/ms177571.aspx

Viele Grüße
Pascal

Re: Defragmentierter Index

20. Dezember 2010 11:44

Hallo Pascal,

ganz klare Antwort, jein :-)

Es handelt sich um einen Standard SQL-Befehl des SQL Servers, deshalb halte ich ihn für ungefährlich. Aber laut Devinition von Microsoft ist jeder manueller Eingriff in die DB unsupportet, somit auch das Ausführen dieses Befehls.

Ich hätte aber nach einer guten, überprüften Datensicherung kein Problem, diesen Befehl auszuführen.

Re: Defragmentierter Index

20. Dezember 2010 12:39

Ok, verstehe...

wie machst du das?
Du sagtest, du richtest das für 1 mal in er Woche ein... Aber wie? ;-)

VG
Pascal

Re: Defragmentierter Index

20. Dezember 2010 22:31

Hi,

ähm ... ich komme ja eigentlich aus der NAV Ecke, aber aufgrund meiner "Affinität zum SQL Server" möchte ich mich doch kurz einmischen ...

Das verlinket Script von MS (bzw. der Befehl) ist uuuuuralt - der DBCC INDEXDEFRAG (oder der bessere von beiden DBCC DBREINDEX stammen aus Zeiten des SQL Servers 2000 ... das steht auch als Hinweis oben drüber:
Diese Funktion wird in der nächsten Version von Microsoft SQL Server entfernt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird. Verwenden Sie stattdessen ALTER INDEX.


Auch beim ALTER INDEX gibt es zwei Methoden, REBUILD und REORGANIZE. Indexe müssen unbedingt regelmäßig defragmentiert werden, da es sonst zu Perfromance-Verlusten kommen kann (bzw. wird). Das kann im Prinzip auf zwei Arten geschehen:

1) Im SQL "Management Studio" einen "Wartungsplan" einrichten und den "Index Rebuild Task"" verwenden
2) 8-) Einen Job manuell erstellen, der folgendes Script (auch von MS) verwendet:
Code:
-- Ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000);
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function
-- and convert object and index IDs to names.
SELECT
    object_id AS objectid,
    index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;

-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;

-- Open the cursor.
OPEN partitions;

-- Loop through the partitions.
WHILE (1=1)
    BEGIN;
        FETCH NEXT
           FROM partitions
           INTO @objectid, @indexid, @partitionnum, @frag;
        IF @@FETCH_STATUS < 0 BREAK;
        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
        FROM sys.objects AS o
        JOIN sys.schemas as s ON s.schema_id = o.schema_id
        WHERE o.object_id = @objectid;
        SELECT @indexname = QUOTENAME(name)
        FROM sys.indexes
        WHERE  object_id = @objectid AND index_id = @indexid;
        SELECT @partitioncount = count (*)
        FROM sys.partitions
        WHERE object_id = @objectid AND index_id = @indexid;

-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
        IF @frag < 30.0
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
        IF @frag >= 30.0
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
        IF @partitioncount > 1
            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
        EXEC (@command);
        PRINT N'Executed: ' + @command;
    END;

-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- Drop the temporary table.
DROP TABLE #work_to_do;
GO

Siehe dazu http://msdn.microsoft.com/de-de/library/ms188917.aspx Beispiel D.

Egal wie, Hauptsache man defragmentiert; ich empfehle min. wöchentlich.

Wie gesagt, bin kein CRM'ler, aber das fällt IMHO eher in den Bereich allgeminer SQL Administration ...

Schöne Feiertage,
Jörg

Re: Defragmentierter Index

28. Dezember 2010 10:35

Michael Sulz hat geschrieben:Aber laut Devinition von Microsoft ist jeder manueller Eingriff in die DB unsupportet, somit auch das Ausführen dieses Befehls.

Das Anlegen und Aktualisieren von Indizes ist erlaubt. Siehe SDK (online für CRM 4 http://msdn.microsoft.com/en-us/library/bb928224.aspx, die SDK für CRM 2011 gibt es momentan nur als Download)

SDK hat geschrieben:Modifications to the physical schema of the database, other than adding or updating indexes. This includes any actions performed against the database without going through System Customization. Modifying tables, stored procedures, or views in the database is not supported. Adding tables, stored procedures, or views to the database is also not supported because of referential integrity or upgrade issues. Adding indexes is supported per the guidelines in the “Microsoft Dynamics CRM 2011 Implementation Guide”. This applies to all Microsoft Dynamics CRM databases and the Microsoft Dynamics CRM for Microsoft Office Outlook local database.
When you change the database without using the support methods for system customization, you run a good risk of problems occurring during updates and upgrades.