powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь по SQL скрипту
18 сообщений из 18, страница 1 из 1
Нужна помощь по SQL скрипту
    #40028730
STestS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
У меня имеется скрипт который по идеи должен делать оптимизацию базы данных но меня что то смущает в нем... Опыта у меня мало а экспериментировать - чревато последствиями... Прошу вашей помощи растолковать что это за "фрукт"
Спасибо.

Код: 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
Нужна помощь по SQL скрипту
    #40028732
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STestS,

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

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

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


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


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

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


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

Код: 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
Нужна помощь по SQL скрипту
    #40028745
STestS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad

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


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

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

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

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


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




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


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


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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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


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