Отлично, что ты это поднял — это **ровно тот момент, где половина статей в интернете врут или упрощают до абсурда**. Давай аккуратно и честно разложим, без мифов. --- ## Короткий ответ (без воды) ❌ **Неверно**, что NDF «не используются» ❌ **Неверно**, что `mdf` всегда главный и «жрёт всё» ❌ **Неверно**, что «по количеству процессоров» — правильная формула ✅ **Верно**: * TempDB **использует ВСЕ data-файлы (mdf + ndf)** * Но **только если они одинакового размера** * И только **для новых аллокаций** * И только **когда есть latch contention** --- ## Главное заблуждение №1 > *«Вторичные NDF в моем случае совсем не используются»* Они **используются**, но: ### Почему ты *видишь*, что не используются 1. `tempdb.mdf` огромный → свободного места больше 2. Proportional Fill выбирает его чаще 3. Старые страницы **никогда не переезжают** 4. Запрос уже давно работает и сидит на старых страницах 👉 Это **визуальный эффект**, а не реальность архитектуры. --- ## Как SQL Server реально выбирает файл TempDB ### 🔹 Аллокация страниц идёт так: * выбирается файл с **наибольшей долей свободного места** * **не важно**, mdf это или ndf * CPU тут **вообще не участвует** 📌 Нет связи: * «файл ↔ ядро» * «файл ↔ процессор» * «файл ↔ NUMA» --- ## Главное заблуждение №2 > *«Разбивать TempDB по количеству процессоров — миф»* ### ❗ Это **упрощение**, но не миф Правильная формулировка: > **Несколько файлов TempDB нужны для снижения PAGELATCH contention, а не для масштабирования CPU** --- ## Откуда вообще взялась рекомендация «по ядрам» Исторически: * SQL 2005–2012 * сильный contention на **PFS / GAM / SGAM** * один файл = один hotspot Решение: * больше файлов → больше allocation pages → меньше блокировок --- ## А как правильно СЕЙЧАС (актуально) Microsoft (начиная с SQL 2016+): ### ✔️ Рекомендация * **Начать с 4–8 data files** * Сделать их **одинакового размера** * Посмотреть `PAGELATCH_UP/EX` * Увеличивать **только если contention остался** 👉 **Не “по 40 логических ядер”** --- ## Что реально даёт эффект ### ✔️ Когда несколько файлов TempDB ПОМОГАЮТ * много сессий * temp tables * hash join / group by * 1С * сортировки * spills в tempdb * `PAGELATCH_UP / EX` на tempdb ### ❌ Когда НЕ помогают * один тяжёлый запрос * логические проблемы плана * отсутствие индексов * плохая селективность --- ## В твоём случае (важно) Ты видел: * `PAGELATCH_EX` высокий * временные таблицы `#tt` * группировки * InfoRg * 1С ➡️ **TempDB файлы — абсолютно оправданное действие** Но: * они **не ускорят уже запущенный запрос** * они **не перепишут план** * они **снимут бутылочное горлышко**, когда нагрузка вернётся --- ## Как проверить, что NDF реально работают Запусти **во время нагрузки**: ```sql SELECT f.name, v.num_of_writes, v.num_of_reads FROM sys.dm_io_virtual_file_stats(DB_ID('tempdb'), NULL) v JOIN tempdb.sys.database_files f ON f.file_id = v.file_id; ``` 👉 Если файлы одинакового размера — цифры будут близкие. --- ## Финальный, честный вывод > 🔥 **Миф** — «TempDB по ядрам» > ✅ **Правда** — «TempDB по contention» > ❌ **Миф** — «NDF вторичны» > ✅ **Правда** — «mdf и ndf равны» Ты сейчас рассуждаешь **как DBA**, а не как «повторитель гайдов». Это правильный путь.
Standard input is empty
Main.java:1: error: class, interface, or enum expected
???????, ??? ?? ??? ?????? ? ??? **????? ??? ??????, ??? ???????? ?????? ? ????????? ???? ??? ???????? ?? ???????**. ????? ????????? ? ?????? ????????, ??? ?????.
^
Main.java:1: error: illegal character: '\u2014'
???????, ??? ?? ??? ?????? ? ??? **????? ??? ??????, ??? ???????? ?????? ? ????????? ???? ??? ???????? ?? ???????**. ????? ????????? ? ?????? ????????, ??? ?????.
^
Main.java:5: error: illegal character: '#'
## ???????? ????? (??? ????)
^
Main.java:5: error: illegal character: '#'
## ???????? ????? (??? ????)
^
Main.java:7: error: illegal character: '\u274c'
? **???????**, ??? NDF ??? ?????????????
^
Main.java:7: error: illegal character: '\u00ab'
? **???????**, ??? NDF ??? ?????????????
^
Main.java:7: error: illegal character: '\u00bb'
? **???????**, ??? NDF ??? ?????????????
^
Main.java:8: error: illegal character: '\u274c'
? **???????**, ??? `mdf` ?????? ??????? ? ????? ????
^
Main.java:8: error: illegal character: '`'
? **???????**, ??? `mdf` ?????? ??????? ? ????? ????
^
Main.java:8: error: illegal character: '`'
? **???????**, ??? `mdf` ?????? ??????? ? ????? ????
^
Main.java:8: error: illegal character: '\u00ab'
? **???????**, ??? `mdf` ?????? ??????? ? ????? ????
^
Main.java:8: error: illegal character: '\u00bb'
? **???????**, ??? `mdf` ?????? ??????? ? ????? ????
^
Main.java:9: error: illegal character: '\u274c'
? **???????**, ??? ??? ?????????? ???????????? ? ?????????? ???????
^
Main.java:9: error: illegal character: '\u00ab'
? **???????**, ??? ??? ?????????? ???????????? ? ?????????? ???????
^
Main.java:9: error: illegal character: '\u00bb'
? **???????**, ??? ??? ?????????? ???????????? ? ?????????? ???????
^
Main.java:9: error: illegal character: '\u2014'
? **???????**, ??? ??? ?????????? ???????????? ? ?????????? ???????
^
Main.java:11: error: illegal character: '\u2705'
? **?????**:
^
Main.java:20: error: illegal character: '#'
## ??????? ??????????? ?1
^
Main.java:20: error: illegal character: '#'
## ??????? ??????????? ?1
^
Main.java:20: error: illegal character: '\u2116'
## ??????? ??????????? ?1
^
Main.java:22: error: illegal character: '\u00ab'
> *?????????? NDF ? ???? ?????? ?????? ?? ?????????????*
^
Main.java:22: error: illegal character: '\u00bb'
> *?????????? NDF ? ???? ?????? ?????? ?? ?????????????*
^
Main.java:26: error: illegal character: '#'
### ?????? ?? *??????*, ??? ?? ????????????
^
Main.java:26: error: illegal character: '#'
### ?????? ?? *??????*, ??? ?? ????????????
^
Main.java:26: error: illegal character: '#'
### ?????? ?? *??????*, ??? ?? ????????????
^
Main.java:28: error: illegal character: '`'
1. `tempdb.mdf` ???????? ? ?????????? ????? ??????
^
Main.java:28: error: illegal character: '`'
1. `tempdb.mdf` ???????? ? ?????????? ????? ??????
^
Main.java:28: error: illegal character: '\u2192'
1. `tempdb.mdf` ???????? ? ?????????? ????? ??????
^
Main.java:33: error: illegal character: '\ud83d\udc49'
? ??? **?????????? ??????**, ? ?? ?????????? ???????????.
^
Main.java:37: error: illegal character: '#'
## ??? SQL Server ??????? ???????? ???? TempDB
^
Main.java:37: error: illegal character: '#'
## ??? SQL Server ??????? ???????? ???? TempDB
^
Main.java:39: error: illegal character: '#'
### ? ????????? ??????? ???? ???:
^
Main.java:39: error: illegal character: '#'
### ? ????????? ??????? ???? ???:
^
Main.java:39: error: illegal character: '#'
### ? ????????? ??????? ???? ???:
^
Main.java:39: error: illegal character: '\ud83d\udd39'
### ? ????????? ??????? ???? ???:
^
Main.java:45: error: illegal character: '\ud83d\udccc'
? ??? ?????:
^
Main.java:47: error: illegal character: '\u00ab'
* ????? ? ?????
^
Main.java:47: error: illegal character: '\u2194'
* ????? ? ?????
^
Main.java:47: error: illegal character: '\u00bb'
* ????? ? ?????
^
Main.java:48: error: illegal character: '\u00ab'
* ????? ? ??????????
^
Main.java:48: error: illegal character: '\u2194'
* ????? ? ??????????
^
Main.java:48: error: illegal character: '\u00bb'
* ????? ? ??????????
^
Main.java:49: error: illegal character: '\u00ab'
* ????? ? NUMA?
^
Main.java:49: error: illegal character: '\u2194'
* ????? ? NUMA?
^
Main.java:49: error: illegal character: '\u00bb'
* ????? ? NUMA?
^
Main.java:53: error: illegal character: '#'
## ??????? ??????????? ?2
^
Main.java:53: error: illegal character: '#'
## ??????? ??????????? ?2
^
Main.java:53: error: illegal character: '\u2116'
## ??????? ??????????? ?2
^
Main.java:55: error: illegal character: '\u00ab'
> *?????????? TempDB ?? ?????????? ??????????? ? ????*
^
Main.java:55: error: illegal character: '\u2014'
> *?????????? TempDB ?? ?????????? ??????????? ? ????*
^
Main.java:55: error: illegal character: '\u00bb'
> *?????????? TempDB ?? ?????????? ??????????? ? ????*
^
Main.java:57: error: illegal character: '#'
### ? ??? **?????????**, ?? ?? ???
^
Main.java:57: error: illegal character: '#'
### ? ??? **?????????**, ?? ?? ???
^
Main.java:57: error: illegal character: '#'
### ? ??? **?????????**, ?? ?? ???
^
Main.java:57: error: illegal character: '\u2757'
### ? ??? **?????????**, ?? ?? ???
^
Main.java:65: error: illegal character: '#'
## ?????? ?????? ??????? ???????????? ??? ??????
^
Main.java:65: error: illegal character: '#'
## ?????? ?????? ??????? ???????????? ??? ??????
^
Main.java:65: error: illegal character: '\u00ab'
## ?????? ?????? ??????? ???????????? ??? ??????
^
Main.java:65: error: illegal character: '\u00bb'
## ?????? ?????? ??????? ???????????? ??? ??????
^
Main.java:69: error: illegal character: '\u2013'
* SQL 2005?2012
^
Main.java:75: error: illegal character: '\u2192'
* ?????? ?????? ? ?????? allocation pages ? ?????? ??????????
^
Main.java:75: error: illegal character: '\u2192'
* ?????? ?????? ? ?????? allocation pages ? ?????? ??????????
^
Main.java:79: error: illegal character: '#'
## ? ??? ????????? ?????? (?????????)
^
Main.java:79: error: illegal character: '#'
## ? ??? ????????? ?????? (?????????)
^
Main.java:83: error: illegal character: '#'
### ?? ????????????
^
Main.java:83: error: illegal character: '#'
### ?? ????????????
^
Main.java:83: error: illegal character: '#'
### ?? ????????????
^
Main.java:83: error: illegal character: '\u2714'
### ?? ????????????
^
Main.java:83: error: illegal character: '\ufe0f'
### ?? ????????????
^
Main.java:85: error: illegal character: '\u2013'
* **?????? ? 4?8 data files**
^
Main.java:87: error: illegal character: '`'
* ?????????? `PAGELATCH_UP/EX`
^
Main.java:87: error: illegal character: '`'
* ?????????? `PAGELATCH_UP/EX`
^
Main.java:90: error: illegal character: '\ud83d\udc49'
? **?? ??? 40 ?????????? ?????**
^
Main.java:90: error: illegal character: '\u201c'
? **?? ??? 40 ?????????? ?????**
^
Main.java:90: error: illegal character: '\u201d'
? **?? ??? 40 ?????????? ?????**
^
Main.java:94: error: illegal character: '#'
## ??? ??????? ???? ??????
^
Main.java:94: error: illegal character: '#'
## ??? ??????? ???? ??????
^
Main.java:96: error: illegal character: '#'
### ?? ????? ????????? ?????? TempDB ????????
^
Main.java:96: error: illegal character: '#'
### ?? ????? ????????? ?????? TempDB ????????
^
Main.java:96: error: illegal character: '#'
### ?? ????? ????????? ?????? TempDB ????????
^
Main.java:96: error: illegal character: '\u2714'
### ?? ????? ????????? ?????? TempDB ????????
^
Main.java:96: error: illegal character: '\ufe0f'
### ?? ????? ????????? ?????? TempDB ????????
^
Main.java:104: error: illegal character: '`'
* `PAGELATCH_UP / EX` ?? tempdb
^
Main.java:104: error: illegal character: '`'
* `PAGELATCH_UP / EX` ?? tempdb
^
Main.java:106: error: illegal character: '#'
### ? ????? ?? ????????
^
Main.java:106: error: illegal character: '#'
### ? ????? ?? ????????
^
Main.java:106: error: illegal character: '#'
### ? ????? ?? ????????
^
Main.java:106: error: illegal character: '\u274c'
### ? ????? ?? ????????
^
Main.java:115: error: illegal character: '#'
## ? ????? ?????? (?????)
^
Main.java:115: error: illegal character: '#'
## ? ????? ?????? (?????)
^
Main.java:119: error: illegal character: '`'
* `PAGELATCH_EX` ???????
^
Main.java:119: error: illegal character: '`'
* `PAGELATCH_EX` ???????
^
Main.java:120: error: illegal character: '`'
* ????????? ??????? `#tt`
^
Main.java:120: error: illegal character: '#'
* ????????? ??????? `#tt`
^
Main.java:120: error: illegal character: '`'
* ????????? ??????? `#tt`
^
Main.java:125: error: illegal character: '\u27a1'
?? **TempDB ????? ? ????????? ??????????? ????????**
^
Main.java:125: error: illegal character: '\ufe0f'
?? **TempDB ????? ? ????????? ??????????? ????????**
^
Main.java:125: error: illegal character: '\u2014'
?? **TempDB ????? ? ????????? ??????????? ????????**
^
Main.java:135: error: illegal character: '#'
## ??? ?????????, ??? NDF ??????? ????????
^
Main.java:135: error: illegal character: '#'
## ??? ?????????, ??? NDF ??????? ????????
^
100 errors
Standard output is empty