Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 перестроить и реорганизовать все индексы  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 692
Всем привет!

Ребят переношу БД из одного хостинга на другой, и при переносе теряются все индексы (БД при запросах дико долго выдает ответ)

решилось перестройкой и реорганизацией всех индексов через интерфейс - http://take.ms/jxkCm

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

(сайт asp mvc, из субд mssql 2008 в 2008 express)
9 сен 14, 15:27    [16554889]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
msLex
Member

Откуда:
Сообщений: 9308
Sputnick
при переносе теряются все индексы

Sputnick
запустить перестройку и реорганизацию всех индексов

что вы собрались перестраивать, если индексы не перенеслись?
9 сен 14, 15:34    [16554940]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 692
[quot msLex]
Sputnick
если индексы не перенеслись?


они перенеслись, НО криво. В менеджмент студии через GUI интерфейс я на каждом индексе делаю ПКМ на индексе - задачи - перестраить; задачи - реорганизовать и так на каждом индексе (40 раз) и все летает....

хочу сделать это же, но не через GUI f командой

ну может есть другой метод.
9 сен 14, 15:38    [16554974]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Sputnick, а статистику обновили? может вам и не надо ничего перестраивать
9 сен 14, 15:39    [16554998]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sputnick
ну может есть другой метод.

Сделать MaintenancePlan
9 сен 14, 15:39    [16555000]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
aleks2
Guest
msLex
Sputnick
при переносе теряются все индексы

Sputnick
запустить перестройку и реорганизацию всех индексов

что вы собрались перестраивать, если индексы не перенеслись?

Не придирайся.

На, страдалец. Microsoft заботиться о слепых

/******************************************************************************
This sample T-SQL script performs basic maintenance tasks on SUSDB
1. Identifies indexes that are fragmented and defragments them. For certain
   tables, a fill-factor is set in order to improve insert performance.
   Based on MSDN sample at http://msdn2.microsoft.com/en-us/library/ms188917.aspx
   and tailored for SUSDB requirements
2. Updates potentially out-of-date table statistics.
******************************************************************************/

USE SUSDB;
GO
SET NOCOUNT ON;

-- Rebuild or reorganize indexes based on their fragmentation levels
DECLARE @work_to_do TABLE (
    objectid int
    , indexid int
    , pagedensity float
    , fragmentation float
    , numrows int
)

DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @schemaname nvarchar(130); 
DECLARE @objectname nvarchar(130); 
DECLARE @indexname nvarchar(130); 
DECLARE @numrows int
DECLARE @density float;
DECLARE @fragmentation float;
DECLARE @command nvarchar(4000); 
DECLARE @fillfactorset bit
DECLARE @numpages int

-- Select indexes that need to be defragmented based on the following
-- * Page density is low
-- * External fragmentation is high in relation to index size
PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121) 
INSERT @work_to_do
SELECT
    f.object_id
    , index_id
    , avg_page_space_used_in_percent
    , avg_fragmentation_in_percent
    , record_count
FROM 
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f
WHERE
    (f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count - 1)
    or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0)
    or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0)

PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20))

PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121)

SELECT @numpages = sum(ps.used_page_count)
FROM
    @work_to_do AS fi
    INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id
    INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id

-- Declare the cursor for the list of indexes to be processed.
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do

-- Open the cursor.
OPEN curIndexes

-- Loop through the indexes
WHILE (1=1)
BEGIN
    FETCH NEXT FROM curIndexes
    INTO @objectid, @indexid, @density, @fragmentation, @numrows;
    IF @@FETCH_STATUS < 0 BREAK;

    SELECT 
        @objectname = QUOTENAME(o.name)
        , @schemaname = QUOTENAME(s.name)
    FROM 
        sys.objects AS o
        INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id
    WHERE 
        o.object_id = @objectid;

    SELECT 
        @indexname = QUOTENAME(name)
        , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END
    FROM 
        sys.indexes
    WHERE
        object_id = @objectid AND index_id = @indexid;

    IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0)
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
    ELSE IF @numrows >= 5000 AND @fillfactorset = 0
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)';
    ELSE
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
    PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command;
    EXEC (@command);
    PRINT convert(nvarchar, getdate(), 121) + N' Done.';
END

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


IF EXISTS (SELECT * FROM @work_to_do)
BEGIN
    PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20))
    SELECT @numpages = @numpages - sum(ps.used_page_count)
    FROM
        @work_to_do AS fi
        INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id
        INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id

    PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20))
END
GO


--Update all statistics
PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121) 
EXEC sp_updatestats
PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121) 
GO
9 сен 14, 15:45    [16555041]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 692
это обычный хостинг, к обслуживанию нет доступа.

спасибо гость за скрипт.
9 сен 14, 15:48    [16555072]     Ответить | Цитировать Сообщить модератору
 Re: перестроить и реорганизовать все индексы  [new]
Sputnick
Member

Откуда: http://city-afisha.com
Сообщений: 692
еще вот такое есть:

DECLARE @table_name varchar(50)
DECLARE db_reindex_all CURSOR FOR
	select [name] 
	from dbo.sysobjects 
	where [name] like 'b_%' and [name] not like 'b_bd_%' and xtype='U'
OPEN db_reindex_all
FETCH NEXT FROM db_reindex_all INTO @table_name
WHILE @@FETCH_STATUS=0
BEGIN
	DBCC DBREINDEX (@table_name)
FETCH NEXT FROM db_reindex_all INTO @table_name
END
CLOSE db_reindex_all
DEALLOCATE db_reindex_all

EXEC sp_updatestats 
9 сен 14, 17:53    [16555976]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить