• SQL Index Manager — бесплатный тул для дефрагментации и обслуживания индексов

      Много лет работая SQL Server DBA и занимаясь то администрированием серверов, то оптимизацией производительности. В общем, захотелось в свободное время сделать что-то полезное для Вселенной и коллег по цеху. Так в итоге получился небольшой опенсорс тул по обслуживанию индексов для SQL Server и Azure.

      SQL Index Manager

      Читать дальше →
      • +18
      • 6.5k
      • 8
    • SQL Index Manager – a long story about SQL Server, grave digging and index maintenance

        SQL Index Manager

        Every now and then we create our own problems with our own hands… with our vision of the world… with our inaction… with our laziness… and with our fears. As a result, it seems to become very convenient to swim in the public flow of sewage patterns… because it is warm and fun, and the rest does not matter – we can smell round. But after a fail comes the realization of the simple truth – instead of generating an endless stream of causes, self-pity and self-justification, it is enough just to do what you consider the most important for yourself. This will be the starting point for your new reality.

        For me, the written below is just such a starting point. The way is expected to be lingering…
        Let's go?
      • Копание могил, SQL Server, годы аутсорса и свой первый проект

          image

          Практически всегда мы создаем свои проблемы своими же руками… своей картиной мира… своим бездействием… своей ленью… своими страхами. Что потом становится весьма удобно плыть в общественном потоке канализационных шаблонов… ведь это тепло и весело, а остальное пофиг – принюхаемся. Но после жесткого фейла приходит осознание простой истины – вместо генерации бесконечного потока причин, жалости к себе и самооправданий достаточно просто взять и сделать то, что ты считаешь самым важным для себя. Это и будет отправной точной твоей новой реальности.

          Для меня написанное ниже является именно такой отправной точкой. Путь будет не близкий…
          Поехали?
        • SQL Server 2017 JSON



            Когда много лет подряд Microsoft лихорадит из одной крайности в другую, то понемногу начинаешь привыкать к этому и все новое ждешь с неким скепсисом. Со временем это чувство становится только сильнее и подсознательно ничего хорошего уже не ожидаешь.

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

            Такое пафосное вступление имеет определенные на то основания, поскольку долгое время на Microsoft Connect поддержка работы с JSON на SQL Server была одной из самых востребованных фич. Шли годы и неожиданно данный функционал реализовали вместе с релизом SQL Server 2016. Забегая вперед скажу, что вышло очень даже хорошо, но Microsoft не остановилась на этом и в SQL Server 2017 существенно улучшили производительность и без того быстрого JSON парсера.
            Подробнее
          • Утки, Таиланд и T-SQL… или что может подстерегать программистов при работе с SQL Server?

            • Tutorial

            Все начиналось довольно обыденно… Зачитывался Рихтером и усиленно штудировал Шилдта. Думал, что буду заниматься разработкой под .NET, но судьба на первом месяце работы распорядилась иначе. Один из сотрудников неожиданно покинул проект и во вновь образовавшуюся дыру докинули свежего людского материала. Именно тогда и началось мое знакомство с SQL Server.

            С тех пор прошло чуть меньше 6 лет и вспомнить можно многое…

            Про бывшего клиента Джозефа из Англии, который переосмыслил жизнь, за время отпуска в Таиланде, и в моем скайпе стал подписываться Жозефиной. Про веселых соседей по офису, с которыми приходилось сидеть в одной комнате: один страдал от аллергии на свежий воздух, а другой маялся от неразделенной любви к С++ дополняя это аллергией на солнечный свет. Один раз по команде свыше пришлось на время стать Александром отцом двух детей, чтобы изображать из себя обросшего скилами сениора по JS.
            Подробнее
          • Тестирование производительности баз данных при помощи tSQLt и SQLQueryStress

            • Tutorial


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

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

            В итоге работа с БД может стать узким местом в производительности нашего приложения.

            Чтобы избавить себя от подобного рода проблем, я предлагаю рассмотреть различные аспекты тестирования баз данных. К которым можно отнести нагрузочное тестирование и проверку производительности SQL Server в целом при помощи юнит-тестов.
            Подробнее
          • SQL Server 2016 Stretch Database

            • Tutorial


            Первого июня состоялся релиз SQL Server 2016, который привнес в привычную разработку большое число нововведений, среди которых уже давно анонсированную технологию Stretch Database, позволяющую динамически переносить «горячие» и «холодные» данные из SQL Server в Azure.

            С точки зрения маркетинга, Stretch Database очень хорошо распиарили. Приводили разумные аргументы, что по мере накопления в базе исторических данных возрастает сложность и стоимость её эксплуатации. И предлагали разумное решение — автоматический перенос архивных данных по мере устаревания в «облако». Честно признаюсь, идея мне понравилась.

            Начиная с SQL Server 2016 RC0 я начал тестировать технологию Stretch Database на двух проектах, которые помогаю развивать. Первый — это трекер рабочего времени для которого характерна OLTP нагрузка, второй — внутренний проект с DW нагрузкой.
            Подробнее
          • Delayed Durability или история о том как получилось ускорить выполнение автотестов с 11 до 2,5 минут

            • Tutorial


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

            Стек технологий был изначально выбран мелкомягкий, а в качестве хранилища данных использовался SQL Server 2014 Express. Одним из первых тасков, которые мне поручили — это поисследовать возможность ускорения автотестов.
            Подробнее
          • SQL Server 2014 Developer Edition теперь бесплатный

              Первого апреля принято начинать новость с очередной «правдивой» истории. Утром я уже читал обзор инженерного образца AMD Zen. Но в случае с SQL Server, все действительно является правдой.

              31 марта Tiffany Wissner (Senior Director of Data Platform Marketing) анонсировала, что теперь SQL Server 2014 Developer Edition является полностью бесплатным в рамках программы Visual Studio Dev Essentials. От всех желающих требуется только регистрация.

              К слову будет сказано, что раньше Developer Edition стоил 59.95$ на одного разработчика.

              Что дает бесплатность? Теперь не нужно мудрить с количеством лицензий, который выдаются на компанию в рамках программы партнёрства. Забыть про головную боль по переустановке Evaluation каждые 180 дней.
              Подробнее
            • 24 Hours of PASS 2016

                Март выдался на удивление богатым на события. Не успел выйти SQL Server 2016 RC0, как уже доступен для загрузки RC1. Нововведений в последнем не сильно много, поэтому интересного обзора увы не получится.

                Тем не менее, чтобы с пользой скоротать время, в ожидании релиза SQL Server 2016, предлагаю ознакомиться с докладами 24 Hours of PASS, которая прошла 16-17 марта.

                Для тех, кто слышит про 24 Hours of PASS впервые… это ежегодная онлайн-конференция, посвященная SQL Server и длящаяся 24 часа. Докладчики из разных частей света сменяют друг друга и рассказывают много интересного про SQL Server. Существует несколько версий 24HOP. Русскоязычная версия данного мероприятия уже не первый год проводится усилиями Андрея Коршикова.

                Чтобы не томить в ожидании, список видео-докладов, которые доступны под катом:

                • SQL Server Transaction log. Внутреннее устройство и решение проблем (Андрей Завадский)
                • XML, XQuery и трюки с производительностью (Сергей Сыроватченко)
                • Azure ML. Определение наиболее эффективного классификационного алгоритма для выбранного источника данных (Константин Хомяков)
                • SQL Server In-Memory OLTP: Нестандартные сценарии использования (Дмитрий Короткевич)
                • SQL Server Extended Properties как простейший способ документирования баз данных (Вячеслав Миругин)
                • SQL Server 2016 Reporting Services. Быстрый старт (Андрей Коршиков)
                • Поддержка больших БД на MS SQL Server (Кирилл Панов)
                • SQL Server 2016. Temporal Tables (Алексей Князев)
                • 1+1=10. Использование битовых масок в базах данных (Елена Смоляк)
                • SSAS Tabular 2016 (Евгений Полоничко)
                • Внутри оптимизатора запросов: Query Store (в 2-х частях) (Дмитрий Пилюгин)
                • PowerBI: Визуализация данных в реальном времени (Сергей Лунякин)
                • Анализ производительности Windows приложений на примере SQL Server с использованием стандартного функционала операционной системы (Михаил Комаров)
                Подробнее
              • SQL Server 2016 RC0

                • Tutorial


                На глаза попалась уже вторая новость на Хабре о том, что скоро Microsoft «подружит» SQL Server и Linux. Но ни слова не сказано про SQL Server 2016 Release Candidate, который стал доступен для загрузки буквально на днях.

                В следующем месяце планируется выпустить RTM, поэтому далее под катом разбор некоторых нововведений, которые будут доступны в рамках новой версии: отличия в установке, дефолтные трейс-флаги, новые функции и киллер-фича для анализа плана выполнения.
                Подробнее
              • История про хитрожо… индуса, encrypted procedures, DAC и «режим Бога»

                • Tutorial
                На той неделе пришлось разбираться в логике работы одного бесплатного тула. Почти детективная история вышла с ее автором, который впоследствии оказался индусом канадского происхождения проживающим в Южной Америке.

                Конечно же, практическая ценность была не в биографии автора, а в запросах, которые отправлялись приложением на сервер.

                Установил. Запустил. Стал в стоечку и начал собирать профайлером все, чем приложение должно было «порадовать» сервер. Смею разочаровать – ничего радостного сервер в ближайшие два часа не увидел. В основном встречались разного рода перлы в запросах, которые явно не претендовали на комплименты:

                SELECT
                    LogTruncations = (
                        SELECT TOP 1 SUM(cntr_value)
                        FROM ##tbl_cnt
                        WHERE counter_name = 'Log Truncations'
                    ),
                    LogShrinks = (
                        SELECT TOP 1 SUM(cntr_value)
                        FROM ##tbl_cnt
                        WHERE counter_name = 'Log Shrinks'
                    ),
                    LogGrowths = (
                        SELECT TOP 1 SUM(cntr_value)
                        FROM ##tbl_cnt
                        WHERE counter_name = 'Log Growths'
                    ),
                    ...
                

                Поскольку их можно написать на порядок проще и сократить логические чтения из таблицы:

                SELECT
                    LogTruncations = SUM(CASE WHEN counter_name = 'Log Truncations' THEN cntr_value END),
                    LogShrinks = SUM(CASE WHEN counter_name = 'Log Shrinks' THEN cntr_value END),
                    LogGrowths = SUM(CASE WHEN counter_name = 'Log Growths' THEN cntr_value END),
                    ...
                FROM ##tbl_cnt
                

                На этом можно было бы и закончить… Но практически под конец я увидел, что приложение вызывает пользовательские хранимые процедуры из tempdb. Поймал себя на мысли: «Когда приложение успело их создать… и главное зачем?»
                Подробнее
              • Что скрывает в себе DEFAULT TRACE?

                • Tutorial


                Часто вспоминается первая работа… Средненький офис, моник 943N и обогреватель Pentium D под ногами. Как возникал из ниоткуда Борис (нет… не Борис «Бритва») с линейкой в руках и настойчиво просил не делать «больно» серверу.

                Именно в те далекие времена я впервые познакомился с профайлером. Пользовательские трейсы оказались очень кстати при отладке приложений и поиске медленных запросов. Потом для себя я открыл DMV и XEvents… и профайлером стал пользоваться реже. Причина такого поступка проста – трейсы очень ресурсоемкие.

                Однако, данную функциональность не стоит преждевременно придавать анафеме. Начиная с 2005 версии при установке SQL Server по умолчанию создается легковесный системный трейс, который хранит в себе много полезной информации.
                Подробнее
                • +10
                • 12.5k
                • 2
              • AUTO_CLOSE

                • Tutorial
                Если бы SQL Server существовал во времена Инквизиции, то за включение некоторых опций на продакшен серверах нужно было бы наказывать калёным железом. Но если отбросить лирику, то далее на рассмотрим почему не нужно включать AUTO_CLOSE и к чему может привести использование этой опции.

                Собственно, как и любая интересная истории из жизни, все начиналось с рутиной задачи.

                На днях пришлось заглянуть в Error Log на тестовом сервере. На второй минуте ожидания, SSMS изрядно поплохело от обилия сообщений, которые хранил журнал, и я решил посмотреть сколько же весят логи с помощью xp_enumerrorlogs:

                DECLARE @t TABLE (lod_id INT PRIMARY KEY, last_log SMALLDATETIME, size INT)
                INSERT INTO @t
                EXEC sys.xp_enumerrorlogs
                
                SELECT lod_id, last_log, size_mb = size / 1048576.
                FROM @t
                

                lod_id   last_log              size_mb
                -------- --------------------- ---------------
                0        2016-01-05 08:46:00   567.05288505
                1        2015-12-31 12:53:00   1370.39249420
                2        2015-12-18 11:32:00   768.46394729
                3        2015-12-02 13:54:00   220.20050621
                4        2015-12-02 13:16:00   24.04152870
                5        2015-11-16 13:37:00   80.07946205
                6        2015-10-22 12:13:00   109.33527946
                
                Подробнее
              • Что быстрее: 0 или NULL?

                • Tutorial
                Есть три агрегатные функции, которые чаще всего используются на практике: COUNT, SUM и AVG.

                И если первая уже обсуждалась ранее, то с остальными есть интересные нюансы с производительностью. Но давайте обо всем по порядку…

                При использовании агрегатных функций на плане выполнения, в зависимости от входного потока, может встречаться два оператора: Stream Aggregate и Hash Match.

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

                В свою очередь, Hash Match является блокирующим оператором (за редким исключением) и не требует сортировки входного потока. Для работы Hash Match используется хеш-таблица, которая создается в памяти и в случае неправильной оценки ожидаемого количества строк, оператор может сливать результаты в tempdb.
                Подробнее
                • +19
                • 29k
                • 9
              • История про msdb размером в 42 Гб

                • Tutorial
                Недавно выдалась минутка посмотреть почему старый тестовый сервер безбожно тормозил… К нему я не имел никакого отношения, но меня одолевал спортивный интерес разобраться, что с ним не так.

                Первым делом открыл Resource Monitor и взглянул на общую нагрузку. Процесс sqlserv.exe нагружал ЦП под 100% и формировал большую дисковую очередь, которая была за 300… при том, что значение выше единицы уже считается проблемным.

                При анализе дисковой активности заметил непрерывные IO операции в msdb:

                D:\SQL_2012\SYSTEM\MSDBData.mdf
                D:\SQL_2012\SYSTEM\MSDBLog.ldf
                

                Посмотрел на размер msdb:

                SELECT name, size = size * 8. / 1024, space_used = FILEPROPERTY(name, 'SpaceUsed') * 8. / 1024
                FROM sys.database_files
                

                и включил режим «рука-лицо»:

                name         size           space_used
                ------------ -------------- ---------------
                MSDBData     42626.000000   42410.374395
                MSDBLog      459.125000     6.859375
                

                Файл данных занимал 42 Гб… Взяв небольшую паузу я начал разбираться в чем причина такого нездорового объема msdb и как побороть проблемы с производительностью сервера.
                Подробнее
              • XML, XQuery и тройная печаль с производительностью

                • Tutorial
                Поездка в Днепропетровск на встречу Dnepr SQL User Group, хронический недосып последние пару дней, но приятный бонус по приезду в Харьков… Зимняя погодка, которая мотивирует на написание чего-то интересного…

                Уже давно в планах было рассказать про «подводные камни» при работе с XML и XQuery, которые могут приводить к каверзным проблемам с производительностью.

                Для тех кто часто использует SQL Server, XQuery и любит парсить значения из XML рекомендуется ознакомиться с нижеследующим материалом…
                Подробнее
              • TOP (10) бесплатных плагинов для SSMS



                  До того, как начать работать с SQL Server я толком то и баз данных в лицо не видел… Помню, что мне установили SQL Server Management Studio 2005 и дали задание активно «крутить педали». По прошествии пары недель, как бы так сказать, моя производительность по написанию запросов была явно в районе плинтуса…

                  Более опытный коллега с недоумением на меня посмотрел и посоветовал поставить пару плагинов для SSMS… после этого работать стало явно веселее.

                  В данном посте я хочу поделиться моим топ списком бесплатных плагинов для SSMS, которыми чаще всего пользовался.
                  Подробнее
                • SQL Server 2016 CTP3.1 — что нового для разработчика?

                  • Tutorial
                  Еще недавно в моей памяти отложился анонс SQL Server 2016, которую лично презентовал Сатья Наделла. И вдруг, как снег на голову, стали одна за одной выходить свежие Community Technology Preview (на данный момент самая свежая версия – CTP3.1). По мере знакомства с новой версией, все больше хотелось поделиться впечатлениями…

                  Далее обзор новых синтаксических фишек SQL Server 2016: JSON, GZIP, DROP IF EXISTS, TRUNCATE TABLE по секциям, новые функции…

                  #1 – DROP IF EXISTS


                  CREATE TABLE dbo.tbl (
                      a INT, b INT,
                      CONSTRAINT ck CHECK (a > 1),
                      INDEX ix CLUSTERED (a)
                  )
                  

                  Если раньше перед удалением объекта приходилось делать проверку:

                  IF OBJECT_ID(N'dbo.tbl', 'U') IS NOT NULL
                      DROP TABLE dbo.tbl
                  

                  То сейчас появился более компактный синтаксис:

                  DROP TABLE IF EXISTS dbo.tbl
                  
                  Подробнее
                • COUNT(*)

                  • Tutorial


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

                  Давайте начнем с простого… Эти запросы отличаются чем-то друг от друга с точки зрения конечного результата?

                  SELECT COUNT(*) FROM Sales.SalesOrderDetail
                  SELECT COUNT_BIG(*) FROM Sales.SalesOrderDetail
                  
                  Подробнее