Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Genniy
Member

Откуда:
Сообщений: 141
SomewhereSomehow
Genniy,

Ответ, что не хватает памяти вас не устроил?

И тип ожидания PAGEIOLATCH_SH и разное время выполнения при одинаковых планах и параметрах - все это с очень большой долей вероятности говорит о том, что памяти не хватает (попали в кэш - быстро, нет данных в кэше - медленно).

Объем требуемой памяти зависит от размера баз данных и характера работы с ними, об этом вы не говорили, но 14 ГБ для типичной современной продакшн системы - это, как правило, очень мало.
Вот например, Пол Рэндал собирал статистику
+
Картинка с другого сайта.

Менее 16 ГБ сейчас только примерно у 2%.

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


Спасибо огромное! Да действительно больше врего это проблема именно с памятью. Необходимо только дать доказательства для этого.
Как бы это можно сделать? Т.е. получить некие выборки для подтверждения информации. Я прекрасно понимаю по поводу вытеснения запросов и т.п. Просто пока не могу сделать соответствующие выборки.
19 май 15, 12:26    [17660479]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Genniy
Member

Откуда:
Сообщений: 141
Glory
Genniy
пропущено...


Нет. Не откюлючены. Просто при анализе попадал на ту ситуацию, когда запрос отрабатывал с промахом по статистике. Пересобрал статистику и все заработало. После этого поставил на постоянку.

Т.е. у вас и для базы задано автоматическое обновление статистики, и еще вы это же по расписанию делаете ?


Да. Спасибо. Сейчас отключу автоматический сбор
19 май 15, 12:28    [17660496]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Genniy
Member

Откуда:
Сообщений: 141
MasterZiv,
Планы хорошие. Здесь именно с железом. Спасибо! Сейчас пособираю инфомрацию по поводу памяти
19 май 15, 12:30    [17660501]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Genniy
MasterZiv,
Планы хорошие. Здесь именно с железом. Спасибо! Сейчас пособираю инфомрацию по поводу памяти


Там должен быть счётчик такой -- процент попадания в кэш данных.
19 май 15, 12:39    [17660572]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Genniy
Как бы это можно сделать? Т.е. получить некие выборки для подтверждения информации. Я прекрасно понимаю по поводу вытеснения запросов и т.п. Просто пока не могу сделать соответствующие выборки.

Вы первое мое сообщение пропустили? Там вроде все есть.

Вот, например, запросы к DMV:
+ SQL Server Diagnostic Information Queries for April 2015 by Glenn Berry

http://www.sqlskills.com/blogs/glenn/sql-server-diagnostic-information-queries-for-april-2015/
-- Hardware information from SQL Server 2014  (Query 10) (Hardware Info)
-- (Cannot distinguish between HT and multi-core)
SELECT cpu_count AS [Logical CPU Count], scheduler_count, hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count], 
physical_memory_kb/1024 AS [Physical Memory (MB)], committed_kb/1024 AS [Committed Memory (MB)],
committed_target_kb/1024 AS [Committed Target Memory (MB)],
max_workers_count AS [Max Workers Count], affinity_type_desc AS [Affinity Type], 
sqlserver_start_time AS [SQL Server Start Time], virtual_machine_type_desc AS [Virtual Machine Type]
FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE);

-- Gives you some good basic hardware information about your database server
-- Note: virtual_machine_type_desc of HYPERVISOR does not automatically mean you are running SQL Server inside of a VM
-- It merely indicates that you have a hypervisor running on your host

----------------------------------------------------------------------------------------------------------------------------
-- Get total buffer usage by database for current instance  (Query 33) (Total Buffer Usage by Database)
-- This make take some time to run on a busy instance
WITH AggregateBufferPoolUsage
AS
(SELECT DB_NAME(database_id) AS [Database Name],
CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2))  AS [CachedSize]
FROM sys.dm_os_buffer_descriptors WITH (NOLOCK)
WHERE database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id))
SELECT ROW_NUMBER() OVER(ORDER BY CachedSize DESC) AS [Buffer Pool Rank], [Database Name], CachedSize AS [Cached Size (MB)],
       CAST(CachedSize / SUM(CachedSize) OVER() * 100.0 AS DECIMAL(5,2)) AS [Buffer Pool Percent]
FROM AggregateBufferPoolUsage
ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE);

-- Tells you how much memory (in the buffer pool) 
-- is being used by each database on the instance

----------------------------------------------------------------------------------------------------------------------------
-- Good basic information about OS memory amounts and state  (Query 41) (System Memory)
SELECT total_physical_memory_kb/1024 AS [Physical Memory (MB)], 
       available_physical_memory_kb/1024 AS [Available Memory (MB)], 
       total_page_file_kb/1024 AS [Total Page File (MB)], 
	   available_page_file_kb/1024 AS [Available Page File (MB)], 
	   system_cache_kb/1024 AS [System Cache (MB)],
       system_memory_state_desc AS [System Memory State]
FROM sys.dm_os_sys_memory WITH (NOLOCK) OPTION (RECOMPILE);

-- You want to see "Available physical memory is high"
-- This indicates that you are not under external memory pressure

----------------------------------------------------------------------------------------------------------------------------
-- SQL Server Process Address space info  (Query 42) (Process Memory)
-- (shows whether locked pages is enabled, among other things)
SELECT physical_memory_in_use_kb/1024 AS [SQL Server Memory Usage (MB)],
       large_page_allocations_kb, locked_page_allocations_kb, page_fault_count, 
	   memory_utilization_percentage, available_commit_limit_kb, 
	   process_physical_memory_low, process_virtual_memory_low
FROM sys.dm_os_process_memory WITH (NOLOCK) OPTION (RECOMPILE);

-- You want to see 0 for process_physical_memory_low
-- You want to see 0 for process_virtual_memory_low
-- This indicates that you are not under internal memory pressure

----------------------------------------------------------------------------------------------------------------------------
-- Page Life Expectancy (PLE) value for each NUMA node in current instance  (Query 43) (PLE by NUMA Node)
SELECT @@SERVERNAME AS [Server Name], [object_name], instance_name, cntr_value AS [Page Life Expectancy]
FROM sys.dm_os_performance_counters WITH (NOLOCK)
WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances
AND counter_name = N'Page life expectancy' OPTION (RECOMPILE);

-- PLE is a good measurement of memory pressure.
-- Higher PLE is better. Watch the trend over time, not the absolute value.
-- This will only return one row for non-NUMA systems.

----------------------------------------------------------------------------------------------------------------------------
-- Memory Grants Pending value for current instance  (Query 44) (Memory Grants Pending)
SELECT @@SERVERNAME AS [Server Name], [object_name], cntr_value AS [Memory Grants Pending]                                                                                                       
FROM sys.dm_os_performance_counters WITH (NOLOCK)
WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances
AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE);

-- Memory Grants Pending above zero for a sustained period is a very strong indicator of memory pressure

----------------------------------------------------------------------------------------------------------------------------
-- Memory Clerk Usage for instance  (Query 45) (Memory Clerk Usage)
-- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans)
SELECT TOP(10) mc.[type] AS [Memory Clerk Type], 
       CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] 
FROM sys.dm_os_memory_clerks AS mc WITH (NOLOCK)
GROUP BY mc.[type]  
ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE);

-- MEMORYCLERK_SQLBUFFERPOOL was new for SQL Server 2012. It should be your highest consumer of memory

-- CACHESTORE_SQLCP  SQL Plans         
-- These are cached SQL statements or batches that aren't in stored procedures, functions and triggers
-- Watch out for high values for CACHESTORE_SQLCP

-- CACHESTORE_OBJCP  Object Plans      
-- These are compiled plans for stored procedures, functions and triggers

Также поставьте Perfmon на сбор, например, таких вот счетчиков
Memory: Available Mbytes
SQL Server:Buffer Manager Page life expectancy

