|
Помогите с SQL неблондинке)) | ☑ | ||
---|---|---|---|---|
0
Albaness
02.10.12
✎
06:55
|
Коллеги, нужна помощь.
Отчет подвисает сервер, сис админ выдал , где виснет.Программист по 1С сказал что со скулем не дружит, нужна помощь WITH merged_query_stats AS ( SELECT [sql_handle], statement_start_offset, statement_end_offset, plan_generation_num, [plan_handle], query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, creation_time, last_execution_time, execution_count, total_worker_time / 1000 AS total_worker_time_ms, min_worker_time / 1000 AS min_worker_time_ms, max_worker_time / 1000 AS max_worker_time_ms, total_physical_reads, min_physical_reads, max_physical_reads, total_logical_writes, min_logical_writes, max_logical_writes, total_logical_reads, min_logical_reads, max_logical_reads, total_clr_time, min_clr_time, max_clr_time, total_elapsed_time / 1000 AS total_elapsed_time_ms, min_elapsed_time / 1000 AS min_elapsed_time_ms, max_elapsed_time / 1000 AS max_elapsed_time_ms, total_elapsed_time / 1000 AS total_completed_execution_time_ms FROM sys.dm_exec_query_stats AS q -- To reduce the number of rows that we have to deal with in later queries, filter out any very old rows WHERE q.last_execution_time > DATEADD (hour, -4, GETDATE()) -- The UNIONed query below is a workaround for VSTS #91422, sys.dm_exec_query_stats does not reflect stats for in-progress queries. UNION ALL SELECT [sql_handle], statement_start_offset, statement_end_offset, NULL AS plan_generation_num, plan_handle, query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, start_time AS creation_time, start_time AS last_execution_time, 0 AS execution_count, cpu_time AS total_worker_time_ms, NULL AS min_worker_time_ms, -- min should not be influenced by in-progress queries cpu_time AS max_worker_time_ms, reads AS total_physical_reads, NULL AS min_physical_reads, -- min should not be influenced by in-progress queries reads AS max_physical_reads, writes AS total_logical_writes, NULL AS min_logical_writes, -- min should not be influenced by in-progress queries writes AS max_logical_writes, logical_reads AS total_logical_reads, NULL AS min_logical_reads, -- min should not be influenced by in-progress queries logical_reads AS max_logical_reads, NULL AS total_clr_time, -- CLR time is not available in dm_exec_requests NULL AS min_clr_time, -- CLR time is not available in dm_exec_requests NULL AS max_clr_time, -- CLR time is not available in dm_exec_requests total_elapsed_time AS total_elapsed_time_ms, NULL AS min_elapsed_time_ms, -- min should not be influenced by in-progress queries total_elapsed_time AS max_elapsed_time_ms, NULL AS total_completed_execution_time_ms FROM sys.dm_exec_requests AS r WHERE [sql_handle] IS NOT NULL -- Don't attempt to collect stats for very brief in-progress requests; the active statement -- will likely have changed by the time that we harvest query text, in the next query AND DATEDIFF (second, r.start_time, @current_collection_time) > 1 ) -- Insert the fingerprint stats into a temp table. SQL isn't always able to produce a good estimate of the amount of -- memory that the upcoming sorts (for ROW_NUMER()) will need because of lack of accurate stats on DMVs. Staging the -- data in a temp table allows the memory cost of the sort operations to be more accurate, which avoids unnecessary -- spilling to tempdb. SELECT fingerprint_stats.*, example_plan.sample_sql_handle, example_plan.sample_plan_handle, example_plan.sample_statement_start_offset, example_plan.sample_statement_end_offset INTO #temp_fingerprint_stats FROM -- Calculate plan fingerprint stats by grouping the query stats by plan fingerprint ( SELECT mqs.query_fingerprint, mqs.plan_fingerprint, -- The same plan could be returned by both dm_exec_query_stats and dm_exec_requests -- count distinct plan -- handles only COUNT(DISTINCT plan_handle) AS plan_count, MIN (mqs.creation_time) AS creation_time, MAX (mqs.last_execution_time) AS last_execution_time, SUM (mqs.execution_count) AS execution_count, SUM (mqs.total_worker_time_ms) AS total_worker_time_ms, MIN (mqs.min_worker_time_ms) AS min_worker_time_ms, MAX (mqs.max_worker_time_ms) AS max_worker_time_ms, SUM (mqs.total_physical_reads) AS total_physical_reads, MIN (mqs.min_physical_reads) AS min_physical_reads, MAX (mqs.max_physical_reads) AS max_physical_reads, SUM (mqs.total_logical_writes) AS total_logical_writes, MIN (mqs.min_logical_writes) AS min_logical_writes, MAX (mqs.max_logical_writes) AS max_logical_writes, SUM (mqs.total_logical_reads) AS total_logical_reads, MIN (mqs.min_logical_reads) AS min_logical_reads, MAX (mqs.max_logical_reads) AS max_logical_reads, SUM (mqs.total_clr_time) AS total_clr_time, MIN (mqs.min_clr_time) AS min_clr_time, MAX (mqs.max_clr_time) AS max_clr_time, SUM (mqs.total_elapsed_time_ms) AS total_elapsed_time_ms, MIN (mqs.min_elapsed_time_ms) AS min_elapsed_time_ms, MAX (mqs.max_elapsed_time_ms) AS max_elapsed_time_ms, SUM (mqs.total_completed_execution_time_ms) AS total_completed_execution_time_ms FROM merged_query_stats AS mqs GROUP BY mqs.query_fingerprint, mqs.plan_fingerprint ) AS fingerprint_stats INNER JOIN ( -- This query assigns a unique row identifier to each plan that has the same fingerprint -- we'll -- select each fingerprint's 'Plan #1' (the earliest example that's still in cache) to use as a sample plan -- for the fingerprint. Later (in the outer query's WHERE clause) we'll filter out all but the first plan, -- and use that one to get a valid sql_handle/plan_handle. SELECT *, ROW_NUMBER() OVER ( PARTITION BY plan_fingerprint ORDER BY creation_time ) AS plan_instance_number FROM ( SELECT query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, qs.[sql_handle] AS sample_sql_handle, qs.plan_handle AS sample_plan_handle, qs.statement_start_offset AS sample_statement_start_offset, qs.statement_end_offset AS sample_statement_end_offset, qs.creation_time FROM sys.dm_exec_query_stats AS qs -- To get a sample plan for in-progress queries, we need to look in dm_exec_requests, too UNION ALL SELECT query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, r.[sql_handle] AS sample_sql_handle, r.plan_handle AS sample_plan_handle, r.statement_start_offset AS sample_statement_start_offset, r.statement_end_offset AS sample_statement_end_offset, r.start_time AS creation_time FROM sys.dm_exec_requests AS r ) AS all_plans_numbered ) AS example_plan ON example_plan.query_fingerprint = fingerprint_stats.query_fingerprint AND example_plan.plan_fingerprint = fingerprint_stats.plan_fingerprint -- To improve perf of the next query, filter out plan fingerprints that aren't very interesting according to any of our -- perf metrics. Note that our most frequent allowed execution rate for this script is one execution every 15 seconds, -- so, for example, a plan that is executed 50 times in a 15+ second time interval will qualify for further processing. WHERE plan_instance_number = 1 AND (fingerprint_stats.total_worker_time_ms > 500 -- 500 ms cumulative CPU time OR fingerprint_stats.execution_count > 50 -- 50 executions OR fingerprint_stats.total_physical_reads > 50 -- 50 cumulative physical reads OR fingerprint_stats.total_logical_reads > 5000 -- 5,000 cumulative logical reads OR fingerprint_stats.total_logical_writes > 50 -- 50 cumulative logical writes OR fingerprint_stats.total_elapsed_time_ms > 5000) -- 5 seconds cumulative execution time -- SQL doesn't always have good stats on DMVs, and as a result it may select a loop join-based plan w/the -- sys.dm_exec_query_stats DMV as the inner table. The DMVs don't have indexes that would support efficient -- loop joins, and will commonly have a large enough number of rows that unindexed loop joins will be an -- unattractive option. Given this, we gain much better worst-case perf with minimal cost to best-case perf -- by prohibiting loop joins via this hint. OPTION (HASH JOIN, MERGE JOIN); -- Step 2: Rank the plan fingerprints by CPU use, execution count, etc and store the results in #am_fingerprint_stats_snapshots -- Now we have the stats for all plan fingerprints. Return only the top N by each of our perf metrics. -- The reason we need a derived table here is because SQL disallows the direct use of ROW_NUMBER() -- in a WHERE clause, yet we need to filter based on the row number (rank). |
|||
1
Albaness
02.10.12
✎
06:56
|
попытка 2
WITH merged_query_stats AS ( SELECT [sql_handle], statement_start_offset, statement_end_offset, plan_generation_num, [plan_handle], query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, creation_time, last_execution_time, execution_count, total_worker_time / 1000 AS total_worker_time_ms, min_worker_time / 1000 AS min_worker_time_ms, max_worker_time / 1000 AS max_worker_time_ms, total_physical_reads, min_physical_reads, max_physical_reads, total_logical_writes, min_logical_writes, max_logical_writes, total_logical_reads, min_logical_reads, max_logical_reads, total_clr_time, min_clr_time, max_clr_time, total_elapsed_time / 1000 AS total_elapsed_time_ms, min_elapsed_time / 1000 AS min_elapsed_time_ms, max_elapsed_time / 1000 AS max_elapsed_time_ms, total_elapsed_time / 1000 AS total_completed_execution_time_ms FROM sys.dm_exec_query_stats AS q -- To reduce the number of rows that we have to deal with in later queries, filter out any very old rows WHERE q.last_execution_time > DATEADD (hour, -4, GETDATE()) -- The UNIONed query below is a workaround for VSTS #91422, sys.dm_exec_query_stats does not reflect stats for in-progress queries. UNION ALL SELECT [sql_handle], statement_start_offset, statement_end_offset, NULL AS plan_generation_num, plan_handle, query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, start_time AS creation_time, start_time AS last_execution_time, 0 AS execution_count, cpu_time AS total_worker_time_ms, NULL AS min_worker_time_ms, -- min should not be influenced by in-progress queries cpu_time AS max_worker_time_ms, reads AS total_physical_reads, NULL AS min_physical_reads, -- min should not be influenced by in-progress queries reads AS max_physical_reads, writes AS total_logical_writes, NULL AS min_logical_writes, -- min should not be influenced by in-progress queries writes AS max_logical_writes, logical_reads AS total_logical_reads, NULL AS min_logical_reads, -- min should not be influenced by in-progress queries logical_reads AS max_logical_reads, NULL AS total_clr_time, -- CLR time is not available in dm_exec_requests NULL AS min_clr_time, -- CLR time is not available in dm_exec_requests NULL AS max_clr_time, -- CLR time is not available in dm_exec_requests total_elapsed_time AS total_elapsed_time_ms, NULL AS min_elapsed_time_ms, -- min should not be influenced by in-progress queries total_elapsed_time AS max_elapsed_time_ms, NULL AS total_completed_execution_time_ms FROM sys.dm_exec_requests AS r WHERE [sql_handle] IS NOT NULL -- Don't attempt to collect stats for very brief in-progress requests; the active statement -- will likely have changed by the time that we harvest query text, in the next query AND DATEDIFF (second, r.start_time, @current_collection_time) > 1 ) -- Insert the fingerprint stats into a temp table. SQL isn't always able to produce a good estimate of the amount of -- memory that the upcoming sorts (for ROW_NUMER()) will need because of lack of accurate stats on DMVs. Staging the -- data in a temp table allows the memory cost of the sort operations to be more accurate, which avoids unnecessary -- spilling to tempdb. SELECT fingerprint_stats.*, example_plan.sample_sql_handle, example_plan.sample_plan_handle, example_plan.sample_statement_start_offset, example_plan.sample_statement_end_offset INTO #temp_fingerprint_stats FROM -- Calculate plan fingerprint stats by grouping the query stats by plan fingerprint ( SELECT mqs.query_fingerprint, mqs.plan_fingerprint, -- The same plan could be returned by both dm_exec_query_stats and dm_exec_requests -- count distinct plan -- handles only COUNT(DISTINCT plan_handle) AS plan_count, MIN (mqs.creation_time) AS creation_time, MAX (mqs.last_execution_time) AS last_execution_time, SUM (mqs.execution_count) AS execution_count, SUM (mqs.total_worker_time_ms) AS total_worker_time_ms, MIN (mqs.min_worker_time_ms) AS min_worker_time_ms, MAX (mqs.max_worker_time_ms) AS max_worker_time_ms, SUM (mqs.total_physical_reads) AS total_physical_reads, MIN (mqs.min_physical_reads) AS min_physical_reads, MAX (mqs.max_physical_reads) AS max_physical_reads, SUM (mqs.total_logical_writes) AS total_logical_writes, MIN (mqs.min_logical_writes) AS min_logical_writes, MAX (mqs.max_logical_writes) AS max_logical_writes, SUM (mqs.total_logical_reads) AS total_logical_reads, MIN (mqs.min_logical_reads) AS min_logical_reads, MAX (mqs.max_logical_reads) AS max_logical_reads, SUM (mqs.total_clr_time) AS total_clr_time, MIN (mqs.min_clr_time) AS min_clr_time, MAX (mqs.max_clr_time) AS max_clr_time, SUM (mqs.total_elapsed_time_ms) AS total_elapsed_time_ms, MIN (mqs.min_elapsed_time_ms) AS min_elapsed_time_ms, MAX (mqs.max_elapsed_time_ms) AS max_elapsed_time_ms, SUM (mqs.total_completed_execution_time_ms) AS total_completed_execution_time_ms FROM merged_query_stats AS mqs GROUP BY mqs.query_fingerprint, mqs.plan_fingerprint ) AS fingerprint_stats INNER JOIN ( -- This query assigns a unique row identifier to each plan that has the same fingerprint -- we'll -- select each fingerprint's 'Plan #1' (the earliest example that's still in cache) to use as a sample plan -- for the fingerprint. Later (in the outer query's WHERE clause) we'll filter out all but the first plan, -- and use that one to get a valid sql_handle/plan_handle. SELECT *, ROW_NUMBER() OVER ( PARTITION BY plan_fingerprint ORDER BY creation_time ) AS plan_instance_number FROM ( SELECT query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, qs.[sql_handle] AS sample_sql_handle, qs.plan_handle AS sample_plan_handle, qs.statement_start_offset AS sample_statement_start_offset, qs.statement_end_offset AS sample_statement_end_offset, qs.creation_time FROM sys.dm_exec_query_stats AS qs -- To get a sample plan for in-progress queries, we need to look in dm_exec_requests, too UNION ALL SELECT query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, r.[sql_handle] AS sample_sql_handle, r.plan_handle AS sample_plan_handle, r.statement_start_offset AS sample_statement_start_offset, r.statement_end_offset AS sample_statement_end_offset, r.start_time AS creation_time FROM sys.dm_exec_requests AS r ) AS all_plans_numbered ) AS example_plan ON example_plan.query_fingerprint = fingerprint_stats.query_fingerprint AND example_plan.plan_fingerprint = fingerprint_stats.plan_fingerprint -- To improve perf of the next query, filter out plan fingerprints that aren't very interesting according to any of our -- perf metrics. Note that our most frequent allowed execution rate for this script is one execution every 15 seconds, -- so, for example, a plan that is executed 50 times in a 15+ second time interval will qualify for further processing. WHERE plan_instance_number = 1 AND (fingerprint_stats.total_worker_time_ms > 500 -- 500 ms cumulative CPU time OR fingerprint_stats.execution_count > 50 -- 50 executions OR fingerprint_stats.total_physical_reads > 50 -- 50 cumulative physical reads OR fingerprint_stats.total_logical_reads > 5000 -- 5,000 cumulative logical reads OR fingerprint_stats.total_logical_writes > 50 -- 50 cumulative logical writes OR fingerprint_stats.total_elapsed_time_ms > 5000) -- 5 seconds cumulative execution time -- SQL doesn't always have good stats on DMVs, and as a result it may select a loop join-based plan w/the -- sys.dm_exec_query_stats DMV as the inner table. The DMVs don't have indexes that would support efficient -- loop joins, and will commonly have a large enough number of rows that unindexed loop joins will be an -- unattractive option. Given this, we gain much better worst-case perf with minimal cost to best-case perf -- by prohibiting loop joins via this hint. OPTION (HASH JOIN, MERGE JOIN); -- Step 2: Rank the plan fingerprints by CPU use, execution count, etc and store the results in #am_fingerprint_stats_snapshots -- Now we have the stats for all plan fingerprints. Return only the top N by each of our perf metrics. -- The reason we need a derived table here is because SQL disallows the direct use of ROW_NUMBER() -- in a WHERE clause, yet we need to filter based on the row number (rank). |
|||
2
IamAlexy
02.10.12
✎
06:57
|
жесть...
когда у тебя в глобальнике 7ке ошибка будет тоже весь модуль кинешь текстом в сообщение? |
|||
3
Albaness
02.10.12
✎
06:57
|
что то не получается вставить красивенько (
|
|||
4
sda553
02.10.12
✎
07:01
|
возьмите программиста 1с который дружит со скулем. Тут работать надо. Так ничего не скажешь
|
|||
5
sda553
02.10.12
✎
07:02
|
вообще то этот запрос не имеет к 1с никакого отношения.
|
|||
6
sda553
02.10.12
✎
07:04
|
Судя по тексту, этот запрос вычисляет оптимальный план выполнения какого то другого запроса
|
|||
7
VladZ
02.10.12
✎
07:05
|
(0) Удаленно сложно будет. Совет могу дать: разбей запрос на простые подзапросы и оцени работу каждого простого подзапроса.
|
|||
8
VladZ
02.10.12
✎
07:06
|
+7 после того, как оценишь подзапросы - выполни целиком и посмотри план выполнения.
|
|||
9
VladZ
02.10.12
✎
07:07
|
Вроде два предложения сказал... А работы - на несколько часов.
|
|||
10
АНДР
02.10.12
✎
07:09
|
With само по себе не используется.
|
|||
11
упс
02.10.12
✎
07:30
|
(0) запрос выводит информацию о медленных запросах, выполнявшихся на сервере, к 1С отношения не имеет никакого. Судя по аглицким комментариям и отсутствию в гугле, он выдран либо с какого-то малопопулярного блога, либо, что более вероятно, используется какой-нибудь системой мониторинга за SQL Server (типа SQL Monitor, Spotlight и т.д.)
|
|||
12
Jofa
02.10.12
✎
07:34
|
Без Фотки не взлетит !
|
|||
13
Пеппи
02.10.12
✎
07:38
|
Да вообще не взлетит)
|
|||
14
dk
02.10.12
✎
07:47
|
админ тупо не тот запрос скинул, а мы тут ага сиди и разбирайся ))
|
|||
15
Albaness
02.10.12
✎
09:32
|
(14) тот
(11) ничего это не с блога, что дали, с тем и прошу помочь |
|||
16
mikecool
02.10.12
✎
09:36
|
(15) это обновление статистики, к 1с отношения не имеет, и походу админ протупил, настроив обновление в рабочее время
|
|||
17
dk
02.10.12
✎
09:36
|
(15) а теперь пусть скажет какой процесс этот запрос выполнял, да и вообще бред какой-то - игра в глухие телефоны
|
|||
18
mikecool
02.10.12
✎
09:37
|
+16 и каким боком ты у этого запроса?
|
|||
19
Dimasik2007
02.10.12
✎
10:15
|
(0) Мдя, пока такие одмины сюкюэль существуют, реальные специалисты будут в цене...
|
|||
20
упс
02.10.12
✎
10:50
|
(15) 1. я имел в виду, что приведённый фрагмент вряд ли написан вашими специалистами.
2. этот запрос к 1С отношения не имеет, 1С не использует CTE и не делает запросов к DMV (по крайней мере версии <= 8.2). Это какой-то служебный запрос, который отслеживает "медленные" запросы на сервере. AND (fingerprint_stats.total_worker_time_ms > 500 -- 500 ms cumulative CPU time OR fingerprint_stats.execution_count > 50 -- 50 executions OR fingerprint_stats.total_physical_reads > 50 -- 50 cumulative physical reads OR fingerprint_stats.total_logical_reads > 5000 -- 5,000 cumulative logical reads OR fingerprint_stats.total_logical_writes > 50 -- 50 cumulative logical writes OR fingerprint_stats.total_elapsed_time_ms > 5000) -- 5 seconds cumulative execution time Вот этот кусок выбирает те запросы, которые использовали суммарно более 500 миллисекунд процессорного времени, выполнялись больше 50 раз, совершили суммарно более 50 операций физ. чтения, более 5000 лог. чтения, более 50 операций записи, либо выполнялись, суммарно более 5 секунд. Всё же даже с комментариями, блин. А использующаяся, но не объявленная в тексте переменная @current_collection_time, как бэ намекает нам, что этот запрос является частью чего-то бОльшего, но к 1С отношения не имеющего. (16) нет там обновления статистики |
|||
21
Жан Пердежон
02.10.12
✎
12:49
|
(15) страшно представить, что за блондинки у вас там
|
|||
22
1Сергей
02.10.12
✎
12:54
|
хром дружелюбно предложил перевести на русский... Может это поможет неблодинке? :D
С merged_query_stats AS query_fingerprint, query_plan_hash AS plan_fingerprint, creation_time, last_execution_time, execution_count, total_worker_time / 1000 AS total_worker_time_ms, min_worker_time / 1000 AS min_worker_time_ms, max_worker_time / 1000 AS / 1000 AS total_elapsed_time_ms, min_elapsed_time / 1000 AS min_elapsed_time_ms, max_elapsed_time / 1000 AS max_elapsed_time_ms, total_elapsed_time / 1000 AS total_completed_execution_time_ms ОТ sys.dm_exec_query_stats AS Q - Чтобы уменьшить количество строк, которые мы имеем дело с более поздних запросов, фильтрует все очень старые строки , ГДЕ q.last_execution_time> DATEADD (час, -4, GETDATE ()) - объединяются запроса ниже обходной путь для VSTS # 91422, sys.dm_exec_query_stats не отражают статистику в ходе запросов. UNION ALL SELECT, [sql_handle ], statement_start_offset, statement_end_offset, NULL AS plan_generation_num, plan_handle, query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, start_time AS creation_time, start_time AS last_execution_time, 0 AS execution_count, cpu_time AS total_worker_time_ms, NULL AS min_worker_time_ms, - мин не должны влиять на- прогрессе запросы cpu_time AS max_worker_time_ms, гласит total_physical_reads, NULL AS min_physical_reads, - мин не должны зависеть от прогресса в запросах говорится max_physical_reads, пишет total_logical_writes, NULL AS min_logical_writes, - мин не должны зависеть от прогресса в запросах пишет max_logical_writes, logical_reads AS total_logical_reads, NULL AS min_logical_reads, - мин не должны зависеть от прогресса в запросах logical_reads AS max_logical_reads, NULL AS total_clr_time, - CLR время не доступен в dm_exec_requests NULL AS min_clr_time, - CLR время не доступны в dm_exec_requests NULL AS max_clr_time, - CLR время не доступен в dm_exec_requests total_elapsed_time AS total_elapsed_time_ms, NULL AS min_elapsed_time_ms, - мин не должны зависеть от прогресса в запросах total_elapsed_time AS max_elapsed_time_ms, NULL AS total_completed_execution_time_ms ОТ sys.dm_exec_requests как г WHERE [sql_handle] IS NOT NULL - не пытайтесь собирать статистику для очень краткого незавершенного запросов; активный оператор - скорее всего, изменилось к тому времени, жмем текст запроса, в следующем запросе и DATEDIFF (вторая , r.start_time, @ current_collection_time)> 1 ) - Вставьте отпечаткам пальцев статистики во временную таблицу. SQL не всегда в состоянии произвести хорошую оценку суммы - память о том, что предстоящий видов (для ROW_NUMER ()) необходимо из-за отсутствия точной статистики по DMV. Постановка - данные во временной таблице позволяет памятью стоимости операций сортировки, чтобы быть более точным, что позволяет избежать ненужного - разлив в # Temp_fingerprint_stats ОТ - Вычислить статистику план отпечатков пальцев с помощью группировки статистику запросов по плану отпечатков пальцев ( SELECT, mqs.query_fingerprint, mqs.plan_fingerprint, - тот же план может быть возвращен как dm_exec_query_stats и dm_exec_requests - подсчет различных плану - работает только с COUNT (DISTINCT plan_handle) AS plan_count, MIN (mqs.creation_time) AS creation_time, MAX (mqs.last_execution_time) AS last_execution_time, SUM (mqs.execution_count) AS execution_count, SUM (mqs.total_worker_time_ms) AS total_worker_time_ms, MIN (mqs.min_worker_time_ms) AS min_worker_time_ms, MAX (mqs.max_worker_time_ms) AS max_worker_time_ms, SUM (mqs.total_physical_reads) AS total_physical_reads, MIN (mqs.min_physical_reads) AS min_physical_reads, MAX (mqs.max_physical_reads) AS max_physical_reads, SUM (mqs.total_logical_writes) AS total_logical_writes, MIN (МКС . min_logical_writes) AS min_logical_writes, MAX (mqs.max_logical_writes) AS max_logical_writes, SUM (mqs.total_logical_reads) AS total_logical_reads, MIN (mqs.min_logical_reads) AS min_logical_reads, MAX (mqs.max_logical_reads) AS max_logical_reads, SUM (mqs.total_clr_time) AS total_clr_time , MIN (mqs.min_clr_time) AS min_clr_time, MAX (mqs.max_clr_time) AS max_clr_time, SUM (mqs.total_elapsed_time_ms) AS total_elapsed_time_ms, MIN (mqs.min_elapsed_time_ms) AS min_elapsed_time_ms, MAX (mqs.max_elapsed_time_ms) AS max_elapsed_time_ms, SUM (mqs. total_completed_execution_time_ms) AS total_completed_execution_time_ms ОТ merged_query_stats AS MQS GROUP BY mqs.query_fingerprint, mqs.plan_fingerprint ) AS fingerprint_stats INNER JOIN ( - Этот запрос присваивается уникальный идентификатор строки для каждого плана, который имеет тот же отпечатки пальцев - Мы - выбор каждого отпечатка пальца «План № 1" (самый ранний пример, что до сих пор в кэш-памяти) для использования в качестве образца плана - для отпечатков пальцев Позже (во внешнем запросе, где оговорка) мы отфильтровать все, кроме первого плана. - и использовать что, чтобы получить действительный sql_handle / plan_handle. ВЫБРАТЬ *, ROW_NUMBER () OVER ( PARTITION BY plan_fingerprint ORDER BY creation_time ) AS plan_instance_number ИЗ ( ВЫБРАТЬ query_hash AS query_fingerprint, query_plan_hash AS plan_fingerprint, QS. [sql_handle] AS sample_sql_handle, qs.plan_handle AS sample_plan_handle, qs.statement_start_offset AS sample_statement_start_offset, qs.statement_end_offset AS sample_statement_end_offset, qs.creation_time ОТ sys.dm_exec_query_stats AS QS - Чтобы получить образец план в ходе запросы, мы должны смотреть в dm_exec_requests тоже UNION ALL SELECT, query_hash AS query_fingerprint , query_plan_hash AS plan_fingerprint, г. [sql_handle] AS sample_sql_handle, r.plan_handle AS sample_plan_handle, r.statement_start_offset AS sample_statement_start_offset, r.statement_end_offset AS sample_statement_end_offset, r.start_time AS creation_time ОТ sys.dm_exec_requests AS г ) AS all_plans_numbered ) AS example_plan ON example_plan . query_fingerprint = fingerprint_stats.query_fingerprint И example_plan.plan_fingerprint = fingerprint_stats.plan_fingerprint - Для улучшения перфорация очередной запрос, отфильтровать план отпечатки пальцев, которые не очень интересны по любому из наших - перфорация показателей. Обратите внимание, что наши самые частые разрешено выполнение тариф для этого сценария является одной выполнение каждые 15 секунд, -. так, например, план, который выполняется 50 раз в 15 + второй раз интервал будет иметь право на дальнейшую обработку , ГДЕ plan_instance_number = 1 AND (fingerprint_stats.total_worker_time_ms> 500 - 500 мс общее время процессора ИЛИ fingerprint_stats.execution_count> 50 - 50 казней ИЛИ fingerprint_stats.total_physical_reads> 50 - 50 кумулятивных физического чтения или fingerprint_stats.total_logical_reads> 5000 - 5000 кумулятивных логических операций чтения или fingerprint_stats. total_logical_writes> 50 - 50 кумулятивных пишет логического ИЛИ fingerprint_stats.total_elapsed_time_ms> 5000) - 5 секунд, общее время выполнения - SQL не всегда имеют хорошую статистику по DMVs, и в результате он может выбрать цикла соединения на основе плана W / - sys.dm_exec_query_stats DMV как внутренней таблице. DMVs не имеют индексов, которые будут поддерживать эффективный - петля присоединяется, и как правило, имеют достаточно большое количество строк, которые не проиндексированные циклами будет - непривлекательная вариант. Учитывая это, мы получаем гораздо лучше наихудшего перфорация с минимальными затратами лучшем случае перфорация - посредством запрещения цикл присоединяется через этот намек. OPTION (HASH JOIN, MERGE JOIN); - Шаг 2: Rank план отпечатки пальцев с использованием процессора , оформление счета, и т.д., и сохранить результаты в # am_fingerprint_stats_snapshots - Теперь у нас есть статистика для всех план отпечатки пальцев. Вернуться только верхнюю N каждым из наших перфорация метрик. - Причина мы должны производной таблицы здесь, потому что SQL запрещает прямое использование ROW_NUMBER () - в ИНЕКЕ, но нам нужно фильтр, основанный на номер строки (ранг). |
|||
23
1Сергей
02.10.12
✎
12:56
|
Кстати. Это по-ходу BioTime
|
|||
24
toypaul
гуру
02.10.12
✎
12:57
|
админа уволить
|
|||
25
toypaul
гуру
02.10.12
✎
12:57
|
программиста 1С тоже уволить
|
|||
26
VladZ
02.10.12
✎
12:58
|
SQL снести...
|
|||
27
VladZ
02.10.12
✎
12:58
|
Албанцу поставить шест и включить приятную музыку...
|
|||
28
Deon
02.10.12
✎
12:59
|
Раздать счеты?
|
|||
29
toypaul
гуру
02.10.12
✎
12:59
|
||||
30
1Сергей
02.10.12
✎
13:00
|
Зачем счёты? посадить вахтёршу с журналом и всё
|
|||
31
toypaul
гуру
02.10.12
✎
13:01
|
так. про sql 2012. короче таблица эта системная. к 1С если имеет отношение, то весьма косвенное.
|
|||
32
1Сергей
02.10.12
✎
13:01
|
Кстати, с вахтёршей договориться легче, чем с бездушной програмой
|
|||
33
1Сергей
02.10.12
✎
13:02
|
Аутор про 1С ничего не говорила
|
|||
34
VladZ
02.10.12
✎
13:02
|
(28) Разноцветные «пампушки».
|
|||
35
Sj
02.10.12
✎
13:08
|
(0) а что за отчет?
|
|||
36
Лефмихалыч
02.10.12
✎
13:12
|
(0) блондинка, открой для себя http://pastebin.com/ для перекидывания простынями текста. А еще намотай этот запрос на кол админу, а сюда пости запрос 1С, от выполнения которого у сервера висюн приключается. Если запрос 1С такой же длинный, юзай сервисы типа пастебина
|
|||
37
SleepWalker
11.10.12
✎
10:38
|
(7) + 1
Это самый простой и надежный способ решить проблему. Любую сложную задачу можно разбить на несколько простых. Так и здесь. |
|||
38
Sereja
11.10.12
✎
10:52
|
Я понимаю что все хотят всех уволить, но какой должен быть реальный порядок действий, что б зная узкое место на SQL, найти этот фрагмент кода в 1с. (Не зависимо от версии) ?
|
|||
39
ЧеловекДуши
11.10.12
✎
11:00
|
(38)Уволить автора (0), пригласить реального спеца...
Либо автору топика нужно срочно постичь премудрости Select -а :) |
|||
40
ЧеловекДуши
11.10.12
✎
11:01
|
+(38)Причем тут версия?
Попросту еще непонятно откуда вообще выдернули сам запрос? Из какой программы? ... В общем телепат отдыхает :) |
|||
41
Xapac_2
11.10.12
✎
11:13
|
ЦУП курите.
|
|||
42
Sereja
11.10.12
✎
11:17
|
(39) Я не про левый запрос в (0). Я про то, что допустим у тебя есть запрос SQL, который тормозной. Тебе надо найти, это место в 1с. как быть ?
|
|||
43
Жан Пердежон
12.10.12
✎
10:40
|
(42) ответ в (41)
|
|||
44
Sereja
12.10.12
✎
10:46
|
(43) а если 7.7 ?
|
|||
45
Snorkler
12.10.12
✎
10:51
|
(0) Админ, по ходу, тоже присутствовал при казусе в бассейне и теперь плохо соображает… :0)
|
|||
46
vie_za
12.10.12
✎
10:56
|
посмотрел время (0) - 7 утра.
сакуру к серверу наручником пристегнули? |
|||
47
PLUT
12.10.12
✎
10:57
|
(46) Ижевск и Казань - это блеать ДВА разных города! и даже не по пути!
|
|||
48
Жан Пердежон
12.10.12
✎
11:29
|
(46) сакуру?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |