• Напильник и щепотка фантазии… или как слепить Enterprise из SQL Server Express Edition

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

      Нажмешь дизлайк и сказке конец – ты закроешь вкладку и продолжишь бесцельно бродить по рекомендациям Хабра и YouTube.

      Захочешь продолжить и войдешь в страну чудес – я покажу тебе насколько глубока… невозможная… кроличья нора успешной разработки на SQL Server Express Edition.

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

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

        SQL Index Manager

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

          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 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
                  • 13.5k
                  • 4
                • 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
                  • 29.7k
                  • 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
                    
                    Подробнее