Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7   вперед  Ctrl      все
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 109
Ролг Хупин, реально классно что на форуме нельзя править сообщения. Иногда такие перлы попадаются )))

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

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

Примеры таких условий может кто-то предложить? Скажем когда выгоднее делать обновление статистики а не ребилд, потому что все очень сильно зависит от системы и нагрузки.
16 май 19, 09:23    [21885890]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2301
Sergey Syrovatchenko
На данный момент и в дальнейшем, SQL Index Manager полностью бесплатный.
DevExpress тоже бесплатный?

Sergey Syrovatchenko
Mind
Может ради пустого места в индексах и можно заморочиться, но не ради фрагментации как таковой. Пустое место критично хотя бы, потому что память занимает.

Тут я с Вами солидарен. Из этих соображений я и добавил отдельную колонку Unused Place по которой можно быстро найти индексы, где много свободного места.

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 для каждого индекса индивидуально нужно потратить кучу времени. Есть ли смысл это делать?
16 май 19, 23:34    [21886700]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 109
Mind
DevExpress тоже бесплатный?

Я вроде DevEx еще никому не впаривал :)

У самого есть лицензия (правда старая). Тем более на библиотеки не распространяются ограничения если продукт был сделан на основе лицензии.
Тем кому эти компоненты не нравятся можно прикрутить хоть WPF хоть что угодно другое.
К слову это тоже в будующих планах - свои контролы сделать.
17 май 19, 09:02    [21886840]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3147
Sergey Syrovatchenko
Mind
DevExpress тоже бесплатный?

Я вроде DevEx еще никому не впаривал :)

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


От DevEx надо избавляться, тем более, что приложение мало контролов использует, грид, еще 2-3.
Можно прикрутить, что-то простое и бесплатное.
17 май 19, 12:12    [21887105]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 109
Ролг Хупин
От DevEx надо избавляться

Увы, тут вы правы. Не все вещи в DevEx хорошие. Возможно в будующем как коммандную строку сделаю, то на WPF переведу проект.
17 май 19, 13:03    [21887176]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2301
Sergey Syrovatchenko
Mind
DevExpress тоже бесплатный?

Я вроде DevEx еще никому не впаривал :)

У самого есть лицензия (правда старая).
Я за вас рад...
17 май 19, 18:28    [21887550]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
Mind,

Так и не понял чем плох devexpres... Немного используем telerik под win и web. Лицензия все позволяет
17 май 19, 18:33    [21887555]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2301
TaPaK
Mind,

Так и не понял чем плох devexpres... Немного используем telerik под win и web. Лицензия все позволяет
Так он бесплатный или нет? Мне лицензию нужно покупать чтобы скомпилировать бесплатную программу? Или мне все переписывать?
17 май 19, 19:13    [21887581]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 109
Mind, никаких лицензий не нужно. Я специально все нужные либы приложил, чтобы можно было скомпилить прогу. Сорри, я просто вначале не понял вашего вопроса относительно DevEx.
17 май 19, 19:43    [21887591]     Ответить | Цитировать Сообщить модератору
 Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 109
