powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL Server не отбирает всю отведённую ему память
15 сообщений из 15, страница 1 из 1
SQL Server не отбирает всю отведённую ему память
    #40071972
Dm2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Microsoft SQL Server 2017
(RTM-CU22-GDR) (KB4583457) - 14.0.3370.1 (X64) Nov 6 2020 18:19:52 Copyright (C) 2017 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

Серверная память 256ГБ
Maximum Server Memory ограничен 245ГБ
Судя по диспетчеру задач SQL Server фактически отбирает стабильно 199ГБ
Сервер облачный (виртуальный)
Размер данных базы 1TB

Page life expectancy прыгает в диапазоне 100-200 поднимается до 500 вне рабочего дня

Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
DECLARE @Perf TABLE (object_name nvarchar(20), counter_name nvarchar(128), instance_name nvarchar(128), cntr_value BIGINT, formatted_value NUMERIC(20, 2), ShortName NVARCHAR(20))
INSERT INTO @Perf(object_name, counter_name, instance_name, cntr_value, formatted_value, ShortName)
SELECT 
  CASE 
    WHEN PATINDEX('%:Memory Manager%', object_name)> 0 THEN 'Memory Manager'
    WHEN PATINDEX('%:Buffer Manager%', object_name)> 0 THEN 'Buffer Manager'
    WHEN PATINDEX('%:Plan Cache%', object_name)> 0 THEN 'Plan Cache'
    WHEN PATINDEX('%:Buffer Node%', object_name)> 0 THEN 'Buffer Node' -- 2008
    WHEN PATINDEX('%:Memory Node%', object_name)> 0 THEN 'Memory Node' -- 2012
    ELSE NULL 
  END AS object_name,
  CAST(RTRIM(counter_name) AS NVARCHAR(100)) AS counter_name, 
  RTRIM(instance_name) AS instance_name, 
  cntr_value,
  CAST(NULL AS DECIMAL(20,2)) AS formatted_value,
  SUBSTRING(counter_name,  1, PATINDEX('% %', counter_name)) ShortName
FROM sys.dm_os_performance_counters 
WHERE (object_name LIKE '%:Buffer Node%' OR object_name LIKE '%:Buffer Manager%' OR object_name LIKE '%:Memory Node%' OR object_name LIKE '%:Plan Cache%')
  AND (counter_name LIKE '%pages %' OR counter_name = 'Page life expectancy' OR counter_name LIKE '%Node Memory (KB)%')
  OR  (object_name LIKE '%:Memory Manager%'
        AND RTRIM(counter_name) IN ('Granted Workspace Memory (KB)', 'Maximum Workspace Memory (KB)',
                                    'Memory Grants Outstanding',     'Memory Grants Pending',
                                    'Target Server Memory (KB)',     'Total Server Memory (KB)',
                                    -- for 2012
                                    'Free Memory (KB)',              'Reserved Server Memory (KB)',
                                    'Database Cache Memory (KB)',    'Stolen Server Memory (KB)')
      )

-- Convert values from pages and KB to MB and rename counters accordingly
UPDATE @Perf
SET 
  counter_name = REPLACE(REPLACE(counter_name, 'pages', '(MB)'), '(KB)', '(MB)'), 
  formatted_value = 
  CASE 
    WHEN counter_name LIKE '%pages' THEN cntr_value/128. 
    WHEN counter_name LIKE '%(KB)' THEN cntr_value/1024. 
    ELSE cntr_value
  END

-- Update counter/object names so they look like in 2012
UPDATE PC
SET 
  object_name = REPLACE(object_name, 'Buffer', 'Memory'),
  counter_name = ISNULL(M.NewName, counter_name)  
FROM @Perf PC
  LEFT JOIN
  (
    SELECT 'Free (MB)' AS OldName, 'Free Memory (MB)' AS NewName UNION ALL
    SELECT 'Database (MB)', 'Database Cache Memory (MB)' UNION ALL
    SELECT 'Stolen (MB)', 'Stolen Server Memory (MB)' UNION ALL
    SELECT 'Reserved (MB)', 'Reserved Server Memory (MB)' UNION ALL
    SELECT 'Foreign (MB)', 'Foreign Node Memory (KB)'
  ) M ON M.OldName = PC.counter_name
  AND NewName NOT IN (SELECT counter_name FROM @Perf WHERE object_name = 'Memory Manager') 
WHERE object_name IN ('Buffer Manager', 'Buffer Node')


-- Build Memory Tree
DECLARE @MemTree TABLE (Id int, ParentId int, counter_name nvarchar(128), formatted_value NUMERIC(20, 2), ShortName NVARCHAR(20))

-- Level 5
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, ShortName)
SELECT
  Id = 1223,
  ParentId = 1222,
  instance_name + ' (MB)' as counter_name, 
  formatted_value,
  ShortName
FROM @Perf
WHERE object_name = 'Plan Cache' 
  AND counter_name IN ('Cache (MB)')
  AND instance_name <> '_Total'

-- Level 4
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, ShortName)
SELECT
  Id = 1222,
  ParentId = 1220,
  'Plan ' + counter_name as counter_name, 
  formatted_value,
  ShortName
FROM @Perf
WHERE object_name = 'Plan Cache' 
  AND counter_name IN ('Cache (MB)')
  AND instance_name = '_Total'
UNION ALL

SELECT
  Id = 1112,
  ParentId = 1110,
  counter_name, 
  formatted_value,
  ShortName
FROM @Perf
WHERE object_name = 'Memory Manager' 
  AND counter_name IN ('Reserved Server Memory (MB)')
UNION ALL
SELECT
  Id = P.ParentID + 1,
  ParentID = P.ParentID,
  'Used Workspace Memory (MB)' AS counter_name,
  SUM(used_memory_kb)/1024. as formatted_value,
  NULL AS ShortName
FROM sys.dm_exec_query_resource_semaphores 
  CROSS JOIN (SELECT 1220 AS ParentID UNION ALL SELECT 1110) P
GROUP BY P.ParentID

-- Level 3
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, ShortName)
SELECT
  Id = CASE counter_name 
           WHEN 'Granted Workspace Memory (MB)' THEN 1110 
           WHEN 'Stolen Server Memory (MB)' THEN 1220 
           ELSE 1210
         END,
  ParentId = CASE counter_name 
               WHEN 'Granted Workspace Memory (MB)' THEN 1100 
               ELSE 1200 
             END,
  counter_name, 
  formatted_value,
  ShortName
FROM @Perf
WHERE object_name = 'Memory Manager' 
  AND counter_name IN ('Stolen Server Memory (MB)', 'Database Cache Memory (MB)', 'Free Memory (MB)', 'Granted Workspace Memory (MB)')

-- Level 2
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, ShortName)
SELECT
  Id = CASE WHEN counter_name = 'Maximum Workspace Memory (MB)' THEN 1100 ELSE 1200 END,
  ParentId = 1000,
  counter_name, 
  formatted_value,
  ShortName
FROM @Perf
WHERE object_name = 'Memory Manager' AND 
  counter_name IN ('Total Server Memory (MB)', 'Maximum Workspace Memory (MB)') 

-- Level 1
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, ShortName)
SELECT 
  Id = 1000,
  ParentId = NULL,
  counter_name, 
  formatted_value,
  ShortName
FROM @Perf
WHERE object_name = 'Memory Manager' AND 
  counter_name IN ('Target Server Memory (MB)')

-- Results:

-- PLE and Memory Grants
SELECT counter_name AS [Counter Name], cntr_value as Value
FROM @Perf
WHERE 
  object_name = 'Memory Manager' 
  AND counter_name IN ('Memory Grants Outstanding', 'Memory Grants Pending', 'Page life expectancy')

-- Memory tree
;WITH CTE
AS
(
SELECT 0 as lvl, counter_name, formatted_value,  CAST(NULL AS DECIMAL(20,2)) As Perc, Id, NULL AS ParentId, ShortName
FROM @MemTree
WHERE ParentId IS NULL
UNION ALL
SELECT CTE.lvl+1,
  CAST(REPLICATE(' ', 6*(CTE.lvl)) + NCHAR(124) + REPLICATE(NCHAR(183), 3) + MT.counter_name AS NVARCHAR(128)), 
  MT.formatted_value, CAST(ISNULL(1.0*MT.formatted_value/NULLIF(CTE.formatted_value, 0),0) AS DECIMAL(20,2)) AS Perc, MT.Id, MT.ParentId, MT.ShortName
FROM @MemTree MT
  INNER JOIN CTE ON MT.ParentId = CTE.ID
)
SELECT 
  counter_name AS [Counter Name], formatted_value AS Value, Perc AS [%]
FROM CTE
ORDER BY ISNULL(ID, 10000), formatted_value DESC


возвращает
Counter NameValuePage life expectancy109Memory Grants Outstanding1Memory Grants Pending0

Counter Name Value %Target Server Memory (MB) 240630.22 NULL|···Maximum Workspace Memory (MB) 180825.12 0.75.....|···Granted Workspace Memory (MB) 15.25 0.00..........|···Used Workspace Memory (MB) 1.63 0.11..........|···Reserved Server Memory (MB) 13.63 0.89|···Total Server Memory (MB) 192892.91 0.80.....|···Database Cache Memory (MB) 131601.89 0.68.....|···Free Memory (MB) 37873.80 0.20.....|···Stolen Server Memory (MB) 23417.23 0.12..........|···Used Workspace Memory (MB) 1.63 0.00..........|···Plan Cache (MB) 13288.48 0.57...............|···SQL Plans (MB) 10044.03 0.76...............|···Object Plans (MB) 3099.89 0.23...............|···Bound Trees (MB) 140.96 0.01...............|···Temporary Tables & Table Variables (MB) 2.66 0.00...............|···Extended Stored Procedures (MB) 0.09 0.00
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40071981
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dm2021,

а чём проблема или вопрос?
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40071984
Тяп-ляп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Standard Edition для buffer pool есть ограничение 128 ГБ
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40071985
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Standard Edition = 128 ГБ буферного пула.
Больше серверу память потреблять особо некуда.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072004
Dm2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какие варианты решения возможны?
Только переход на Enterprise?
Можно ли как то обойти, расширить, размножить?
(Разделение базы по инстансам/серверам не предлагать)
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072006
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dm2021,

вы бы изложили для начала в чём состоит проблема.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072010
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dm2021
Можно ли как то обойти, расширить, размножить?
Не можно, лицензионное соглашение не велит.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072015
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затраты на объем буферной памяти, как правило, хорошо оцениваются в 20-25 процентов от объема баз.
Если вы накопили такой объём данных, у вас явно не small/home бизнес. Соответственно, требуется enterprise редакция.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072016
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dm2021
Какие варианты решения возможны?
Только переход на Enterprise?
Можно ли как то обойти, расширить, размножить?
(Разделение базы по инстансам/серверам не предлагать)


можно попробовать Buffer Pool Extension
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072022
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
Dm2021
Какие варианты решения возможны?
Только переход на Enterprise?
Можно ли как то обойти, расширить, размножить?
(Разделение базы по инстансам/серверам не предлагать)


можно попробовать Buffer Pool Extension


https://www.brentozar.com/archive/2014/04/sql-server-2014-buffer-pool-extensions/
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072061
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad,

как-то пробовал в более простом варианте, это получше своп-файла, но все равно жестко просаживает. Это уж если некуда деваться. А сами устройства стоят как дом.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072144
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, а вы сделайте на избытке памяти RAMDISK, и смонтируйте BPE туда.
Будете приятно удивлены :-)

Кстати, если памяти много - можно на рамдиск tempdb вынести, и тоже получить профит в быстродействии.
Очень сильно помогает на 1С системах.
Создаешь в памяти небольшой рамдиск, гигабайт на 16-32, файлы темпдб в нем, финсированного размера, и маленькийй файл на обычном диске, с небольшим авторасширением, как голкипер.
И пока какую-нибудь хрень страхолюдную, которая потребует терабайт в темпдб не запустят - наслаждаешься скоростью :-)
Хотя, вроде, так нельзя сейчас. У 2019 авторасширение у файлов темпдб - всегда одинаковое. Кто-то жаловался, вроде.
У меня на 2014 работает, там всё норм.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072235
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

RAMDISK возможно, да, для некритичных к потере данных.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072243
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
RAMDISK возможно, да, для некритичных к потере данных.
А почему нельзя для критичных? По моему, без разницы.
...
Рейтинг: 0 / 0
SQL Server не отбирает всю отведённую ему память
    #40072351
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

я затрудняюсь сказать - что произойдет при переполнении или отключении такого диска. Может и не будет вреда.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL Server не отбирает всю отведённую ему память
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]