Чи є спосіб змусити індекс залишитися в пам'яті за допомогою SQL Server 2008?


10

У мене є таблиця з кількома мільйонами рядків, з якої мені потрібно час від часу запускати деякі запити. Перший запит, як правило, досить повільний (близько 10 с), а наступні запити, як правило, набагато швидше (близько 1 с). Через кілька годин знову починається повільний / швидкий цикл.

Я перевірив у своєму плані виконання, що весь необхідний індекс присутній і належним чином використаний, і я припускаю, що різниця в продуктивності пов'язана з тим, що індекс насправді є в пам'яті для наступних запитів (я правий, чи є інші можливі причини?)

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

Крім очевидного виправлення «додати більше оперативної пам’яті», я замислювався над тим, щоб сценарії фіктивних запитів виконуватись щогодини, щоб змусити індекс повернутись у пам’ять.

Чи є більш елегантний спосіб це зробити? Як спосіб натякнути SQLServer, що якщо у нього достатньо пам'яті, щоб зберегти один єдиний індекс, він повинен бути таким?

Я знаю, що, як правило, найкраще - це не зіпсувати SQLServer стосовно таких речей, але незвичний характер мого запиту (працює дуже рідко, але критичний за часом) змушує мене вважати, що це має сенс (якщо можливо) .

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

Відповіді:


13

Раніше була DBCC PINTABLEкоманда, але я вважаю, що перестала працювати в 6.5 або, можливо, 7.0. Заява, ймовірно, все ще підкаже, що вона спрацювала, якщо ви спробуєте її, але вона просто повертається, вона справді є неоперативною.

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

Для яких індексів у пам’яті ви можете отримати приблизне уявлення sys.sm_os_buffer_descriptors. Я опублікував поради про це:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


Гм, згідно з цим сценарієм, таблиця 75 Мб займає 900 МБ буферного пулу. Це нормально / можливо?
db2

1
@ db2, скільки у вас є індексів?
JNK

2
Крім того, наскільки це фрагментарно ... це вимірювання сторінок, а не даних. Ваші сторінки можуть бути відносно порожніми, і це може сприяти завищеній мірі.
Аарон Бертран

0

Спробуйте використовувати підказкиKEEPPLAN та KEEPPLAN FIXED запитати їх .

KEEPPLAN змушує оптимізатор запитів розслабити передбачуваний поріг перекомпіляції для запиту.

KEEPFIXED PLAN змушує оптимізатор запитів не перекомпілювати запит через зміни в статистиці. Вказавши KEEPFIXED PLAN, переконайтеся, що запит буде перекомпільований лише у тому випадку, якщо схема базових таблиць змінена або якщо sp_recompile виконаний проти цих таблиць.

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