Как просмотреть историю запросов в SQL Server Management Studio. Ms sql история запросов


[ssms] Как просмотреть историю запросов в SQL Server Management Studio [logging] [sql-server]

[Поскольку этот вопрос , скорее всего, будет закрыт как дубликат.]

Если SQL Server не был перезапущен (и план не был выведен и т. Д.), Вы можете найти запрос в кеше плана.

SELECT t.[text] FROM sys.dm_exec_cached_plans AS p CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t WHERE t.[text] LIKE N'%something unique about your query%';

Если вы потеряли файл, потому что произошла сбой управления Studio, вы можете найти файлы восстановления здесь:

C:\Users\<you>\Documents\SQL Server Management Studio\Backup Files\

В противном случае вам нужно будет использовать что-то еще, чтобы помочь вам сохранить историю запросов, например, пакет SSMS Tools Pack, как упоминалось в ответе Эд Харпера, хотя он не является бесплатным в SQL Server 2012+. Или вы можете настроить небольшую трассировку, отфильтрованную по имени входа или имени хоста (но для этого используйте трассировку на стороне сервера, а не Profiler).

Как заметил @ Ненад-Живкович, было бы полезно присоединиться к sys.dm_exec_query_stats и заказать по last_execution_time :

SELECT t.[text], s.last_execution_time FROM sys.dm_exec_cached_plans AS p INNER JOIN sys.dm_exec_query_stats AS s ON p.plan_handle = s.plan_handle CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t WHERE t.[text] LIKE N'%something unique about your query%' ORDER BY s.last_execution_time DESC;

Как отмечали другие, вы можете использовать SQL Profiler, но вы также можете использовать его функциональность через хранимые процедуры sp_trace_ *. Например, этот фрагмент SQL будет (по крайней мере, на 2000, я думаю, что это то же самое для SQL 2008, но вам придется дважды проверять) catch RPC:Completed и SQL:BatchCompleted события для всех запросов, которые занимают более 10 секунд для запуска , и сохраните вывод в файле трассировки, который вы можете открыть в профилировщике SQL позднее:

DECLARE @TraceID INT DECLARE @ON BIT DECLARE @RetVal INT SET @ON = 1 exec @RetVal = sp_trace_create @TraceID OUTPUT, 2, N'Y:\TraceFile.trc' print 'This trace is Trace ID = ' + CAST(@TraceID AS NVARCHAR) print 'Return value = ' + CAST(@RetVal AS NVARCHAR) -- 10 = RPC:Completed exec sp_trace_setevent @TraceID, 10, 1, @ON -- Textdata exec sp_trace_setevent @TraceID, 10, 3, @ON -- DatabaseID exec sp_trace_setevent @TraceID, 10, 12, @ON -- SPID exec sp_trace_setevent @TraceID, 10, 13, @ON -- Duration exec sp_trace_setevent @TraceID, 10, 14, @ON -- StartTime exec sp_trace_setevent @TraceID, 10, 15, @ON -- EndTime -- 12 = SQL:BatchCompleted exec sp_trace_setevent @TraceID, 12, 1, @ON -- Textdata exec sp_trace_setevent @TraceID, 12, 3, @ON -- DatabaseID exec sp_trace_setevent @TraceID, 12, 12, @ON -- SPID exec sp_trace_setevent @TraceID, 12, 13, @ON -- Duration exec sp_trace_setevent @TraceID, 12, 14, @ON -- StartTime exec sp_trace_setevent @TraceID, 12, 15, @ON -- EndTime -- Filter for duration [column 13] greater than [operation 2] 10 seconds (= 10,000ms) declare @duration bigint set @duration = 10000 exec sp_trace_setfilter @TraceID, 13, 0, 2, @duration

Вы можете найти идентификатор для каждого события трассировки, столбцов и т. Д. Из Books Online; просто найдите sp_trace_create , sp_trace_setevent и sp_trace_setfiler sprocs. Затем вы можете контролировать трассировку следующим образом:

exec sp_trace_setstatus 15, 0 -- Stop the trace exec sp_trace_setstatus 15, 1 -- Start the trace exec sp_trace_setstatus 15, 2 -- Close the trace file and delete the trace settings

... где «15» - это идентификатор трассировки (как сообщается sp_trace_create, который выдает первый скрипт выше).

Вы можете проверить, какие трассировки работают:

select * from ::fn_trace_getinfo(default)

Единственное, что я скажу в осторожности - я не знаю, сколько нагрузки это наложит на вашу систему; он добавит некоторые, но насколько большой, что «некоторые», вероятно, зависят от того, насколько занят ваш сервер.

code-examples.net

Как просмотреть историю запросов в SQL Server Management Studio MS SQL Server

Сохранена ли история запросов в некоторых файлах журналов? Если да, можете ли вы сказать мне, как найти их местоположение? Если нет, можете ли вы дать мне какие-либо советы о том, как это увидеть?

[Поскольку этот вопрос , скорее всего, будет закрыт как дубликат.]

Если SQL Server не был перезапущен (и план не был выведен и т. Д.), Вы можете найти запрос в кеше плана.

SELECT t.[text] FROM sys.dm_exec_cached_plans AS p CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t WHERE t.[text] LIKE N'%something unique about your query%';

Если вы потеряли файл, потому что произошла сбой управления Studio, вы можете найти файлы восстановления здесь:

C:\Users\<you>\Documents\SQL Server Management Studio\Backup Files\

В противном случае вам нужно будет использовать что-то еще, чтобы помочь вам сохранить историю запросов, например, пакет SSMS Tools Pack, как упоминалось в ответе Эд Харпера, хотя он не является бесплатным в SQL Server 2012+. Или вы можете настроить небольшую трассировку, отфильтрованную по имени входа или имени хоста (но для этого используйте трассировку на стороне сервера, а не Profiler).

Как заметил @ Ненад-Живкович, было бы полезно присоединиться к sys.dm_exec_query_stats и заказать по last_execution_time :

SELECT t.[text], s.last_execution_time FROM sys.dm_exec_cached_plans AS p INNER JOIN sys.dm_exec_query_stats AS s ON p.plan_handle = s.plan_handle CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t WHERE t.[text] LIKE N'%something unique about your query%' ORDER BY s.last_execution_time DESC;

Поздно, но, надеюсь, полезно, поскольку он добавляет больше деталей …

Невозможно просмотреть запросы, выполненные в SSMS по умолчанию. Однако есть несколько вариантов.

Чтение журнала транзакций – это непростая вещь, потому что она в проприетарном формате. Однако, если вам нужно просмотреть запросы, которые были выполнены исторически (кроме SELECT), это единственный способ.

Для этого вы можете использовать сторонние инструменты, такие как ApexSQL Log и SQL Log Rescue (только для SQL 2000). Ознакомьтесь с этой веткой для получения дополнительной информации здесь. Проводник / анализатор транзакций SQL Server

Профайлер SQL Server – лучше всего подходит, если вы просто хотите начать аудит, и вас не интересует то, что произошло раньше. Убедитесь, что вы используете фильтры для выбора только необходимых транзакций. В противном случае вы получите очень много данных.

Трассировка SQL Server – лучше всего подходит, если вы хотите захватить все или большинство команд и сохранить их в файле трассировки, который может быть проанализирован позже.

Триггеры – лучше всего подходят, если вы хотите захватить DML (кроме select) и сохранить их где-нибудь в базе данных

(Бесплатный) пакет инструментов SSMS добавляет функциональность для записи истории выполнения, среди прочего.

Таким образом, система не записывает запросы. Если вы знаете, что хотите сделать это раньше времени, вы можете использовать SQL Profiler для записи того, что входит и отслеживать запросы во время работы Profiler.

Как отмечали другие, вы можете использовать SQL Profiler, но вы также можете использовать его функциональность через хранимые процедуры sp_trace_ *. Например, этот фрагмент SQL будет (по крайней мере, на 2000, я думаю, что это то же самое для SQL 2008, но вам придется дважды проверять) catch RPC:Completed и SQL:BatchCompleted события для всех запросов, которые занимают более 10 секунд для запуска , и сохраните вывод в файле трассировки, который вы можете открыть в профилировщике SQL позднее:

DECLARE @TraceID INT DECLARE @ON BIT DECLARE @RetVal INT SET @ON = 1 exec @RetVal = sp_trace_create @TraceID OUTPUT, 2, N'Y:\TraceFile.trc' print 'This trace is Trace ID = ' + CAST(@TraceID AS NVARCHAR) print 'Return value = ' + CAST(@RetVal AS NVARCHAR) -- 10 = RPC:Completed exec sp_trace_setevent @TraceID, 10, 1, @ON -- Textdata exec sp_trace_setevent @TraceID, 10, 3, @ON -- DatabaseID exec sp_trace_setevent @TraceID, 10, 12, @ON -- SPID exec sp_trace_setevent @TraceID, 10, 13, @ON -- Duration exec sp_trace_setevent @TraceID, 10, 14, @ON -- StartTime exec sp_trace_setevent @TraceID, 10, 15, @ON -- EndTime -- 12 = SQL:BatchCompleted exec sp_trace_setevent @TraceID, 12, 1, @ON -- Textdata exec sp_trace_setevent @TraceID, 12, 3, @ON -- DatabaseID exec sp_trace_setevent @TraceID, 12, 12, @ON -- SPID exec sp_trace_setevent @TraceID, 12, 13, @ON -- Duration exec sp_trace_setevent @TraceID, 12, 14, @ON -- StartTime exec sp_trace_setevent @TraceID, 12, 15, @ON -- EndTime -- Filter for duration [column 13] greater than [operation 2] 10 seconds (= 10,000ms) declare @duration bigint set @duration = 10000 exec sp_trace_setfilter @TraceID, 13, 0, 2, @duration

Вы можете найти идентификатор для каждого события трассировки, столбцов и т. Д. Из Books Online; просто найдите sp_trace_create , sp_trace_setevent и sp_trace_setfiler sprocs. Затем вы можете контролировать трассировку следующим образом:

exec sp_trace_setstatus 15, 0 -- Stop the trace exec sp_trace_setstatus 15, 1 -- Start the trace exec sp_trace_setstatus 15, 2 -- Close the trace file and delete the trace settings

… где «15» – это идентификатор трассировки (как сообщается sp_trace_create, который выдает первый скрипт выше).

Вы можете проверить, какие трассировки работают:

select * from ::fn_trace_getinfo(default)

Единственное, что я скажу в осторожности – я не знаю, сколько нагрузки это наложит на вашу систему; он добавит некоторые, но насколько большой, что «некоторые», вероятно, зависят от того, насколько занят ваш сервер.

Вы можете отслеживать SQL-запросы с помощью SQL Profiler, если вам это нужно

Я использую нижеследующий запрос для отслеживания активности приложения на SQL-сервере, у которого нет профилировщика трассировки. Метод использует Query Store (SQL Server 2016+) вместо DMV. Это дает лучшую возможность просматривать исторические данные, а также более быстрый поиск. Очень эффективно записывать короткие запросы, которые невозможно захватить sp_who / sp_whoisactive.

/* Adjust script to your needs. Run full script (F5) -> Interact with UI -> Run full script again (F5) Output will contain the queries completed in that timeframe. */ /* Requires Query Store to be enabled: ALTER DATABASE <db> SET QUERY_STORE = ON ALTER DATABASE <db> SET QUERY_STORE (OPERATION_MODE = READ_WRITE, MAX_STORAGE_SIZE_MB = 100000) */ USE <db> /* Select your DB */ IF OBJECT_ID('tempdb..#lastendtime') IS NULL SELECT GETUTCDATE() AS dt INTO #lastendtime ELSE IF NOT EXISTS (SELECT * FROM #lastendtime) INSERT INTO #lastendtime VALUES (GETUTCDATE()) ;WITH T AS ( SELECT DB_NAME() AS DBName , s.name + '.' + o.name AS ObjectName , qt.query_sql_text , rs.runtime_stats_id , p.query_id , p.plan_id , CAST(p.last_execution_time AS DATETIME) AS last_execution_time , CASE WHEN p.last_execution_time > #lastendtime.dt THEN 'X' ELSE '' END AS New , CAST(rs.last_duration / 1.0e6 AS DECIMAL(9,3)) last_duration_s , rs.count_executions , rs.last_rowcount , rs.last_logical_io_reads , rs.last_physical_io_reads , q.query_parameterization_type_desc FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY plan_id, runtime_stats_id ORDER BY runtime_stats_id DESC) AS recent_stats_in_current_priod FROM sys.query_store_runtime_stats ) AS rs INNER JOIN sys.query_store_runtime_stats_interval AS rsi ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id INNER JOIN sys.query_store_plan AS p ON p.plan_id = rs.plan_id INNER JOIN sys.query_store_query AS q ON q.query_id = p.query_id INNER JOIN sys.query_store_query_text AS qt ON qt.query_text_id = q.query_text_id LEFT OUTER JOIN sys.objects AS o ON o.object_id = q.object_id LEFT OUTER JOIN sys.schemas AS s ON s.schema_id = o.schema_id CROSS APPLY #lastendtime WHERE rsi.start_time <= GETUTCDATE() AND GETUTCDATE() < rsi.end_time AND recent_stats_in_current_priod = 1 /* Adjust your filters: */ -- AND (s.name IN ('<myschema>') OR s.name IS NULL) UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,dt,NULL,NULL,NULL,NULL,NULL,NULL, NULL FROM #lastendtime ) SELECT * FROM T WHERE T.query_sql_text IS NULL OR T.query_sql_text NOT LIKE '%#lastendtime%' -- do not show myself ORDER BY last_execution_time DESC TRUNCATE TABLE #lastendtime INSERT INTO #lastendtime VALUES (GETUTCDATE())

вы можете использовать «Автоматически генерировать сценарий при каждом сохранении», если вы используете студию управления. Это, конечно, не журнал. Проверьте, полезны ли вам ..;)

Если интересующие вас запросы – это динамические запросы, которые прерываются с перерывами, вы можете записывать SQL и datetime и пользователя в таблицу во время создания динамического оператора. Это будет сделано в каждом конкретном случае, хотя для этого требуется определенное программирование, и для этого требуется дополнительное время обработки, поэтому сделайте это только для тех немногих запросов, которые вас больше всего волнуют. Но наличие журнала выполняемых конкретных операторов может действительно помочь, когда вы пытаетесь выяснить, почему он терпит неудачу один раз в месяц. Динамические запросы трудно проверить, и иногда вы получаете одно конкретное входное значение, которое просто не будет работать, и выполнение этого ведения журнала в момент создания SQL часто является лучшим способом увидеть, что конкретно было в sql, который был построен.

sqlserver.bilee.com

История запросов ms sql

Вопрос: оптимизация работы запроса или проблемы с сервером

Добрый день, уважаемые форумчане помогите разобраться с проблемой.Может где-то туплю или не знаю, заранее извиняюсь может быть за глупые вопросы.Краткая предыстория:У меня есть таблица "Остатки клиентов", назовём её OPERClient, в ней есть поля Id - идентификатор записи acc - счет клиента dat - дата транзакции summ - остаток Каждый день в данную таблицу подгружаются данные из файла mdbМне нужно в одном из отчетов подсчитать за определенный промежуток времени средний остаток, чтобы найти среднее нужно сложить за каждый день остаток и разделить на количество дней в периоде.есть такой запрос, считающий остаток за каждый день. select r.ACC,c.dt,a.RESTRUB from ( select a.ACC,a.max(dat) maxd,a.min(dat) mind from OPERClient a group by a.ACC) r join CALENDAR c on c.dt between '20130101' and '20170310' cross apply (select MAX(dat) dt from OPERClient where ACC=r.ACC and dat<=c.dt ) dt join OPERClient a on a.dat=dt.dt and a.ACC=r.ACC Calendar - календарь с датами, почему первичная дата 20130101 - потому что история всех оборотов/остатков по счету ведется с той даты, а так как счет может "спать", соответственно оборот по счету "стоит на месте". Таким образом если мне нужны остатки по счетам с 01.03.2017 по 10.03.2017, то результатом запроса будут, остатки за каждый день из периода.Уже при накоплении больших объемов инфы, запрос стал выполняться достаточно долго.Вопрос 1. Как можно данный запрос оптимизировать?Вопрос 2. Заметил еще такой момент. В какое то время базу данных перенес на более свежий сервер, но на нем проявились тупняки в расчете, на старом сервере выполняется гораздо быстрее. Конфигурация обоих серверов:

"Старый"Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64) Feb 8 2013 10:37:00 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) Проц- Intel Xeon CPU 3.4 (Cores - 2, Logical Processor - 4)ОП - 4Gb

"Новый"Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64) Feb 8 2013 10:37:00 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) Проц - Intel Xeon CPU 3.4 (Cores - 4, Logical Processor - 8)ОП - 6 GB

На "новом" запрос выполняется более часа, затем беру делаю бэкап базы, восстанавливаю на "Старом", запускаю запрос- выполняется за 20 минут.Куда копать? Что исправить? Что можно оптимизировать?

forundex.ru

Язык запросов sql

Лекции. Язык запросов SQL. 17 часов.

    1. Введение в sql(0-0)

      1. Аннотация к лекции

Лекция представляет собой краткое введение в язык SQL.

Язык SQL является стандартным языком реляционных СУБД. Международная организация стандартизации (ISO) и Американский национальный институт стандартов (ANSI) уже более двадцати лет ведут работы по поддержанию стандарта этого языка, и практически все современные реляционные СУБД используют его в качестве языка интерфейса пользователей с базами данных.

Таким образом, знание SQL открывает путь к успешному освоению и использованию практически любой современной реляционной СУБД.

Цели лекции:

  • раскрыть значение и вклад языка SQLв развитие современных реляционных БД;

  • познакомить слушателя с историей развития языка SQL;

  • перечислить основные возможности языка SQL;

  • перечислить основные понятия языка SQL(ключевые слова, предложения, типы данных и т.д.).

      1. Краткая история развития sql

Первая публикация описания языка SQL относится к 1974 году, когда в исследовательской лаборатории компании IBM в штате Калифорния была разработана его первая версия, используемая в экспериментальной реляционной СУБД System/R. В то время язык назвали SEQUEL (Structured English Query Language — структурированный английский язык запросов). Затем язык был переименован в SQL. Исследовательский проект System/R был завершен в 1979 году. Он подтвердил возможность создания эффективных промышленных реляционных СУБД. [sql_andon].

В 1977 г. фирмой Oracleбалы выпущена промышленная реляционная СУБД с одноименным названием. С тех пор фирмаOracleявляется крупнейшим поставщиком реляционных СУБД на базе SQL.

Одновременно с этим в середине 70-х годов в исследовательской лаборатории Калифорнийского университета в Беркли был открыт проект по созданию экспериментальной реляционной СУБД, получившую название Ingress, на которой отрабатывались результаты научных исследований в области реляционных БД. Затем в 1981 г. была выпущена промышленная версия СУБД Ingres. Затем в 1986 г. СУБДIngresбыла переведена на SQL.

В 1980 году компания IBM на основании опыта, полученного при разработке экспериментальной System/R, приступила к созданию собственной промышленной СУБД реляционного типа, которая начала поставляться в 1982 году под названием SQL/DS. Затем в компании был разработан более совершенный продукт - DB2, поставки которого начались в 1985 году. Эта СУБД стала стратегическим программным продуктом компании IBM. [sql_andon]

К середине 80-х годов SQL уже общепризнан как язык реляционных СУБД, а его диалект, поддерживаемый СУБД DB2, фактически стал стандартом для управления реляционными базами данных. К этому времени реляционные базы данных господствовали среди СУБД других типов и считались основной технологией баз данных будущего.

К началу 80-х годов в связи с широким распространением реляционных СУБД появилась необходимость анализа возможной стандартизации языка для управления реляционными базами данных и разработки такого стандарта, если это будет признано целесообразным.

В с связи с широким распространением реляционных СУБД 1982 году американским национальным институтом стандартов (AmericanNationalStandardsInstitute—ANSI) был создан специальный комитет (X3h3), перед которым была поставлена задача разработки стандарта языка для управления реляционными базами данных. Учитывая широкую распространенность SQL в промышленных СУБД и тот факт, что он фактически уже стал стандартом к тому времени, комитет остановился на этом языке. Взяв за основу его диалект, реализованный в СУБД DB2, комитет постарался его обобщить, учитывая реализованные в других реляционных СУБД возможности. После четырех лет работы,

в 1986 году предложенный комитетом вариант SQL был официально утвержден как стандарт ANSI. В 1987 году он был принят в качестве стандарта Международной организацией стандартов (InternationalStandardsOrganization—ISO). Затем стандарт ANSI/ISO приняло правительство США как федеральный стандарт в области обработки информации (FederalInformationProcessingStandard— FIPS). В 1989 году стандарт был незначительно изменен и получил название SQL-89 (или SQL1). [sql_andon]

В 1992 году ANSI принял новый стандарт, который был назван SQL-92 (или SQL2). Далее комитет приступил к решительным изменениям в SQL, которые отразились в стандарте SQL-99 (или SQL3). Наконец, в 2003 году был опубликован последний стандарт — SQL-2003.

studfiles.net