Далее придется изучать, как интерпретировать результаты, тут уж гугл в помощь, все разжевано довольно подробно.
19 май 15, 12:40    [17660578]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Genniy
Member

Откуда:
Сообщений: 141
SomewhereSomehow
Genniy
Как бы это можно сделать? Т.е. получить некие выборки для подтверждения информации. Я прекрасно понимаю по поводу вытеснения запросов и т.п. Просто пока не могу сделать соответствующие выборки.

Вы первое мое сообщение пропустили? Там вроде все есть.

Вот, например, запросы к DMV:
+ SQL Server Diagnostic Information Queries for April 2015 by Glenn Berry

http://www.sqlskills.com/blogs/glenn/sql-server-diagnostic-information-queries-for-april-2015/
-- Hardware information from SQL Server 2014  (Query 10) (Hardware Info)
-- (Cannot distinguish between HT and multi-core)
SELECT cpu_count AS [Logical CPU Count], scheduler_count, hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count], 
physical_memory_kb/1024 AS [Physical Memory (MB)], committed_kb/1024 AS [Committed Memory (MB)],
committed_target_kb/1024 AS [Committed Target Memory (MB)],
max_workers_count AS [Max Workers Count], affinity_type_desc AS [Affinity Type], 
sqlserver_start_time AS [SQL Server Start Time], virtual_machine_type_desc AS [Virtual Machine Type]
FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE);

-- Gives you some good basic hardware information about your database server
-- Note: virtual_machine_type_desc of HYPERVISOR does not automatically mean you are running SQL Server inside of a VM
-- It merely indicates that you have a hypervisor running on your host

----------------------------------------------------------------------------------------------------------------------------
-- Get total buffer usage by database for current instance  (Query 33) (Total Buffer Usage by Database)
-- This make take some time to run on a busy instance
WITH AggregateBufferPoolUsage
AS
(SELECT DB_NAME(database_id) AS [Database Name],
CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2))  AS [CachedSize]
FROM sys.dm_os_buffer_descriptors WITH (NOLOCK)
WHERE database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id))
SELECT ROW_NUMBER() OVER(ORDER BY CachedSize DESC) AS [Buffer Pool Rank], [Database Name], CachedSize AS [Cached Size (MB)],
       CAST(CachedSize / SUM(CachedSize) OVER() * 100.0 AS DECIMAL(5,2)) AS [Buffer Pool Percent]
FROM AggregateBufferPoolUsage
ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE);

-- Tells you how much memory (in the buffer pool) 
-- is being used by each database on the instance

----------------------------------------------------------------------------------------------------------------------------
-- Good basic information about OS memory amounts and state  (Query 41) (System Memory)
SELECT total_physical_memory_kb/1024 AS [Physical Memory (MB)], 
       available_physical_memory_kb/1024 AS [Available Memory (MB)], 
       total_page_file_kb/1024 AS [Total Page File (MB)], 
	   available_page_file_kb/1024 AS [Available Page File (MB)], 
	   system_cache_kb/1024 AS [System Cache (MB)],
       system_memory_state_desc AS [System Memory State]
FROM sys.dm_os_sys_memory WITH (NOLOCK) OPTION (RECOMPILE);

-- You want to see "Available physical memory is high"
-- This indicates that you are not under external memory pressure

----------------------------------------------------------------------------------------------------------------------------
-- SQL Server Process Address space info  (Query 42) (Process Memory)
-- (shows whether locked pages is enabled, among other things)
SELECT physical_memory_in_use_kb/1024 AS [SQL Server Memory Usage (MB)],
       large_page_allocations_kb, locked_page_allocations_kb, page_fault_count, 
	   memory_utilization_percentage, available_commit_limit_kb, 
	   process_physical_memory_low, process_virtual_memory_low
FROM sys.dm_os_process_memory WITH (NOLOCK) OPTION (RECOMPILE);

-- You want to see 0 for process_physical_memory_low
-- You want to see 0 for process_virtual_memory_low
-- This indicates that you are not under internal memory pressure

----------------------------------------------------------------------------------------------------------------------------
-- Page Life Expectancy (PLE) value for each NUMA node in current instance  (Query 43) (PLE by NUMA Node)
SELECT @@SERVERNAME AS [Server Name], [object_name], instance_name, cntr_value AS [Page Life Expectancy]
FROM sys.dm_os_performance_counters WITH (NOLOCK)
WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances
AND counter_name = N'Page life expectancy' OPTION (RECOMPILE);

-- PLE is a good measurement of memory pressure.
-- Higher PLE is better. Watch the trend over time, not the absolute value.
-- This will only return one row for non-NUMA systems.

----------------------------------------------------------------------------------------------------------------------------
-- Memory Grants Pending value for current instance  (Query 44) (Memory Grants Pending)
SELECT @@SERVERNAME AS [Server Name], [object_name], cntr_value AS [Memory Grants Pending]                                                                                                       
FROM sys.dm_os_performance_counters WITH (NOLOCK)
WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances
AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE);

-- Memory Grants Pending above zero for a sustained period is a very strong indicator of memory pressure

----------------------------------------------------------------------------------------------------------------------------
-- Memory Clerk Usage for instance  (Query 45) (Memory Clerk Usage)
-- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans)
SELECT TOP(10) mc.[type] AS [Memory Clerk Type], 
       CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] 
FROM sys.dm_os_memory_clerks AS mc WITH (NOLOCK)
GROUP BY mc.[type]  
ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE);

-- MEMORYCLERK_SQLBUFFERPOOL was new for SQL Server 2012. It should be your highest consumer of memory

-- CACHESTORE_SQLCP  SQL Plans         
-- These are cached SQL statements or batches that aren't in stored procedures, functions and triggers
-- Watch out for high values for CACHESTORE_SQLCP

-- CACHESTORE_OBJCP  Object Plans      
-- These are compiled plans for stored procedures, functions and triggers

Также поставьте Perfmon на сбор, например, таких вот счетчиков
Memory: Available Mbytes
SQL Server:Buffer Manager Page life expectancy

Далее придется изучать, как интерпретировать результаты, тут уж гугл в помощь, все разжевано довольно подробно.


Супер!
Спасибо огромное!
19 май 15, 14:37    [17661528]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Очень лысый
Member

Откуда: БОМЖ
Сообщений: 591
На всякий случай... А не может быть так, что хранилку, на которой всё живёт, в какие-то моменты напрягают некие другие живущие на ней сервисы? Хранилка напряглась - запросы стали тормозить. Отпустил хранилку вражеский сервис - опять всё забегало.
19 май 15, 17:47    [17663170]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Genniy
Glory
пропущено...

Т.е. у вас и для базы задано автоматическое обновление статистики, и еще вы это же по расписанию делаете ?


Да. Спасибо. Сейчас отключу автоматический сбор
Я не совсем понимаю к чему Glory это тут ляпнул. Ибо на больших таблицах автоматическое обновление статистики имеет эффект близкий к нулевому, а иногда даже отрицательный.
19 май 15, 22:22    [17663995]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mind
Я не совсем понимаю к чему Glory это тут ляпнул.

К тому, что автоматический сбор статистики может происходить _периодически_. И периодически влиять на текущую производительность. Если вы про это не в курсе, то это не значит, что этого нет.
20 май 15, 08:22    [17664657]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Glory
Mind
Я не совсем понимаю к чему Glory это тут ляпнул.

К тому, что автоматический сбор статистики может происходить _периодически_. И периодически влиять на текущую производительность. Если вы про это не в курсе, то это не значит, что этого нет.
Ясно. ТС это понял по другому и решил выключить ручной пересчет.
20 май 15, 19:34    [17668426]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mind
Ибо на больших таблицах автоматическое обновление статистики имеет эффект близкий к нулевому, а иногда даже отрицательный.
Поподробнее можно?
21 май 15, 09:02    [17669779]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Jovanny
Mind
Ибо на больших таблицах автоматическое обновление статистики имеет эффект близкий к нулевому, а иногда даже отрицательный.
Поподробнее можно?
Серьезно?

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

