Чи споживають індекси пам'ять?


10

Я тільки починаю дізнаватися про використання пам'яті на SQL Server. Під час використання запиту у відповіді на питання SQL Server 2008 R2 "Ghost Memory"? , Я виявив, що одна база даних займає левову частку місця в буферному пулі. Подивившись далі, використовуючи sys.allocation_unitsі sys.indexes, я підтвердив, що це, ймовірно, спричинено великим використанням індексів у базі даних. Більшість індексів є кластерними.

Інший розробник баз даних вважає, що у нас виникають проблеми з пам'яттю на сервері - що запити починають тривати довго, оскільки немає пам'яті.

Моє запитання тут - чи використання цих індексів та їх існування в буферному пулі забирає пам'ять, доступну для інших процесів?


2
"Another database developer believes we are having memory issues on the server"- на основі чого? Скільки оперативної пам’яті має сервер, які параметри пам’яті екземпляра та скільки пам’яті споживається кеш процедури?
Джон Сейгель

На основі тривалих часів запитів і дивлячись на диспетчера завдань - який мій дослідження вказав, що це "брудний, брудний брехун" (спасибі Brent Ozar - brentozar.com/archive/2011/09/… ). Я можу виявити, що немає проблеми з пам’яттю - я дотримуюся всіх пропозицій, наведених у цих коментарях та відповідях!
JHFB

2
Оскільки ми перекочуємо 8 кульок тут, я думаю, що запити працюють повільно, оскільки їх написав той "інший" розробник баз даних ...
Рем Русану

Відповіді:


12

Так, сторінки даних використаного індексу, кешовані в буферному пулі, займуть місце в кеші даних . Але не дозволяйте це відмовитись від використання індексів (спочатку кластерний індекс - це фактичні дані таблиці, тому врахуйте це також). Використання індексів (правильно розроблених та впроваджених, звичайно) є хорошою справою.

Проблеми з вашою пам'яттю, швидше за все, не мають індексів на ваших таблицях . Зануріться в питання пам'яті, які саме проблеми? У вас низька тривалість життя сторінки ? Як налаштована ваша пам'ять на сервері? Чи є максимальна пам'ять сервера низькою, що обмежує розмір буферного пулу?

Щоб отримати розбивку на сторінки покажчиків у кеші даних, можна виконати наступний запит:

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type

Щоб отримати ці статистичні дані за базою даних:

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc

Пристойна (?) Тривалість життя сторінки - 4234. Мені потрібно дослідити коефіцієнт потрапляння кеш-пам'яті буфера і вивчити інші частини.
JHFB

Цей PLE взагалі не відображає тиску пам'яті. Будь-яке, що перевищує 1000, як правило, є прийнятним.
Томас Стрінгер

Коефіцієнт попадання в кеш-пам'ять буфера може бути дуже оманливим, або виходити із зовнішнього вигляду і марним. Див. Великі дебати на SQL Server: коефіцієнт удару кеш-буфера від @JonathanKehayias.
Марк Сторі-Сміт

@ MarkStorey-Smith Помітив, дякую за вказівник!
Томас Стрінгер

@JHFB Зробимо крок назад. Що змушує вас думати, що у вас тиск на пам'ять?
Томас Стрінгер

7

Індекси споживають буферний простір пулу, так. Це ще одна причина, чому ви повинні подбати про свою стратегію індексації та мінімізувати дублікати.

Я підтвердив, що це, ймовірно, викликано великим використанням індексів у базі даних. Більшість індексів є кластерними.

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

Статті Кімберлі Тріппа про кластерні ключові варіанти є чудовим посиланням на це.


+1 Про те, що статті пані Трипп є EPIC щодо кластеризації ключів ...
Fabricio Araujo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.