powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
25 сообщений из 213, страница 3 из 9
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39813853
Ролг Хупин, реально классно что на форуме нельзя править сообщения. Иногда такие перлы попадаются )))

Если же серьезно, то появилась идея сделать тул более функциональным и кастомизируемым.
Планирую добавить контрол в котором можно задавать набор условий и действие которое нужно сделать над индексом, когда эти условия выполняются. В порядке определенного приоритета.

И тут есть пара противоречий. Размер индекса (с ... по ... ) является обязательным параметром. Остальные условия можно кастомизировать.
Нужно ли уровень фрагментации делать обязательным параметром для каждого условия?

Примеры таких условий может кто-то предложить? Скажем когда выгоднее делать обновление статистики а не ребилд, потому что все очень сильно зависит от системы и нагрузки.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814329
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SyrovatchenkoНа данный момент и в дальнейшем, SQL Index Manager полностью бесплатный . DevExpress тоже бесплатный?

Sergey SyrovatchenkoMindМожет ради пустого места в индексах и можно заморочиться, но не ради фрагментации как таковой. Пустое место критично хотя бы, потому что память занимает.
Тут я с Вами солидарен. Из этих соображений я и добавил отдельную колонку Unused Place по которой можно быстро найти индексы, где много свободного места.
Код: sql
1.
UnusedPagesCount = CASE WHEN ABS(a.ReservedPages - a.UsedPages) > 32 THEN a.ReservedPages - a.UsedPages ELSE 0 END


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

Sergey SyrovatchenkoНужно ли уровень фрагментации делать обязательным параметром для каждого условия?Можно по fill factor (avg_page_space_used_in_percent) ребилдить, не обязательно по фрагментации. Но у вас его нету, да и считать затратно.

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

Sergey SyrovatchenkoПримеры таких условий может кто-то предложить?В том то и проблема, иметь такую функциональность конечно хорошо, но вот кто и как ею будет пользоваться? Если бы тул сам на основе анализа предыдущих ребилдов, потраченного времени, фрагментации до и после, периодичности ребилдов, статистики использования индексов и прочих разных данных предлагал бы правила и опции ребилда и как часто и когда его лучше делать, то был бы смысл. А так, кто все эти правила будет настраивать и кто гарантирует что они оптимальные? Это либо пальцем в небо, либо нужно потратить кучу времени на весь этот анализ вручную. А выхлоп какой? Будет ли разница по сравнению с таким подходом, или тупым в лоб или вообще без всякого ребилда? Как эту разницу измерять? В том что уменьшится количество page splits?
Вот скажем та же опция задавать fill factor вручную. Для 95% индексов самый лучший fill factor это дефолтный. Ребилдить все с fill factor = 80 это несусветная глупость. Для того чтобы настроить fill factor для каждого индекса индивидуально нужно потратить кучу времени. Есть ли смысл это делать?
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814400
MindDevExpress тоже бесплатный?
Я вроде DevEx еще никому не впаривал :)

У самого есть лицензия (правда старая). Тем более на библиотеки не распространяются ограничения если продукт был сделан на основе лицензии.
Тем кому эти компоненты не нравятся можно прикрутить хоть WPF хоть что угодно другое.
К слову это тоже в будующих планах - свои контролы сделать.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814531
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SyrovatchenkoMindDevExpress тоже бесплатный?
Я вроде DevEx еще никому не впаривал :)

У самого есть лицензия (правда старая). Тем более на библиотеки не распространяются ограничения если продукт был сделан на основе лицензии.
Тем кому эти компоненты не нравятся можно прикрутить хоть WPF хоть что угодно другое.
К слову это тоже в будующих планах - свои контролы сделать.

От DevEx надо избавляться, тем более, что приложение мало контролов использует, грид, еще 2-3.
Можно прикрутить, что-то простое и бесплатное.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814562
Ролг ХупинОт DevEx надо избавляться
Увы, тут вы правы. Не все вещи в DevEx хорошие. Возможно в будующем как коммандную строку сделаю, то на WPF переведу проект.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814767
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SyrovatchenkoMindDevExpress тоже бесплатный?
Я вроде DevEx еще никому не впаривал :)

У самого есть лицензия (правда старая).Я за вас рад...
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814770
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mind,

Так и не понял чем плох devexpres... Немного используем telerik под win и web. Лицензия все позволяет
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814781
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKMind,

Так и не понял чем плох devexpres... Немного используем telerik под win и web. Лицензия все позволяетТак он бесплатный или нет? Мне лицензию нужно покупать чтобы скомпилировать бесплатную программу? Или мне все переписывать?
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39814783
Mind, никаких лицензий не нужно. Я специально все нужные либы приложил, чтобы можно было скомпилить прогу. Сорри, я просто вначале не понял вашего вопроса относительно DevEx.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39815024
Выложил версию 1.0.0.36 :

Добавил новые поля в гриде (операции Seeks/Scans/Lookups в разрезе индекса)

При выборе баз показывается Recovery Model в гриде

Возможность автоматически задавать DATA_COMPRESSION для индексов при ребилде

Возможность фильтрации скана только по выбранным схемам

Фикс при фильтрации не учитывались схемы с юникодными именами



Отдельно вопрос. Нужно ли показывать инфу о том какие индексы имеют статус NORECOMPUTE?
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816669
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko,
первое-программа просто бомба, применяю на работе как контроль над автоматизированными методами оптимизации статистик

Детальный разбор самого проекта, а также его работа через профайлер показал следующие моменты:
1) в запросе:
SELECT * FROM sys.databases WHERE DB_NAME() not in ('master', 'tempdb', 'model', 'msdb', 'mssqlsystemresource');
нужно DB_Name() сменить на [name]:
SELECT * FROM sys.databases WHERE [name] not in ('master', 'tempdb', 'model', 'msdb', 'mssqlsystemresource');
в связи с ошибкой в коде происходит обслуживание и системных БД

2) в запросе:
IF OBJECT_ID(''tempdb.dbo.#AllocationUnits'') IS NOT NULL
DROP TABLE #AllocationUnits

CREATE TABLE #AllocationUnits (
ContainerID BIGINT PRIMARY KEY
, ReservedPages BIGINT NOT NULL
, UsedPages BIGINT NOT NULL
)

INSERT INTO #AllocationUnits (ContainerID, ReservedPages, UsedPages)
SELECT [container_id]
, SUM([total_pages])
, SUM([used_pages])
FROM sys.allocation_units WITH(NOLOCK)
GROUP BY [container_id]
HAVING SUM([total_pages]) BETWEEN @MinIndexSize AND @MaxIndexSize;

скорее всего нужно учитывать неудаленные, т е у которых [type]<>0
источник: https://docs.microsoft.com/ru-ru/sql/relational-databases/system-catalog-views/sys-allocation-units-transact-sql?view=sql-server-2017

больше вопросов не возникло и проблем не обнаружил

Теперь пожелания:
1) сделать возможным обслуживание системных БД (master, msdb)
2) сделать возможным выборочно обновлять статистики не только для индексов и также разными способами (полностью обновлять или частично)
3) сделать возможным не только выбирать БД, но и разные сервера (это очень удобно, когда много экземпляров скулей).

Также скачанный проект не компилируется, выдавая код ошибки, который расшифровывается как проблема с лицензией компонентов DevExpress
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816671
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko,

и еще хорошо бы аналогичное по анализу и оптимизации существующих статистик
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816678
ЕвгенийGEM SELECT * FROM sys.databases WHERE DB_NAME() not in ('master', 'tempdb', 'model', 'msdb', 'mssqlsystemresource');
Запрос точно не мой :)

У меня в коде базы получаются так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT DatabaseName = t.[name]
     , d.DataSize
     , d.LogSize
     , RecoveryModel = t.recovery_model_desc
FROM sys.databases t WITH(NOLOCK)
LEFT JOIN (
    SELECT [database_id]
         , DataSize = SUM(CASE WHEN [type] = 0 THEN CAST(size AS BIGINT) END)
         , LogSize  = SUM(CASE WHEN [type] = 1 THEN CAST(size AS BIGINT) END)
    FROM sys.master_files WITH(NOLOCK)
    GROUP BY [database_id]
) d ON d.[database_id] = t.[database_id]
WHERE t.[state] = 0
    AND t.[database_id] != 2
    AND ISNULL(HAS_DBACCESS(t.[name]), 1) = 1


ЕвгенийGEM скорее всего нужно учитывать неудаленные, т е у которых [type]<>0
Замечание важное. Погляжу как это затрагивает мою текущую логику

ЕвгенийGEM сделать возможным обслуживание системных БД (master, msdb)
То есть обслуживать системные обьекты? Потому как пользовательские обьекты в системных базах обслуживать можно.

ЕвгенийGEMсделать возможным выборочно обновлять статистики не только для индексов и также разными способами (полностью обновлять или частично)
В ближайших планах что-то сделать в этом направлении. Есть идея показывать статистику просто как отдельную строку и фильтровать по степени устаревания и тому сколько изменений было на уровне индекса.

ЕвгенийGEMсделать возможным не только выбирать БД, но и разные сервера (это очень удобно, когда много экземпляров скулей).
Увы это пока реализовать быстро не получится, но на перспективу учтем.

ЕвгенийGEMвыдавая код ошибки, который расшифровывается как проблема с лицензией компонентов DevExpress
Можно точное сообщение об ошибке показать. У меня просто с таким проблем не было на 2017й студии.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816797
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko, трассировка запускалась на изолированной среде, чтобы как раз исследовать все запросы от Вашей тулзы.
Потому все запросы от Вашей тулзы)
Лучше на Core переписать.
А в будущем сделать платную ветвь в стиле сервер-клиент на ASP.NET Core, куда добавить мониторинг подобный Spotlight и даже лучше)
Но вообще за тулзу больфуфий респект!)
Предлагаю код ошибки и прочие детали в личке обсудить
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816807
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko, еще вспомнил-лучше отсеивать отключенные индексы и те базы, которые недоступны на редактированине (как в целом БД, так и отдельный ее файл).
Не помню было ли в коде этл учтено.
И еще пока не разглядел-если индекс секционированный, то есть возможность выбирать какие секции и что с каждым делать и каким образом делать?
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816823
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko, на счет фильтруемых индексов. Достаточно часто встречал, когда фильтруемый индекс непросто не используется оптимизатором, а даже через подсказки не может план построить и вылетает ошибка выполнения запроса. Аналогично и фидьтрация репликации слияния.
Потому уже выработался инстинкт-никаких фильтруемых индексов и реплик.
Надо-отдельная табдица или секции.
А для сложной и устойчивой реплики обычно используют сторонние тулзы или при возможности свою пилят (если конечно AlwaysOn недоступен или его недосиаточно по каким-то условиям)
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816828
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT DB_NAME() as DB,
o.name AS ObjectName
, i.name AS IndexName
, i.index_id AS IndexID
, dm_ius.user_seeks AS UserSeek
, dm_ius.user_scans AS UserScans
, dm_ius.user_lookups AS UserLookups
, dm_ius.user_updates AS UserUpdates
,last_user_seek
,last_user_scan
,last_user_lookup
, p.TableRows
, 'DROP INDEX ' + QUOTENAME(i.name)
+ ' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(OBJECT_NAME(dm_ius.OBJECT_ID)) AS 'drop statement'
FROM sys.dm_db_index_usage_stats dm_ius
INNER JOIN sys.indexes i ON i.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = i.OBJECT_ID
INNER JOIN sys.objects o ON dm_ius.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN (SELECT SUM(p.rows) TableRows, p.index_id, p.OBJECT_ID
FROM sys.partitions p GROUP BY p.index_id, p.OBJECT_ID) p
ON p.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = p.OBJECT_ID
WHERE OBJECTPROPERTY(dm_ius.OBJECT_ID,'IsUserTable') = 1
AND dm_ius.database_id = DB_ID()
AND i.type_desc in('clustered', 'nonclustered')
AND i.is_unique_constraint = 0
--AND (o.name='EmailMessageAttachments')
ORDER BY (dm_ius.user_seeks + dm_ius.user_scans + dm_ius.user_lookups) ASC
Т к представление dm_db_index_usage_stats среди прочего показывает и уровни индекса.
Т е просто по данному представлению можно получить что один и тот же индекс используется и не используется, т к вывод был для разных уровней. Сам в свое время сильно ошибся, интерпретируя неверно показатели.
Анализ статистики завтра скину
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816854
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийGEMSergey Syrovatchenko, на счет фильтруемых индексов. Достаточно часто встречал, когда фильтруемый индекс непросто не используется оптимизатором, а даже через подсказки не может план построить и вылетает ошибка выполнения запроса.Ну если создать неправильный индекс, а потом заставить сервер его использовать то конечно оно с ошибкой свалится.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816855
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийGEM Т к представление dm_db_index_usage_stats среди прочего показывает и уровни индекса. Уровни? Какие еще уровни показывает это представление?
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816865
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko, а не было мысли второй закладкой прикрутить анализ по индексам на основе sys.dm_db_missing_index_group_stats и сотоварищей?
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816918
andy stа не было мысли второй закладкой прикрутить анализ по индексам на основе sys.dm_db_missing_index_group_stats и сотоварищей?
Мысль была. Думаю сделать можно будет опционально:
В настройках добавляется опция MISSING INDEXES

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

В отличии от обычных индексов для этой группы будет две команды CREATE INDEX / CREATE STATISTICS (потому как не всегда индекс имеет смысл создавать)

Будут добавлены новые колонки Index Columns / Included Columns как для существующих записей, так и для тех индексов которые представление рекомендует создать (для наглядности это думаю нужно будет)

ЕвгенийGEM лучше отсеивать отключенные индексы и те базы, которые недоступны на редактированине (как в целом БД, так и отдельный ее файл).
Отключенные индексы в итоговую выборку и так не попадают из-за условий rows > 0 + предварительной фильтрации по размеру. У отключенного индекса размера нет как такового.
Базы которые недоступны для редактирования я тоже игнорю еще на этапе выбора за счет проверки на права + state = 0

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

ЕвгенийGEMсделать возможным выборочно обновлять статистики не только для индексов и также разными способами (полностью обновлять или частично)
Есть идея:

Добавить в настройки новый тип STATISTICS

Показывать в том же гриде статистику где и индексы выводятся

Фильтровать статистику с сервера на клиент на основе устаревания (то есть выведи мне все что старее н-дней) либо показывать где статистика не совпадает с текущим кол-во строк у таблицы

Будет показываться как статистика закрепленная за индексом (есть проблема с автоинкрементальной), так и пользовательская

Если вдруг мы делаем ребилд индекса и выбрали дальше еще апдейт статистики с фуллсканом то обновление статистики делаться не будет (то есть нужно будет предусмотреть чтобы лишних операций не было)

Примерно как-то так это себе вижу. Получится правда монстр зато весьма функциональный.
Пока не начал делать хотелось бы мнение комьюнити спросить.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39816991
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Syrovatchenko, как и обещал-вот один из примеров обновления индексов:
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
declare
	--Максимальный размер в МБ для рассматриваемого объекта
	@ObjectSizeMB numeric (16,3) = NULL,
	--Максимальное кол-во строк в секции
	@row_count numeric (16,3) = NULL

/*
	тонкое обновление статистики
*/
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

   declare @ObjectID int;
declare @SchemaName nvarchar(255);
declare @ObjectName nvarchar(255);
declare @StatsID int;
declare @StatName nvarchar(255);
declare @SQL_Str nvarchar(max);

;with st AS(
select DISTINCT 
obj.[object_id]
, obj.[create_date]
, OBJECT_SCHEMA_NAME(obj.[object_id]) as [SchemaName]
, obj.[name] as [ObjectName]
, CAST(
		(
		   --общее число страниц, зарезервированных в секции (по 8 КБ на 1024 поделить=поделить на 128)
			SELECT SUM(ps2.[reserved_page_count])/128.
			from sys.dm_db_partition_stats as ps2
			where ps2.[object_id] = obj.[object_id]
		) as numeric (38,2)
	  ) as [ObjectSizeMB] --размер объекта в МБ
, s.[stats_id]
, s.[name] as [StatName]
, sp.[last_updated]
, i.[index_id]
, i.[type_desc]
, i.[name] as [IndexName]
, ps.[row_count]
, s.[has_filter]
, s.[no_recompute]
, sp.[rows]
, sp.[rows_sampled]
--кол-во изменений вычисляется как:
--сумма общего кол-ва изменений в начальном столбце статистики с момента последнего обновления статистики
--и разности приблизительного кол-ва строк в секции и общего числа строк в таблице или индексированном представлении при последнем обновлении статистики
, sp.[modification_counter]+ABS(ps.[row_count]-sp.[rows]) as [ModificationCounter]
--% количества строк, выбранных для статистических вычислений,
--к общему числу строк в таблице или индексированном представлении при последнем обновлении статистики
, NULLIF(CAST( sp.[rows_sampled]*100./sp.[rows] as numeric(18,3)), 100.00) as [ProcSampled]
--% общего кол-ва изменений в начальном столбце статистики с момента последнего обновления статистики
--к приблизительному количество строк в секции
, CAST(sp.[modification_counter]*100./(case when (ps.[row_count]=0) then 1 else ps.[row_count] end) as numeric (18,3)) as [ProcModified]
--Вес объекта:
--[ProcModified]*десятичный логарифм от приблизительного кол-ва строк в секции
, CAST(sp.[modification_counter]*100./(case when (ps.[row_count]=0) then 1 else ps.[row_count] end) as numeric (18,3))
							* case when (ps.[row_count]<=10) THEN 1 ELSE LOG10 (ps.[row_count]) END as [Func]
--было ли сканирование:
--общее количество строк, выбранных для статистических вычислений, не равно
--общему числу строк в таблице или индексированном представлении при последнем обновлении статистики
, CASE WHEN sp.[rows_sampled]<>sp.[rows] THEN 0 ELSE 1 END as [IsScanned]
, tbl.[name] as [ColumnType]
, s.[auto_created]	
from sys.objects as obj
inner join sys.stats as s on s.[object_id] = obj.[object_id]
left outer join sys.indexes as i on i.[object_id] = obj.[object_id] and (i.[name] = s.[name] or i.[index_id] in (0,1) 
				and not exists(select top(1) 1 from sys.indexes i2 where i2.[object_id] = obj.[object_id] and i2.[name] = s.[name]))
left outer join sys.dm_db_partition_stats as ps on ps.[object_id] = obj.[object_id] and ps.[index_id] = i.[index_id]
outer apply sys.dm_db_stats_properties (s.[object_id], s.[stats_id]) as sp
left outer join sys.stats_columns as sc on s.[object_id] = sc.[object_id] and s.[stats_id] = sc.[stats_id]
left outer join sys.columns as col on col.[object_id] = s.[object_id] and col.[column_id] = sc.[column_id]
left outer join sys.types as tbl on col.[system_type_id] = tbl.[system_type_id] and col.[user_type_id] = tbl.[user_type_id]
where obj.[type_desc] <> 'SYSTEM_TABLE'
)
SELECT
	st.[object_id]
	, st.[SchemaName]
	, st.[ObjectName]
	, st.[stats_id]
	, st.[StatName]
	INTO #tbl
FROM st
WHERE NOT (st.[row_count] = 0 AND st.[last_updated] IS NULL)--если нет данных и статистика не обновлялась
	--если нечего обновлять
	AND NOT (st.[row_count] = st.[rows] AND st.[row_count] = st.[rows_sampled] AND st.[ModificationCounter]=0)
	--если есть что обновлять (и данные существенно менялись)
	AND ((st.[ProcModified]>=10.0) OR (st.[Func]>=10.0) OR (st.[ProcSampled]<=50))
	--ограничения, выставленные во входных параметрах
	AND (
		 ([ObjectSizeMB]<=@ObjectSizeMB OR @ObjectSizeMB IS NULL)
		 AND
		 (st.[row_count]<=@row_count OR @row_count IS NULL)
		);

WHILE (exists(select top(1) 1 from #tbl))
BEGIN
	select top(1)
	@ObjectID	=[object_id]
	,@SchemaName=[SchemaName]
	,@ObjectName=[ObjectName]
	,@StatsId	=[stats_id]
	,@StatName	=[StatName]
	from #tbl;

	SET @SQL_Str = 'IF (EXISTS(SELECT TOP(1) 1 FROM sys.stats as s WHERE s.[object_id] = '+CAST(@ObjectID as nvarchar(32)) + 
					' AND s.[stats_id] = ' + CAST(@StatsId as nvarchar(32)) +')) UPDATE STATISTICS ' + QUOTENAME(@SchemaName) +'.' +
					QUOTENAME(@ObjectName) + ' ('+QUOTENAME(@StatName) + ') WITH FULLSCAN;';

	execute sp_executesql @SQL_Str;

	delete from #tbl
	where [object_id]=@ObjectID
	  and [stats_id]=@StatsId;
END

drop table #tbl;


Здесь лучше переписать на курсор, чем удалять каждый раз значение из временной таблицы, но мне было лень)
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39817259
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: ЕвгенийGEM, ваш список "аномальных" фич MSSQL и связанное с ним обсуждения я отсюда вырезаю: в этой теме неуместно. Если все еще хотите подискутировать, создайте отдельню тему, хотя я бы на вашем месте с таким уровнем аргументации "аномальности" не стал -- засмеют.
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39817266
ЕвгенийGEM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,
по первому предложению полностью согласен.
По второму может статью опубликую по багам скуля.
P.S.: мне пофиг на чужое мнение, которое не сталкивалось с тем фактом, который я в свое время зарегистрировал
...
Рейтинг: 0 / 0
SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
    #39817272
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийGEMЗдесь лучше переписать на курсор, чем удалять каждый раз значение из временной таблицы, но мне было лень)
не лучше
https://www.sqlbook.com/advanced/sql-cursors-how-to-avoid-them/
...
Рейтинг: 0 / 0
25 сообщений из 213, страница 3 из 9
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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