Database
 sql >> база данни >  >> RDS >> Database

Оттеглени функции, които да извадите от кутията си с инструменти – част 1

Microsoft няма навика да отрича нещата в наши дни, но когато го правят, това е с причина – и със сигурност не е, защото искат да направят живота ви по-труден. Напротив, почти винаги е така, защото са разработили по-добри и по-модерни начини за решаване на същите проблеми.

Но навиците са трудни за преодоляване; питай ме откъде знам. Твърде често виждам хора, които се придържат към по-стар начин за изпълнение на някаква задача, въпреки че съществува по-добър начин.

Бих искал да споделя няколко скорошни примера, които помагат да се илюстрира как използването на оттеглените функции на SQL Server продължава да ни дразни. В тази първа част искам да говоря за...

системни процеси

Системната таблица sys.sysprocesses беше заменен още в SQL Server 2005 от набор от динамични изгледи за управление (DMV), най-вече sys.dm_exec_requests , sys.dm_exec_sessions и sys.dm_exec_connections . Официалната документация за sys.sysprocesses предупреждава:

Тази системна таблица на SQL Server 2000 е включена като изглед за обратна съвместимост. Препоръчваме ви вместо това да използвате текущите системни изгледи на SQL Server. За да намерите еквивалентния системен изглед или изгледи, вижте Съпоставяне на системни таблици към системни изгледи (Transact-SQL). Тази функция ще бъде премахната в бъдеща версия на Microsoft SQL Server. Избягвайте да използвате тази функция в нови разработки и планирайте да модифицирате приложения, които в момента използват тази функция.

Скошен пример

Наскоро един от нашите екипи разследваше проблем със забавянето на четеца на регистрационни файлове. Ние обръщаме много внимание на латентността тук, заедно с всички дългосрочни транзакции, поради въздействието надолу по веригата върху технологиите, които използват четеца на журнали – като групи за наличност и репликация на транзакции. Първите ни предупреждения обикновено се забелязват на табло за управление, което изобразява латентността на четеца на регистрационни файлове спрямо продължителността на транзакцията (ще обясня моментите във времето, които отбелязах с t0 и t1 накратко):

Те определиха, да кажем в момент t0 , че определена сесия е имала отворена транзакция, блокираща процеса на четене на регистрационни файлове. Те първо провериха изхода на DBCC INPUTBUFFER , за да се опита да определи какво е направила тази сесия за последно, но резултатите просто показват, че те са издали и други партиди по време на транзакцията си:

event_type       parameters   event_info
--------------   ----------   ---------------
Language Event   0            SET ROWCOUNT 0;

Обърнете внимание, че DBCC INPUTBUFFER също има по-способен заместител в съвременните версии:sys.dm_exec_input_buffer . И въпреки че няма изрично предупреждение за оттегляне, официалната документация за DBCC командата има това нежно побутване:

Започвайки с SQL Server 2014 (12.x) SP2, използвайте sys.dm_exec_input_buffer, за да върнете информация за изрази, изпратени на екземпляр на SQL Server.

След като не получиха нищо от входния буфер, те поискаха sys.sysprocesses :

SELECT 
  spid, 
  [status], 
  open_tran, 
  waittime, 
  [cpu], 
  physical_io, 
  memusage, 
  last_batch
FROM sys.sysprocesses 
WHERE spid = 107;

Резултатите бяха също толкова безполезни, поне по отношение на определянето на това какво е правила сесията, за да запази транзакцията им отворена и да наруши четеца на регистрационни файлове:

Откроявам physical_io колона, защото тази стойност предизвика дискусия за това дали искат да рискуват да убият спящата сесия. Мисленето беше, че в случай че всички тези физически I/O са записани, убиването на транзакцията може да доведе до продължително и разрушително връщане назад – потенциално да влоши проблема. Няма да поставям реални времена за това, но нека просто кажем, че това се превърна в продължителен разговор и остави системата в това състояние от време t0 до време t1 на графиката по-горе.

Защо това е проблем

Проблемът в този конкретен случай е, че те са прекарали това време в обмисляне на решение, основано на непълна информация. Това I/Os чете или пише? Ако потребителят има отворена транзакция и просто е прочел много данни, има много по-малко въздействие от връщането на тази транзакция назад, отколкото ако те са променени много данни. Така че вместо sys.sysprocesses , нека видим какво е по-модерното DMV, sys.dm_exec_sessions , може да ни покаже за тази сесия:

SELECT 
  session_id, 
  [status], 
  open_transaction_count, 
  cpu_time, 
  [reads], 
  writes, 
  logical_reads, 
  last_request_start_time,
  last_request_end_time
FROM sys.dm_exec_sessions 
WHERE session_id = 107;

Резултати:

Тук виждаме, че sys.dm_exec_sessions разделя физическия I/O отделно на четене и запис. Това ни позволява да вземем много по-информирано решение, много по-бързо от t1 - t0 , относно потенциалното въздействие на връщане назад. Ако входно/изходното е записано и в зависимост от това колко високо е числото, може да се поколебаем още малко и може би да прекараме времето си в опити да намерим потребителя (за да можем да му ударим кокалчетата или да ги попитаме защо имат отворена транзакция ). Ако знаем, че е предимно четене, вместо това можем да се наклоним към прекратяване на сесията и принудително връщане на транзакцията.

Разбира се, sys.sysprocesses има dbid и waittime . Но dbid така или иначе е ненадежден и незначително полезен, особено за запитвания за кръстосани бази данни; има много по-добра информация в sys.dm_tran_locks . Информация за чакане (време и последно изчакване) може да се намери в sys.dm_exec_requests , но много по-подробна информация се предлага в sys.dm_exec_session_wait_stats (добавено в SQL Server 2016). Извинение, което чух много, беше, че sys.dm_exec_sessions липсваше open_tran , но open_transaction_count беше добавен обратно в SQL Server 2012. Така че има много малка причина дори да мислим за използването на sys.sysprocesses днес.

Ако искате да разберете колко често sys.sysprocesses е посочен от последното рестартиране на SQL Server, можете да изпълните тази заявка срещу броячите на производителността DMV:

SELECT instance_name, cntr_value
  FROM sys.dm_os_performance_counters
  WHERE [object_name] LIKE N'%:Deprecated Features%'
    AND instance_name = N'sysprocesses' 
  ORDER BY cntr_value DESC;

Ако наистина искате да избегнете сън тази вечер или просто обичате непрекъснато да добавяте към списъка с неща, за които се тревожите, премахнете предиката срещу instance_name . Това ще ви даде страшна представа на високо ниво за това колко неща работят вашите екземпляри, които в крайна сметка ще трябва да промените.

Междувременно изтеглете sp_WhoIsActive , изключително полезна съхранена процедура на Адам Мачаник за наблюдение и отстраняване на неизправности в процесите на SQL Server в реално време. Разположихме тази съхранена процедура във всеки екземпляр в нашата среда и вие също трябва, независимо какви други инструменти за наблюдение от висок клас също може да използвате.

Следващия път

В част 2 ще говоря малко за SQL Server Profiler, приложение, което хората използват повече поради познаване, отколкото нещо друго – без да осъзнават колко опасно може да бъде.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL UNION Клауза за начинаещи

  2. SQL MAX() за начинаещи

  3. SQL АКТУАЛИЗАЦИЯ за начинаещи

  4. Копаене по-дълбоко в миграциите на Django

  5. Измерване на производителността на базата данни под напрежение