Автономное приложение: поддерживайте работоспособность базы данных с течением времени - PullRequest
0 голосов
/ 27 октября 2008

У меня есть приложение WinForms C #, использующее базу данных MS SQL Server Express. Приложение развернуто на ПК наших клиентов, и они не имеют знаний о компьютерах.

Приложение регулярно обновляет базу данных, и я вижу много фрагментов в индексных файлах. Как сохранить работоспособность базы данных с течением времени?

Я думал о программировании хранимой процедуры, которая реорганизует каждый индекс, но мне не хватает навыков t-sql; кто-то может привести меня в правильном направлении?

Bas

Ответы [ 4 ]

1 голос
/ 27 октября 2008

Было бы неплохо написать многоразовую хранимую процедуру, которая может делать все, что я должен делать с базой данных программно, используя лучшие практики обслуживания DBA.

Как обновлять статистику, проверять ошибки страниц, дефрагментировать, переиндексировать, сжимать ?, .....

Как хранимый процесс «Сделай мою БД здоровым»

Кто-нибудь, у кого есть подобный скрипт?

1 голос
/ 27 октября 2008

Используйте параметр DBCC REINDEX, если вы можете позволить себе ненадолго перевести таблицу в автономный режим, или DBCC INDEXDEFRAG. Опция IndexDefrag была удалена, хотя. Вы также можете использовать инструкцию ALTER INDEX в SQL 2005/2008.

0 голосов
/ 11 декабря 2009

Я сейчас использую 2 sql скрипта.

SELECT 
    st.object_id AS objectid,
    st.index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag,
    o.name,
    i.name
FROM 
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') st
join
    sys.objects o on o.object_id = st.object_id
join 
    sys.indexes i on st.object_id = i.object_id and i.index_id=st.index_id

Я запускаю это при запуске моей программы и проверяю, имеет ли avg_fragmentation_in_percent моих главных таблиц больше 70. Если это так, я запускаю следующий скрипт.

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.

if ( object_id( 'tempdb..#work_to_do' ) is not null )
  DROP TABLE #work_to_do;

-- Alleen indexen die meer dan x% gefragemteerd zijn
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 > 5.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;

        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)';
        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;

Этот скрипт дефрагментирует все таблицы с фрагментацией более 5%

0 голосов
/ 27 октября 2008

Также убедитесь, что ФАЙЛ вашей базы данных менее подвержен фрагментации. По общему признанию, это очень сложно сделать, так как вы не знаете, какова структура дисков ваших клиентов, но я рекомендую начинать ваш файл .MDB с достаточно большого начального размера, чтобы предотвратить перестроения онлайн, которые отнимают время и ресурсы, и часто приводят к фрагментации на уровне файлов.

Ваш дизайн индекса также влияет на то, насколько фрагментированы ваши индексы. Вы должны убедиться, что индексы, которые вы вставляете в партию, имеют соответственно низкий FILLFACTOR , чтобы предотвратить разбиение страницы. Также избавьтесь от любых индексов, которые не используются.

Для дефрагментации ваших индексов используйте команду DBCC DBREINDEX .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...