Так как пересчет статистики синхронный и происходит в момент компиляции запроса, то если на огромной таблице таки будет запусчет автопересчет, то компиляция запроса может длиться секунды, вместо привычных миллисекунд и пользователям придется "немножко" подождать.
21 май 15, 20:08    [17673394]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Mind
Jovanny
пропущено...
Поподробнее можно?
как пересчет статистики синхронный и происходит в момент компиляции запроса


А как же опция AUTO_UPDATE_STATISTICS_ASYNC на уровне базы?
И попутно, можете пояснить, как сервер выбирает данные для статистики, если указано SAMPLE 5 PERCENT? Эти 5 процентов выбираются случайно или как-то сортируются перед выборкой?
22 май 15, 10:00    [17674891]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mind
Статистика автоматически пересчитывается только при изменении 20% строк.
Не совсем верно.
Изменения в автоматическом обновлении статистики SQL Server -T2371
22 май 15, 11:55    [17675781]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Mind
Так как пересчет статистики синхронный и происходит в момент компиляции запроса
Это Вы где прочитали? Происходит, если нет подходящей статистики. Ну, первый раз можно и подождать. У меня таких случаев были единицы.
22 май 15, 11:59    [17675807]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
zatar86
Member

Откуда: СПБ
Сообщений: 228
Я бы profilerom собрал рабоч нагрузку когда на тормоза жалуются. Воспроизвёл бы её на другом сервере и с корил бы это адвисору.
22 май 15, 12:48    [17676194]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
zatar86
Member

Откуда: СПБ
Сообщений: 228
Если в на самой бд траблы с отсуствующими индексами, статистикой и вышеперечисленными факторами. В рекомендациях обычно видно будет.
22 май 15, 12:52    [17676225]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
o-o
Guest
Jovanny
Mind
Так как пересчет статистики синхронный и происходит в момент компиляции запроса
Это Вы где прочитали? Происходит, если нет подходящей статистики. Ну, первый раз можно и подождать. У меня таких случаев были единицы.

вот, например:
Statistics Used by the Query Optimizer in Microsoft SQL Server 2008

раздел Maintaining Statistics in SQL Server 2008:

After a series of INSERTs, DELETEs, and/or UPDATEs are performed on a table the statistics may not reflect the true data distribution in a given column or index. If the SQL Server query optimizer requires statistics for a particular column in a table that has undergone substantial update activity since the last time the statistics were created or updated, SQL Server automatically updates the statistics by sampling the column values (by using auto update statistics). The statistics auto update is triggered by query optimization or by execution of a compiled plan, and it involves only a subset of the columns referred to in the query. Statistics are updated before query compilation if AUTO_UPDATE_STATISTCS_ASYNC is OFF, and asynchronously if it is ON. When statistics are updated asynchronously, the query that triggered the update proceeds using the old statistics. This provides more predictable query response time for some work loads, particularly those with short running queries and very large tables.

When a query is first compiled, if the optimizer needs a particular statistics object, and that statistics object exists, the statistics object is updated if it is out of date. When a query is executed and its plan is in the cache, the statistics the plan depends on are checked to see if they are out of date. If so, the plan is removed from the cache, and during recompilation of the query, the statistics are updated. The plan also is removed from the cache if any of the statistics it depends on have changed.

SQL Server 2008 determines whether to update statistics based on changes to column modification counters (colmodctrs).

т.е. в ситуации, к-ую описал Mind, когда в таблице наизменяли данных на >= 20%,
по завершении операции пересчет статистики не запускается автоматом,
а только меняется modification counter таблицы.
статистика будет пересчитана при первом запросе к этой таблице.
и это может оказаться подарком, если таблица большая.
22 май 15, 12:56    [17676248]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Ключевая фраза
o-o
When a query is first compiled
.
22 май 15, 13:15    [17676427]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
o-o
Guest
Jovanny,

претензия к чему именно?
если план уже был, то он инвалидируется,
как только будет попытка выполнить запрос снова.
статистика-то все равно будет пересчитана именно в момент компиляции,
т.к. старый план выкидывается из кэша:

When a query is executed and its plan is in the cache, the statistics the plan depends on are checked to see if they are out of date.
If so, the plan is removed from the cache, and during recompilation of the query, the statistics are updated.
22 май 15, 13:25    [17676470]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Несколько фраз.
o-o
If the SQL Server query optimizer requires statistics for a particular column...
When statistics are updated asynchronously, the query that triggered the update proceeds using the old statistics...
if the optimizer needs a particular statistics object, and that statistics object exists, the statistics object is updated if it is out of date.

Т.е. далеко не факт, что стартует пересчёт статистики.
22 май 15, 13:41    [17676584]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
o-o
Guest
Jovanny,

последует.
вот это самое публике демонстрирует Erin Stellato:
Understanding When Statistics Will Automatically Update
22 май 15, 13:46    [17676629]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
o-o
Guest
а про те три выделенные фразы:

вторая вне рамок дискуссии, тк там про асинхронный апдэйт (When statistics are updated asynchronously),
но там меняется только то, что пересчет статистики все равно будет, просто не ДО компиляции, а после,
т.е. мы просто сказали: нет, мне сейчас выполни запрос со старым планом, т.к. мне сейчас срочно надо.
но это не есть умолчание и это все же все равно, что и не учитывать изменения статистики.

а про первое и третье:
1. (requires statistics) ну так разумеется речь идет только о тех запросах, где НУЖНА статистика,
и именно по этой таблице, именно по этому столбцу, иначе о чем вообще речь?
3. (out of date) мы как раз и обсуждаем случай out of date, т.е. когда >= 20% изменилось.
там же по первой ссылке в том же разделе и поясняется
+ out of date

A statistics object is considered out of date in the following cases:

* If the statistics is defined on a regular table, it is out of date if:

o The table size has gone from 0 to >0 rows (test 1).

o The number of rows in the table when the statistics were gathered was 500 or less, and the colmodctr of the leading column of the statistics object has changed by more than 500 since then (test 2).

o The table had more than 500 rows when the statistics were gathered, and the colmodctr of the leading column of the statistics object has changed by more than 500 + 20% of the number of rows in the table when the statistics were gathered (test 3).

* For filtered statistics, the colmodctr is first adjusted by the selectivity of the filter before these conditions are tested. For example, for filtered statistics with predicate selecting 50% of the rows, the colmodctr is multiplied by 0.5.

* One limitation of the automatic update logic is that it tracks changes to columns in the statistics, but not changes to columns in the predicate. If there are many changes to the columns used in predicates of filtered statistics, consider using manual updates to keep up with the changes.

* If the statistics object is defined on a temporary table, it is out of date as discussed above, except that there is an additional threshold for recomputation at 6 rows, with a test otherwise identical to test 2 in the previous list.
22 май 15, 13:57    [17676698]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
запросы в обоих случаях из ssms выполняются?
22 май 15, 15:05    [17677230]     Ответить | Цитировать Сообщить модератору
 Re: Произвольно тормозят запросы. Как можно идентифицировать причину?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
virtuOS
Mind
пропущено...
как пересчет статистики синхронный и происходит в момент компиляции запроса


А как же опция AUTO_UPDATE_STATISTICS_ASYNC на уровне базы?
Я рассматривал ситуацию по умолчанию. Т.е. установили сервер, создали базы, оставили все настройки по дефолту. А с AUTO_UPDATE_STATISTICS_ASYNC есть свой головняк. Так что это нифига не silver bullet.

virtuOS
И попутно, можете пояснить, как сервер выбирает данные для статистики, если указано SAMPLE 5 PERCENT? Эти 5 процентов выбираются случайно или как-то сортируются перед выборкой?
Весь смысл опции SAMPLE, в том, чтобы не читать все данные из таблицы, потому что это медленно и дорого. А теперь подумайте, как можно что-то отсортировать не прочитав это с диска?
22 май 15, 20:38    [17678854]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить