Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь по SQL скрипту / 18 сообщений из 18, страница 1 из 1
17.12.2020, 14:39
    #40028730
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
Всем привет.
У меня имеется скрипт который по идеи должен делать оптимизацию базы данных но меня что то смущает в нем... Опыта у меня мало а экспериментировать - чревато последствиями... Прошу вашей помощи растолковать что это за "фрукт"
Спасибо.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SET NOCOUNT ON;
DECLARE @DB_name VARCHAR(250);  
DECLARE @DB_id SMALLINT;
DECLARE @cmd VARCHAR(1000);  

DECLARE DatabaseCursor CURSOR READ_ONLY FOR  
	SELECT [name],[database_id] FROM master.sys.databases WHERE database_id NOT IN (1,3,4,5,6,122,124)
	AND state = 0 AND is_in_standby = 0 ORDER BY 1  

OPEN DatabaseCursor  

	FETCH NEXT FROM DatabaseCursor INTO @DB_name, @DB_id
	WHILE @@FETCH_STATUS = 0  
	BEGIN  
	SET @cmd = 'EXEC [BASE].[dbo].[ReIndex] @DbId = ' + CAST(@DB_id as varchar(10)) + ';';
	PRINT('[' + @DB_name + '] ' + @cmd);
	BEGIN TRY
		EXEC (@cmd);  
	END TRY
	BEGIN CATCH
		SELECT @DB_name, @DB_id, ERROR_MESSAGE();
	END CATCH
  	   FETCH NEXT FROM DatabaseCursor INTO @DB_name, @DB_id  
	END 

CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor
...
Рейтинг: 0 / 0
17.12.2020, 14:47
    #40028732
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS,

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

на каждой итерации курсора вызывает хранимую процедуру [dbo].[ReIndex] в базе данных [BASE] передавая ей на вход ид текущей базы в курсоре.

что делает данная процедура хз ибо явно какой то самопис.


теперь вопрос к ТС:
а вы уверены что вам нужно запускать этот скрипт для оптимизации? вы испытываете какие то реальные проблемы? или это запуск "для профилактики"?
...
Рейтинг: 0 / 0
17.12.2020, 14:56
    #40028736
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
felix_ff
STestS,
теперь вопрос к ТС:


Честно говоря я не уверен в том что данный код оптимизирует что то по этому и обратился за помощью... Сейчас постараюсь найти процедуру... Проблем как таких с базой нету, мне сказали что данный скрипт реиндексирует базу...
...
Рейтинг: 0 / 0
17.12.2020, 14:56
    #40028739
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
felix_ff
STestS,

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


кроме системных и 4 каких-то других
Код: sql
1.
WHERE database_id NOT IN (1,3,4,5,6,122,124)
...
Рейтинг: 0 / 0
17.12.2020, 15:01
    #40028742
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
Тело процедуры

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
USE [BASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ReIndex] @DbId INT AS BEGIN

SET NOCOUNT ON; 
	DECLARE @RowNumber INT = 1, @CntRows INT = 0;
	DECLARE @TableName varchar(300) = '', @IndexName varchar(300) = '', @AvgFrag FLOAT = 0;
	DECLARE @Command VARCHAR(8000) = '';
       
	if (@DbId is null) begin return	end
		create table #IndexTmpTable (Id INT IDENTITY(1,1) PRIMARY KEY,TableName varchar(150),IndexName varchar(300),AvgFrag FLOAT);

		SELECT @Command = 'use [' + DB_NAME(@DbId) + '];
		INSERT INTO #IndexTmpTable
        SELECT Obj.name AS TableName, Inx.name AS IndexName, AvgFrag.avg_fragmentation_in_percent AS Fragmentation
		FROM sys.dm_db_index_physical_stats (' + CAST(@DbId as varchar(10)) + ', NULL, NULL, NULL, NULL) AS AvgFrag
			LEFT JOIN sys.indexes AS Inx ON AvgFrag.object_id = Inx.object_id AND AvgFrag.index_id = Inx.index_id
			LEFT JOIN sys.objects AS Obj ON AvgFrag.object_id = Obj.object_id
			LEFT JOIN sys.schemas AS Sch ON Obj.schema_id = Sch.schema_id
		WHERE AvgFrag.index_id > 0
			AND AvgFrag.avg_fragmentation_in_percent > 1'
		EXEC (@Command);

        --Количество строк для обработки
        SELECT @CntRows = COUNT(1) FROM #IndexTmpTable
		
        --Цикл обработки каждого индекса
        WHILE @RowNumber <= @CntRows
                BEGIN
                  --Получаем названия объектов, а также степень фрагментации текущего индекса
                  SELECT @TableName = TableName, 
                         @IndexName = IndexName, 
                         @AvgFrag = AvgFrag
                  FROM #IndexTmpTable
                  WHERE Id = @RowNumber    
                  IF (@AvgFrag > 1) BEGIN
                       --Формируем строку инструкции и выполняем ее
                       SELECT @Command = 'ALTER INDEX [' + @IndexName + '] ON [' + DB_NAME(@DbId) + '].[dbo].[' + @TableName + '] REORGANIZE';
                       EXEC (@Command);
				END 
                   --Выводим служебную информацию о текущей операции
                   PRINT(CAST(@AvgFrag AS VARCHAR(10)) + '%fragm Выполнена инструкция ' + @Command);     
                   --Переходим к следующему индексу
                   SET @RowNumber = @RowNumber + 1
    END
	drop table #IndexTmpTable;
END
...
Рейтинг: 0 / 0
17.12.2020, 15:02
    #40028745
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
komrad

кроме системных и 4 каких-то других


Да есть и другие но пока не в этом дело...
...
Рейтинг: 0 / 0
17.12.2020, 15:53
    #40028795
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS,

жестко и влоб работает данная процедура
не учитывает размер индексов и срабатывает при минимальной фрагментации

если есть потребность, то лучше использовать более гибкий вариант от Ola Hallengren
...
Рейтинг: 0 / 0
17.12.2020, 16:03
    #40028800
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
komrad
felix_ff
STestS,

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


кроме системных и 4 каких-то других
Код: sql
1.
WHERE database_id NOT IN (1,3,4,5,6,122,124)




да сорян, спасибо что поправил, я обратил внимание только на нижние условия предиката
:)
...
Рейтинг: 0 / 0
17.12.2020, 16:05
    #40028801
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
komrad
STestS,
жестко и влоб работает данная процедура
не учитывает размер индексов и срабатывает при минимальной фрагментации


Да я тоже это заметил. как я уже раньше писал не особо разбираюсь в данной теме но поискав в интернете выяснил что основным критерием есть количество страниц, или как лучше организовать реиндексацию базы?
...
Рейтинг: 0 / 0
17.12.2020, 16:11
    #40028802
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS
komrad
STestS,
жестко и влоб работает данная процедура
не учитывает размер индексов и срабатывает при минимальной фрагментации


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


Критерии стратегии реиндексации исходят из наличия реальных проблем оказываемых фрагментацией.
Если вы реально наблюдаете проблемы с производительностью каких либо запросов, можно рассматривать какие то критерии оптимизации.
Просто так лопатить частично или всю базу убирая фрагментацию не имеет особого смысла.
...
Рейтинг: 0 / 0
17.12.2020, 16:25
    #40028806
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
felix_ff,

Ясно, подскажите возможно есть способ оценить критичность ситуации до ее появления? То есть не решать проблему по факту, а стараться опередить возможную проблему. Как вариант оценить (узнать) в необходимости для каждой базы (таблицы)...
...
Рейтинг: 0 / 0
17.12.2020, 16:31
    #40028807
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
[spoiler] в тему
YouTube Video
...
Рейтинг: 0 / 0
17.12.2020, 16:59
    #40028826
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS
felix_ff,

Ясно, подскажите возможно есть способ оценить критичность ситуации до ее появления? То есть не решать проблему по факту, а стараться опередить возможную проблему. Как вариант оценить (узнать) в необходимости для каждой базы (таблицы)...


данный вопрос слишком общий, здесь не будет явного прямого ответа: "смотри вот сюда и сюда"
скажем так, что бы делать выводы о производительности отдельно взятой системы нужно произвести комплексную оценку данной системы:
1) проанализировать технические характеристики сервера (cpu, ram, io, network)
2) оценить превалирующую нагрузку (OLTP / DWH /etc)
3) произвести замер базовых счетчиков производительности
4) проанализировать логи сервера
5) оценить кол-во пользователей
6) оценить степенные характеристики использования баз данных (к примеру одну бд используют овер дофига, а к остальным базам обращаются раз в месяц)

при этом есть варианты когда анализ делается не в моменте, а растягивается на интервале времени. в частности обычно это касается замера счетчиков производительности.

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

вообщем что я хотел сформулировать: информацию которую Вы хотите получить обычно дает специальный человек, который получает за свою работу денюжку. это или штатный дба компании или нанятый или список проффессий схожий по фугкционалу
...
Рейтинг: 0 / 0
17.12.2020, 17:09
    #40028832
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
felix_ff,

Я вас понял и вектор куда нужно двигаться. Подскажите наверное самый важный вопрос на сегодняшний день: запуск данного скрипта приносит положительный результат или лучше не запускать?
...
Рейтинг: 0 / 0
17.12.2020, 17:21
    #40028838
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS,

у вас HDD или SSD?
...
Рейтинг: 0 / 0
17.12.2020, 17:28
    #40028843
STestS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
Критик,

По моему HDD
...
Рейтинг: 0 / 0
17.12.2020, 19:22
    #40028894
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS,

если HDD и на базах активно меняются данные (превалируют UPDATE, DELETE операции), то пользу может приносить.

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

я бы поднял бы уровень скажем до 50-60.

но опять таки утверждение "пальцем в небо", без видения реальной картины сказать сложно. можете рассматривать как просто совет.
...
Рейтинг: 0 / 0
18.12.2020, 13:26
    #40029058
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь по SQL скрипту
STestS
felix_ff,

Я вас понял и вектор куда нужно двигаться. Подскажите наверное самый важный вопрос на сегодняшний день: запуск данного скрипта приносит положительный результат или лучше не запускать?


Перечитал 2 раза, про вектор хорошо написано, про "положительный результат" и "лучше не запускать"
Надо полировать свое мастерство
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь по SQL скрипту / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]