Внутрішня пам'ять робочої області


13

Крістіан Болтон, Брент Озар та ін. Я намагаюся шукати розуміння та підтвердження на SQL сервері та багато пошуку в Інтернеті. Я буду вдячний, якщо хтось шукає розуміння та підтвердження на веб-сайті SQL Server 2008 Internals та усунення неполадок (запозичені з місцевої бібліотеки в Іллінойсі). може підтвердити чи виправити моє розуміння.

Кожен запит або операція, що вимагає надання пам’яті запиту, потребує пам’яті робочого простору. Загалом запит із використанням сортування, приєднання хеш-матчу, паралелізму (не впевнений у цьому), масової вставки (не впевнений), відновлення покажчиків тощо потребуватиме пам’яті робочої області запитів ..

Пам'ять робочої області є частиною буферного пулу SQL Server (вона виділяється як частина буферного пулу), а максимальна пам'ять робочої області становить 75% пам'яті, виділеної в буферний пул. За замовчуванням один запит не може отримати більше 25% пам’яті робочої області (у SQL 2008 / SQL 2012 - під контролем групи робочих навантажень за замовчуванням губернатора за межі поля).

Шукаю підтвердження мого розуміння

1) Враховуючи, що система з 48 ГБ оперативної пам’яті та максимальною пам'яттю сервера, налаштована на 40 ГБ, означає це, що максимальна пам'ять робочої області обмежена 30 ГБ, і один запит не може отримати пам’ять робочої області (пам’ять запитів) більше 10 ГБ. Тож якщо у вас поганий запит, що працює з мільярдом рядків, який робить масовий хеш-приєднання, і вам потрібно більше 10 Гб оперативної пам’яті (пам’ять робочої області), чи було б навіть байдуже пройти цю чергу надання пам’яті або відразу пролити на диск?

2) Якщо запиту, який виконує операцію масового сортування, було призначено пам'ять робочої області 5 Мб і під час виконання запиту, якщо оптимізатору запитів зрозуміти, що через погану статистику або відсутні індекси, для цього запиту потрібно буде 30 Мб пам'яті робочої області, негайно перекинеться до tempdb. Навіть якщо система має достатньо пам’яті робочої області під час виконання, коли запит перевищить задану пам’ять робочої області під час виконання, він повинен буде перекинутися на диск. Чи правильно я розумію?

Відповіді:


13

було б навіть байдуже пройти цю чергу надання грамоти пам'яті або одразу ж пролити на диск?

Це не працює так. Після того, як був обраний план, який вимагає надання пам’яті, запит повинен отримати грант, щоб він пройшов через чергу. Розлив, якщо такий є, відбувається набагато пізніше в циклі виконання. Запит не може вирішити продовжуватись без грантів та замість них. Він повинен отримати грант і, базуючи це, розпочати виконання. Якщо грант виявиться недостатнім (через погану оцінку або через отримання набагато меншої дотації, ніж просили), запит буде змушений розливатися.

якщо оптимізатор запитів зрозуміє, що це через погану статистику або відсутні показники

Строго кажучи, це не оптимізатор, це виконання запиту. Оптимізатор запитів має лише слово у вирішенні плану, але як тільки план буде обраний та запущений у виконання, оптимізатор не відображається. також "відсутні індекси" тут не грають ніякої ролі. Відсутній індекс може змусити поганий план, але він не може впливати на те, як виконується той «поганий» план, оскільки цей план був побудований з урахуванням того, які саме індекси існують, щоб він точно знав, що може, а що не може робити. Проливання трапляються майже завжди через погані оцінки, тобто. погана статистика або алгоритми оцінювання поганої кардинальності в оптимізаторі та у виконанні (він стає дійсно складним, якщо ви заглибитесь у деталі, тому я зупинюсь тут).

Навіть якщо система має достатньо пам’яті робочої області під час виконання, коли запит перевищить задану пам’ять робочої області під час виконання, він повинен буде перекинутися на диск

На жаль, так. Однак оптимізатор повинен придумати план, який використовує наявну оперативну пам’ять.

Я рекомендую прочитати Розуміння грамоти на SQL-сервер - найкраща інформація з цього питання з великим запасом.


4
Remus Rusanu (MSFT) Я також заглянув у вашу сторінку блогу під час пошуку веб-пошуку відносно операторів, які потребують надання пам’яті запитів. Дякую, що ви справжній дорогоцінний камінь, що підтримує цей форум.
SQL Learner


Ремус, ця сесія на саміті PASS від Адама Маханіка дуже ретельна та уточнює будь-які питання, пов’язані з пам’яттю робочої області.
SQL Learner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.