fork download
  1. Отличные вопросы, ты сейчас как раз упёрся в самый неочевидный момент TempDB, из-за которого очень многие думают, что «оно не работает». Спойлер: у тебя всё работает правильно, просто SQL Server так устроен. Сейчас разложу спокойно и по шагам.
  2.  
  3. 1️⃣ Почему tempdb.mdf остался 75 ГБ, а tempdev*.ndf не растут
  4. Коротко
  5.  
  6. 👉 Это НОРМАЛЬНО.
  7. 👉 SQL Server НЕ перераспределяет существующие данные TempDB между файлами.
  8.  
  9. Чуть подробнее
  10.  
  11. TempDB — одно логическое пространство, разбитое на несколько физических файлов
  12.  
  13. SQL Server не делает “rebalance” уже занятых страниц
  14.  
  15. Всё, что уже было размещено в tempdb.mdf, там и остаётся
  16.  
  17. Новые аллокации (новые временные таблицы, hash, sort, spills)
  18. 👉 начинают распределяться по всем файлам
  19.  
  20. Поэтому:
  21.  
  22. старый файл = большой
  23.  
  24. новые = маленькие
  25.  
  26. это не ошибка
  27.  
  28. 2️⃣ Почему .ndf, а не .mdf
  29.  
  30. Очень важный момент 👇
  31.  
  32. .mdf — может быть только один (primary data file)
  33.  
  34. .ndf — дополнительные data files
  35.  
  36. TempDB:
  37.  
  38. tempdb.mdf — главный файл
  39.  
  40. tempdev2.ndf, tempdev3.ndf, … — равноправные data files
  41.  
  42. 👉 Для SQL Server нет разницы, .mdf или .ndf
  43. 👉 Latch распределяются одинаково
  44.  
  45. Это абсолютно правильная схема 👍
  46.  
  47. 3️⃣ Почему SQL Server не начал сразу писать во все файлы
  48.  
  49. Потому что SQL Server использует механизм:
  50.  
  51. 🔹 Proportional Fill
  52.  
  53. Он распределяет новые страницы пропорционально свободному месту.
  54.  
  55. Сейчас у тебя:
  56.  
  57. tempdb.mdf75 ГБ, свободного места МНОГО
  58.  
  59. tempdev*.ndf — по 1 ГБ
  60.  
  61. ➡️ SQL думает:
  62.  
  63. «Ага, в mdf места больше — буду писать туда»
  64.  
  65. 4️⃣ Как ЗАСТАВИТЬ TempDB работать равномерно (ВАЖНО)
  66. ✅ ПРАВИЛО №1
  67.  
  68. ВСЕ data-файлы TempDB должны быть ОДИНАКОВОГО размера
  69.  
  70. Не «примерно», а реально одинакового.
  71.  
  72. 🔧 Что нужно сделать правильно
  73.  
  74. Допустим:
  75.  
  76. Хочешь 8 файлов
  77.  
  78. Общий размер TempDB = 80 ГБ
  79.  
  80. 👉 Делай так:
  81.  
  82. tempdb.mdf10 ГБ
  83.  
  84. tempdev2.ndf10 ГБ
  85.  
  86.  
  87. tempdev8.ndf10 ГБ
  88.  
  89. 🔧 Как исправить твою ситуацию
  90. Шаг 1. Уменьшить основной файл
  91. USE tempdb;
  92. GO
  93. DBCC SHRINKFILE (tempdev, 10240); -- 10 GB
  94. GO
  95.  
  96.  
  97. ⚠️ Делай не в пиковое время
  98.  
  99. Шаг 2. Увеличить остальные файлы до того же размера
  100. ALTER DATABASE tempdb
  101. MODIFY FILE (NAME = tempdev2, SIZE = 10240MB),
  102. (NAME = tempdev3, SIZE = 10240MB),
  103. (NAME = tempdev4, SIZE = 10240MB),
  104. (NAME = tempdev5, SIZE = 10240MB),
  105. (NAME = tempdev6, SIZE = 10240MB),
  106. (NAME = tempdev7, SIZE = 10240MB),
  107. (NAME = tempdev8, SIZE = 10240MB);
  108. GO
  109.  
  110. Шаг 3. Одинаковый FILEGROWTH
  111. ALTER DATABASE tempdb
  112. MODIFY FILE (NAME = tempdev, FILEGROWTH = 512MB),
  113. (NAME = tempdev2, FILEGROWTH = 512MB),
  114. (NAME = tempdev3, FILEGROWTH = 512MB),
  115. (NAME = tempdev4, FILEGROWTH = 512MB),
  116. (NAME = tempdev5, FILEGROWTH = 512MB),
  117. (NAME = tempdev6, FILEGROWTH = 512MB),
  118. (NAME = tempdev7, FILEGROWTH = 512MB),
  119. (NAME = tempdev8, FILEGROWTH = 512MB);
  120. GO
  121.  
  122. Шаг 4. Перезапуск SQL Server
  123.  
  124. Это обязательно, чтобы всё стартовало «с чистого листа».
  125.  
  126. 5️⃣ Как проверить, что TempDB реально стал работать равномерно
  127. 🔍 Проверка активности файлов
  128. SELECT
  129. name,
  130. num_of_reads,
  131. num_of_writes,
  132. io_stall_read_ms,
  133. io_stall_write_ms
  134. FROM sys.dm_io_virtual_file_stats(DB_ID('tempdb'), NULL) v
  135. JOIN tempdb.sys.database_files f
  136. ON v.file_id = f.file_id;
  137.  
  138.  
  139. 👉 Если всё хорошо:
  140.  
  141. read/write примерно одинаковые
  142.  
  143. не только tempdb.mdf активен
  144.  
  145. 6️⃣ Очень важный вывод (ключевой момент)
  146.  
  147. ❗ TempDB не чинит сам запрос
  148. ❗ TempDB снимает contention, когда запросы уже есть
  149.  
  150. Ты сделал правильный шаг, потому что:
  151.  
  152. 1С
  153.  
  154. временные таблицы
  155.  
  156. hash / group by
  157.  
  158. высокий PAGELATCH_EX
  159.  
  160. Без нескольких файлов TempDB любой сервер с 1С рано или поздно упрётся.
  161.  
  162. 7️⃣ Почему сейчас сервер «не тормозит», но запрос идёт часами
  163.  
  164. Потому что:
  165.  
  166. contention стало меньше
  167.  
  168. но план запроса всё ещё тяжёлый
  169.  
  170. это логическая нагрузка, а не инфраструктурная
  171.  
  172. Следующий шаг — execution plan и индексы InfoRg.
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:1: error: class, interface, or enum expected
???????? ???????, ?? ?????? ??? ??? ?????? ? ????? ??????????? ?????? TempDB, ??-?? ???????? ????? ?????? ??????, ??? ???? ?? ?????????. ???????: ? ???? ??? ???????? ?????????, ?????? SQL Server ??? ???????. ?????? ??????? ???????? ? ?? ?????.
^
Main.java:1: error: illegal character: '\u00ab'
???????? ???????, ?? ?????? ??? ??? ?????? ? ????? ??????????? ?????? TempDB, ??-?? ???????? ????? ?????? ??????, ??? ???? ?? ?????????. ???????: ? ???? ??? ???????? ?????????, ?????? SQL Server ??? ???????. ?????? ??????? ???????? ? ?? ?????.
                                                                                                                      ^
Main.java:1: error: illegal character: '\u00bb'
???????? ???????, ?? ?????? ??? ??? ?????? ? ????? ??????????? ?????? TempDB, ??-?? ???????? ????? ?????? ??????, ??? ???? ?? ?????????. ???????: ? ???? ??? ???????? ?????????, ?????? SQL Server ??? ???????. ?????? ??????? ???????? ? ?? ?????.
                                                                                                                                      ^
Main.java:3: error: illegal character: '\ufe0f'
1?? ?????? tempdb.mdf ??????? 75 ??, ? tempdev*.ndf ?? ??????
 ^
Main.java:3: error: illegal character: '\u20e3'
1?? ?????? tempdb.mdf ??????? 75 ??, ? tempdev*.ndf ?? ??????
  ^
Main.java:6: error: illegal character: '\ud83d\udc49'
? ??? ?????????.
^
Main.java:7: error: illegal character: '\ud83d\udc49'
? SQL Server ?? ???????????????? ???????????? ?????? TempDB ????? ???????.
^
Main.java:11: error: illegal character: '\u2014'
TempDB ? ???? ?????????? ????????????, ???????? ?? ????????? ?????????? ??????
       ^
Main.java:13: error: illegal character: '\u201c'
SQL Server ?? ?????? ?rebalance? ??? ??????? ???????
                     ^
Main.java:13: error: illegal character: '\u201d'
SQL Server ?? ?????? ?rebalance? ??? ??????? ???????
                               ^
Main.java:18: error: illegal character: '\ud83d\udc49'
? ???????? ?????????????? ?? ???? ??????
^
Main.java:28: error: illegal character: '\ufe0f'
2?? ?????? .ndf, ? ?? .mdf
 ^
Main.java:28: error: illegal character: '\u20e3'
2?? ?????? .ndf, ? ?? .mdf
  ^
Main.java:30: error: illegal character: '\ud83d\udc47'
????? ?????? ?????? ?
                    ^
Main.java:32: error: illegal character: '\u2014'
.mdf ? ????? ???? ?????? ???? (primary data file)
     ^
Main.java:34: error: illegal character: '\u2014'
.ndf ? ?????????????? data files
     ^
Main.java:38: error: illegal character: '\u2014'
tempdb.mdf ? ??????? ????
           ^
Main.java:40: error: illegal character: '\u2026'
tempdev2.ndf, tempdev3.ndf, ? ? ???????????? data files
                            ^
Main.java:40: error: illegal character: '\u2014'
tempdev2.ndf, tempdev3.ndf, ? ? ???????????? data files
                              ^
Main.java:42: error: illegal character: '\ud83d\udc49'
? ??? SQL Server ??? ???????, .mdf ??? .ndf
^
Main.java:43: error: illegal character: '\ud83d\udc49'
? Latch ?????????????? ?????????
^
Main.java:45: error: illegal character: '\ud83d\udc4d'
??? ????????? ?????????? ????? ?
                               ^
Main.java:47: error: illegal character: '\ufe0f'
3?? ?????? SQL Server ?? ????? ????? ?????? ?? ??? ?????
 ^
Main.java:47: error: illegal character: '\u20e3'
3?? ?????? SQL Server ?? ????? ????? ?????? ?? ??? ?????
  ^
Main.java:51: error: illegal character: '\ud83d\udd39'
? Proportional Fill
^
Main.java:57: error: illegal character: '\u2014'
tempdb.mdf ? 75 ??, ?????????? ????? ?????
           ^
Main.java:59: error: illegal character: '\u2014'
tempdev*.ndf ? ?? 1 ??
             ^
Main.java:61: error: illegal character: '\u27a1'
?? SQL ??????:
^
Main.java:61: error: illegal character: '\ufe0f'
?? SQL ??????:
 ^
Main.java:63: error: illegal character: '\u00ab'
????, ? mdf ????? ?????? ? ???? ?????? ?????
^
Main.java:63: error: illegal character: '\u2014'
????, ? mdf ????? ?????? ? ???? ?????? ?????
                         ^
Main.java:63: error: illegal character: '\u00bb'
????, ? mdf ????? ?????? ? ???? ?????? ?????
                                           ^
Main.java:65: error: illegal character: '\ufe0f'
4?? ??? ????????? TempDB ???????? ?????????? (?????)
 ^
Main.java:65: error: illegal character: '\u20e3'
4?? ??? ????????? TempDB ???????? ?????????? (?????)
  ^
Main.java:66: error: illegal character: '\u2705'
? ??????? ?1
^
Main.java:66: error: illegal character: '\u2116'
? ??????? ?1
          ^
Main.java:70: error: illegal character: '\u00ab'
?? ??????????, ? ??????? ???????????.
   ^
Main.java:70: error: illegal character: '\u00bb'
?? ??????????, ? ??????? ???????????.
            ^
Main.java:72: error: illegal character: '\ud83d\udd27'
? ??? ????? ??????? ?????????
^
Main.java:80: error: illegal character: '\ud83d\udc49'
? ????? ???:
^
Main.java:82: error: illegal character: '\u2192'
tempdb.mdf ? 10 ??
           ^
Main.java:84: error: illegal character: '\u2192'
tempdev2.ndf ? 10 ??
             ^
Main.java:86: error: illegal character: '\u2026'
?
^
Main.java:88: error: illegal character: '\u2192'
tempdev8.ndf ? 10 ??
             ^
Main.java:90: error: illegal character: '\ud83d\udd27'
? ??? ????????? ???? ????????
^
Main.java:93: error: class, interface, or enum expected
GO
^
Main.java:94: error: class, interface, or enum expected
DBCC SHRINKFILE (tempdev, 10240); -- 10 GB
                                  ^
Main.java:98: error: illegal character: '\u26a0'
?? ????? ?? ? ??????? ?????
^
Main.java:98: error: illegal character: '\ufe0f'
?? ????? ?? ? ??????? ?????
 ^
Main.java:109: error: class, interface, or enum expected
GO
^
Main.java:121: error: class, interface, or enum expected
GO
^
Main.java:125: error: illegal character: '\u00ab'
??? ???????????, ????? ??? ?????????? ?? ??????? ??????.
                                      ^
Main.java:125: error: illegal character: '\u00bb'
??? ???????????, ????? ??? ?????????? ?? ??????? ??????.
                                                      ^
Main.java:127: error: illegal character: '\ufe0f'
5?? ??? ?????????, ??? TempDB ??????? ???? ???????? ??????????
 ^
Main.java:127: error: illegal character: '\u20e3'
5?? ??? ?????????, ??? TempDB ??????? ???? ???????? ??????????
  ^
Main.java:128: error: illegal character: '\ud83d\udd0d'
? ???????? ?????????? ??????
^
Main.java:135: error: unclosed character literal
FROM sys.dm_io_virtual_file_stats(DB_ID('tempdb'), NULL) v
                                        ^
Main.java:135: error: unclosed character literal
FROM sys.dm_io_virtual_file_stats(DB_ID('tempdb'), NULL) v
                                               ^
Main.java:140: error: illegal character: '\ud83d\udc49'
? ???? ??? ??????:
^
Main.java:140: error: class, interface, or enum expected
? ???? ??? ??????:
        ^
Main.java:146: error: illegal character: '\ufe0f'
6?? ????? ?????? ????? (???????? ??????)
 ^
Main.java:146: error: illegal character: '\u20e3'
6?? ????? ?????? ????? (???????? ??????)
  ^
Main.java:148: error: illegal character: '\u2757'
? TempDB ?? ????? ??? ??????
^
Main.java:149: error: illegal character: '\u2757'
? TempDB ??????? contention, ????? ??????? ??? ????
^
Main.java:163: error: illegal character: '\ufe0f'
7?? ?????? ?????? ?????? ??? ?????????, ?? ?????? ???? ??????
 ^
Main.java:163: error: illegal character: '\u20e3'
7?? ?????? ?????? ?????? ??? ?????????, ?? ?????? ???? ??????
  ^
Main.java:163: error: illegal character: '\u00ab'
7?? ?????? ?????? ?????? ??? ?????????, ?? ?????? ???? ??????
                         ^
Main.java:163: error: illegal character: '\u00bb'
7?? ?????? ?????? ?????? ??? ?????????, ?? ?????? ???? ??????
                                     ^
Main.java:173: error: illegal character: '\u2014'
????????? ??? ? execution plan ? ??????? InfoRg.
              ^
69 errors
stdout
Standard output is empty