Выложил версию 1.0.0.36:

  • Добавил новые поля в гриде (операции Seeks/Scans/Lookups в разрезе индекса)
  • При выборе баз показывается Recovery Model в гриде
  • Возможность автоматически задавать DATA_COMPRESSION для индексов при ребилде
  • Возможность фильтрации скана только по выбранным схемам
  • Фикс при фильтрации не учитывались схемы с юникодными именами

    Картинка с другого сайта.

    Отдельно вопрос. Нужно ли показывать инфу о том какие индексы имеют статус NORECOMPUTE?
  • 19 май 19, 15:57    [21888228]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    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
    22 май 19, 17:09    [21891022]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    Sergey Syrovatchenko,

    и еще хорошо бы аналогичное по анализу и оптимизации существующих статистик
    22 май 19, 17:09    [21891025]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    Sergey Syrovatchenko
    Member

    Откуда: Харьков
    Сообщений: 109
    ЕвгенийGEM
    SELECT * FROM sys.databases WHERE DB_NAME() not in ('master', 'tempdb', 'model', 'msdb', 'mssqlsystemresource');

    Запрос точно не мой :)

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

    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й студии.
    22 май 19, 17:27    [21891052]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    Sergey Syrovatchenko, трассировка запускалась на изолированной среде, чтобы как раз исследовать все запросы от Вашей тулзы.
    Потому все запросы от Вашей тулзы)
    Лучше на Core переписать.
    А в будущем сделать платную ветвь в стиле сервер-клиент на ASP.NET Core, куда добавить мониторинг подобный Spotlight и даже лучше)
    Но вообще за тулзу больфуфий респект!)
    Предлагаю код ошибки и прочие детали в личке обсудить
    22 май 19, 21:43    [21891282]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    Sergey Syrovatchenko, еще вспомнил-лучше отсеивать отключенные индексы и те базы, которые недоступны на редактированине (как в целом БД, так и отдельный ее файл).
    Не помню было ли в коде этл учтено.
    И еще пока не разглядел-если индекс секционированный, то есть возможность выбирать какие секции и что с каждым делать и каким образом делать?
    22 май 19, 22:30    [21891312]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    Sergey Syrovatchenko, на счет фильтруемых индексов. Достаточно часто встречал, когда фильтруемый индекс непросто не используется оптимизатором, а даже через подсказки не может план построить и вылетает ошибка выполнения запроса. Аналогично и фидьтрация репликации слияния.
    Потому уже выработался инстинкт-никаких фильтруемых индексов и реплик.
    Надо-отдельная табдица или секции.
    А для сложной и устойчивой реплики обычно используют сторонние тулзы или при возможности свою пилят (если конечно AlwaysOn недоступен или его недосиаточно по каким-то условиям)
    22 май 19, 23:38    [21891360]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    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 среди прочего показывает и уровни индекса.
    Т е просто по данному представлению можно получить что один и тот же индекс используется и не используется, т к вывод был для разных уровней. Сам в свое время сильно ошибся, интерпретируя неверно показатели.
    Анализ статистики завтра скину
    22 май 19, 23:45    [21891366]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    Mind
    Member

    Откуда: Лучший город на Земле
    Сообщений: 2301
    ЕвгенийGEM
    Sergey Syrovatchenko, на счет фильтруемых индексов. Достаточно часто встречал, когда фильтруемый индекс непросто не используется оптимизатором, а даже через подсказки не может план построить и вылетает ошибка выполнения запроса.
    Ну если создать неправильный индекс, а потом заставить сервер его использовать то конечно оно с ошибкой свалится.
    23 май 19, 03:03    [21891399]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    Mind
    Member

    Откуда: Лучший город на Земле
    Сообщений: 2301
    ЕвгенийGEM
    Т к представление dm_db_index_usage_stats среди прочего показывает и уровни индекса.
    Уровни? Какие еще уровни показывает это представление?
    23 май 19, 03:12    [21891400]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    andy st
    Member

    Откуда:
    Сообщений: 769
    Sergey Syrovatchenko, а не было мысли второй закладкой прикрутить анализ по индексам на основе sys.dm_db_missing_index_group_stats и сотоварищей?
    23 май 19, 06:15    [21891411]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    Sergey Syrovatchenko
    Member

    Откуда: Харьков
    Сообщений: 109
    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
  • Показывать в том же гриде статистику где и индексы выводятся
  • Фильтровать статистику с сервера на клиент на основе устаревания (то есть выведи мне все что старее н-дней) либо показывать где статистика не совпадает с текущим кол-во строк у таблицы
  • Будет показываться как статистика закрепленная за индексом (есть проблема с автоинкрементальной), так и пользовательская
  • Если вдруг мы делаем ребилд индекса и выбрали дальше еще апдейт статистики с фуллсканом то обновление статистики делаться не будет (то есть нужно будет предусмотреть чтобы лишних операций не было)

    Примерно как-то так это себе вижу. Получится правда монстр зато весьма функциональный.
    Пока не начал делать хотелось бы мнение комьюнити спросить.
  • 23 май 19, 10:14    [21891569]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    Sergey Syrovatchenko, как и обещал-вот один из примеров обновления индексов:
    +
    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;
    

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

    Сообщение было отредактировано: 23 май 19, 12:47
    23 май 19, 11:58    [21891729]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    Гавриленко Сергей Алексеевич
    Member

    Откуда: Moscow
    Сообщений: 36493
    Модератор: ЕвгенийGEM, ваш список "аномальных" фич MSSQL и связанное с ним обсуждения я отсюда вырезаю: в этой теме неуместно. Если все еще хотите подискутировать, создайте отдельню тему, хотя я бы на вашем месте с таким уровнем аргументации "аномальности" не стал -- засмеют.


    Сообщение было отредактировано: 23 май 19, 16:40
    23 май 19, 16:39    [21892268]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    ЕвгенийGEM
    Member

    Откуда:
    Сообщений: 94
    Гавриленко Сергей Алексеевич,
    по первому предложению полностью согласен.
    По второму может статью опубликую по багам скуля.
    P.S.: мне пофиг на чужое мнение, которое не сталкивалось с тем фактом, который я в свое время зарегистрировал
    23 май 19, 16:44    [21892283]     Ответить | Цитировать Сообщить модератору
     Re: SQL Index Manager - бесплатная утилита по обслуживанию индексов для SQL Server и Azure  [new]
    komrad
    Member

    Откуда: Msk -> Utrecht
    Сообщений: 5029
    ЕвгенийGEM
    Здесь лучше переписать на курсор, чем удалять каждый раз значение из временной таблицы, но мне было лень)

    не лучше
    https://www.sqlbook.com/advanced/sql-cursors-how-to-avoid-them/
    23 май 19, 16:56    [21892296]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить