SQL Server DBA
  • MeetUp «SQL Server Wait Stats или как найти место „где болит“»

    Возможно, я после НГ сделаю пост на Хабре или DOU по этой теме. Кроме того, после мероприятия сделаем рассылку с презентацией и скриптами.

  • MeetUp «SQL Server Wait Stats или как найти место „где болит“»

    Чтобы сделать встречу интереснее все желающие могут предварительно выполнить запрос на своих рабочих серверах и принести результаты. И тогда после основного материала мы сможем все вместе проанализировать статистику ожиданий и определить возможные проблемы.

    SELECT TOP(20) wait_type
                 , wait_time = CAST(wait_time_ms / 1000. AS DECIMAL(18,4))
                 , wait_resource = CAST((wait_time_ms - signal_wait_time_ms) / 1000. AS DECIMAL(18,4))
                 , wait_signal = CAST(signal_wait_time_ms / 1000. AS DECIMAL(18,4))
                 , wait_time_percent = CAST(100. * wait_time_ms / NULLIF(SUM(wait_time_ms) OVER (), 0) AS DECIMAL(18,2))
                 , waiting_tasks_count
                 , max_wait_time = CAST(max_wait_time_ms / 1000. AS DECIMAL(18,4))
                 , avg_wait = CAST(wait_time_ms / 1000. / waiting_tasks_count AS DECIMAL(18,4))
                 , avg_wait_resource = CAST((wait_time_ms - signal_wait_time_ms) / 1000. / waiting_tasks_count AS DECIMAL(18,4))
                 , avg_wait_signal = CAST(signal_wait_time_ms / 1000. / waiting_tasks_count AS DECIMAL(18,4))
    FROM sys.dm_os_wait_stats /* Azure: sys.dm_db_wait_stats */
    WHERE waiting_tasks_count > 0
        AND wait_time_ms > 0
        AND wait_type NOT IN (
            N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR',
            N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH',
            N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE',
            N'CHKPT', N'CLR_AUTO_EVENT',
            N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE',
            N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE',
            N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD',
            N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE',
            N'EXECSYNC', N'FSAGENT',
            N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
            N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
            N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE',
            N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE',
            N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP',
            N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE',
            N'PWAIT_ALL_COMPONENTS_INITIALIZED',
            N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
            N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
            N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
            N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH',
            N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP',
            N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY',
            N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP',
            N'SLEEP_SYSTEMTASK', N'SLEEP_TASK',
            N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT',
            N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
            N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
            N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS',
            N'WAITFOR', N'WAITFOR_TASKSHUTDOWN',
            N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
            N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN',
            N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT'
        )
    ORDER BY wait_time_ms DESC
    

    Единственное, что нужно помнить — статистика накапливается с момента старта сервера, поэтому чем дольше сервак работает — тем точнее будет диагноз ;)

  • Workshop «Как „правильно“ установить и настроить SQL Server»

    Хм. Странно, у меня на 8.1 взлетело норм. Зачем это нужно устанавливать? В принципе только для того чтобы поставить SSMS 2014 и некоторые «старые» компоненты сиквела. Если планируется устанавливать SQL Server 2014 без лишнего мусора — это и не понадобится. Написал исключительно из перестраховки (потому что часто 3.5 нужен).

  • Workshop «Как „правильно“ установить и настроить SQL Server»

    К слову, если вы планируете прийти со своим ноутом:

    Последную версию SSMS можно скачать тут.

    Чтобы скачать SQL Server нужно зарегистрироваться в программе Visual Studio Dev Essentials и там найти ISO образ:
    SQL Server 2014 Developer Edition with Service Pack 2 64-х битный

    Весь софт полностью бесплатный.

    Кроме того, если у Вас Windows 8 и выше, то еще нужно предварительно установить NET Framework 3.5:

  • Meet up «Типичные ошибки при написании запросов на T-Sql»

    До начала мероприятия осталось буквально пару дней. Буду рад, если все желающие смогут прийти и узнать что-то полезное для себя. Во всяком случае, примеры старался брать из жизни. По времени все займет примерно 2,5 часа, а после можем продолжить дискуссию среди всех желающих.

  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    Последней.... не максимальной. Вот принципиальная разница между тем что у меня написано и у Вас:

    DECLARE @t TABLE (
        BusinessEntityID INT,
        QuotaDate DATE,
        Value INT
    )
    INSERT INTO @t
    VALUES (1, '20160101', 123), (1, '20160202', 23)
    
    SELECT BusinessEntityID, Value
    FROM (
        SELECT *, rn = ROW_NUMBER() OVER (
                            PARTITION BY BusinessEntityID
                            ORDER BY QuotaDate DESC
                        )
        FROM @t
    ) t
    WHERE rn = 1
    
    SELECT BusinessEntityID, MAX(Value)
    FROM @t
    GROUP BY BusinessEntityID
    

    Если данных много, то ROW_NUMBER уже не такой выигрышный вариант и иногда подобный подход будет быстрее работать (опять же при условии правильных индексов):

    SELECT t2.BusinessEntityID, t2.[Value]
    FROM (
        SELECT BusinessEntityID, QuotaDate = MAX(QuotaDate)
        FROM @t
        GROUP BY BusinessEntityID
    ) t
    JOIN @t t2 ON t.BusinessEntityID = t2.BusinessEntityID
              AND t.QuotaDate = t2.QuotaDate
    
    Підтримав: Oleksandr Tsvirkun
  • Что может подстерегать новичков при работе с SQL Server. Часть 2

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

  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    Вам спасибо :) комменты весьма ценные

  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    На какой версии сиквела смотрите? И к слову Вы правы... я не совсем корректно выразился. Имею ввиду такую ситуацию:

    IF OBJECT_ID('tempdb.dbo.#tmp') IS NOT NULL
        DROP TABLE #tmp
    GO
    
    SELECT TOP 1000 name
    INTO #tmp
    FROM sys.columns
    
    DECLARE @a VARCHAR(10) = 'aa'
    SELECT COUNT(*)
    FROM #tmp
    WHERE name > @a
    
    Вы правда так считаете ?
    Если это не OLTP, то почему нет? Конечно, согласен, что прекрасному предела нет... да и к тому же зачем RECOMPILE использовать, когда уже появился TF 2453.
  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    1. Я не отрицал что параллельный план невозможен :) поэтому так аккуратно и написал. Где мы точно не получим параллельный план так это при вставке в табличную переменную — этого SQL Server сейчас не умеет (поправьте меня если я не прав, но подобного поведения я нигде еще не видел). В то же время для временных таблиц параллельную вставку он научился делать еще с 2014 RTM, а уже потом это все добавили и в 2012 версии начиная с 2012 SP1 CU10 и 2012 SP2 CU1.

    2. Ну скажем так... любое выражение где есть неравенство будет скатываться в 30% при оценке. Поэтому это общий случай, нежели проблема OPTION(RECOMPILE). Относительного того, пихать или нет RECOMPILE — это уже от ситуации зависит.

    3. А вот за TRUNCATE и область видимости спасибо. Действительно забыл это включить в примеры.

  • Что может подстерегать новичков при работе с SQL Server

    Это вы имели ввиду ссылку, которую Брент Озар когда-то зашарил? Если да, то там не вся база SO, а только её часть. Насколько я помню за несколько месяцев.

  • Что может подстерегать новичков при работе с SQL Server

    Промахнулся, когда отвечал. Извините.

  • Что может подстерегать новичков при работе с SQL Server

    StackOverflow — большой проект? Он к слову... крутится на SQL Server 2016.

    Підтримав: Vadym Romanenko
  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    Поддерживаю Ваше мнение, конечно же, проще все сделать через JOIN. Смысл был просто обратить внимание на проблему. Что делать так не нужно... а если и делать то потом не лепить бездумно TOP(1) чтобы заткнуть проблему.

    Підтримав: Василий Петрович
  • Что может подстерегать новичков при работе с SQL Server

    Ну вот зачем скатываться в негатив? Бывают разные проекты и задачи... например на текущем у меня OLTP система на 1 ядре и Express редакция с 12Гб базой активных данных. Свои приколы и заморочки... Пост был ориентирован на то, чтобы указать потенциальные ошибки для «проекта в вакууме»...

    Підтримав: Vadym Romanenko
  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    Вообще-то он для украинских девелоперов бесплатный. У самого халявная лицензия на SQL Complete + dbForge Studio. Все это в обмен на периодический фитбек с моей стороны. Вот линк — devart.com/ru/xchange/

    Підтримав: Dmytro Bardai
  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    А вот это Вы зря :))) в новой версии dbForge которая скоро должна выйти наконец-то переделали этот функционал. Чёрную тему добавили, много вкусняшек при анализе, когда идёт переоценка или недооценка ожидаемого количества строк. Раньше нужно было на каждый оператор смотреть, а теперь строки разукрашиваются и можно быстро увидеть где проблема.

  • Что может подстерегать новичков при работе с SQL Server. Часть 2

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

  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    План запроса с CTE будет явно громостким. Увы не могу поддержать Вашего мнения, что этот подход быстрее будет работать. Тут все очень зависит от размера данных.

    Хотя... Подобный подход, как Вы привели, когда-то использовал давным давно (посмотрите на самый последний пример... речь о нем): habrahabr.ru/post/200120/

  • Что может подстерегать новичков при работе с SQL Server. Часть 2

    Как бы мы тут про T-SQL ведем повествование... а где он, там и SSMS. Ну может dbForge Studio. Но никак PhpMyAdmin :)

← Сtrl 12345 Ctrl →