Рекомендації по використанню індексів в таблицях, оптимізованих для пам’яті
При відсутності індексу для стовпця c1 SQL Server буде сканувати всю таблицю t, а потім фільтрувати рядки, які задовольняють умові c1 = 1. Однак, якщо t має індекс для стовпця c1, SQL Server може безпосередньо здійснювати пошук за значенням 1 і отримати потрібні рядки.
Для пошуку записів, що мають певне значення або діапазон значень, одного або декількох стовпців в таблиці SQL Server може використовувати індекс для цих стовпців, який прискорює пошук відповідних записів. Використання індексів підвищує продуктивність таблиць, збережених на диску, і таблиць, оптимізованих для пам'яті. Однак існують деякі відмінності в структурі індексу, які слід враховувати при роботі з таблицями, оптимізованими для пам'яті. (Індекси для таблиць, оптимізованих для пам'яті, називають індексами, оптимізованими для пам'яті.) Деякі з основних відмінностей вказані далі.
Оптимізовані для пам'яті індекси повинні створюватися за допомогою Інструкція CREATE TABLE (Transact-SQL). Дисковий індекси можуть створюватися за допомогою CREATE TABLE і CREATE INDEX.
Індекси, оптимізовані для пам'яті, існують тільки в пам'яті. Структури індексів не зберігаються на диск, а операції з індексами в мережі не записуються в журнал транзакцій. Структура індексу створюється в той момент, коли в пам'яті створюється таблиця, оптимізована для пам'яті, як при виконанні інструкції CREATE TABLE, так і при запуску бази даних.
Індекси, оптимізовані для пам'яті, є універсальними за своєю природою. Це означає, що всі стовпці включаються в індекс і для таблиць, оптимізованих для пам'яті, не потрібно пошук по закладках. Замість посилання на первинний ключ індекси, оптимізовані для пам'яті, просто включають покажчик пам'яті на фактичну рядок в структурі даних таблиці.
Поняття фрагментації і коефіцієнта заповнення незастосовні до індексів, оптимізованим для пам'яті. Для індексу, що зберігається на диску, фрагментація означає, що сторінки збалансованого дерева записуються на диск без будь-якого порядку. Індекси, оптимізовані для пам'яті, не заносяться на диск і не зчитуються з диска. Фактор заповнення в індексах зі структурою у вигляді збалансованого дерева, які зберігаються на диск, - це ступінь, до якої структура фізичної сторінки заповнюється даними. Структура індексу, оптимізованого для пам'яті, не має сторінок фіксованого розміру.
Існує два типи індексів, оптимізованих для пам'яті:
Некластерізованний хеш-індекси, які створені для уточнюючих запитів. Додаткові відомості про хеш-індексах см. В розділі Хеш-індекси. .
Некластерізованний індекси, які створюються для сканування діапазону і упорядкованого сканування.
При використанні хеш-індексу доступ до даних здійснюється через хеш-таблицю в пам'яті. Хеш-індекси не мають сторінок і завжди мають фіксований розмір. Однак хеш-індекс може містити порожні хеш-контейнери, що призводить до незначної втрати вільного місця. Значення, що повертаються запитом, що використовують хеш-індекс, не сортуються. Хеш-індекси оптимізовані для пошуку за індексом в предиката рівності, а також підтримують повне сканування індексу.
Некластерізованний індекси (НЕ хеш-індекси) підтримують всі, що підтримують хеш-індекси, а також операції пошуку в предиката нерівності (більше або менше) і порядок сортування. Рядки можна отримувати по порядку, зазначеному при створенні індексу. Якщо порядок сортування індексу збігається з порядком сортування, необхідним для конкретного запиту, наприклад якщо ключ індексу збігається з пропозицією ORDER BY, немає необхідності сортувати рядки в складі виконання запиту. Оптимізовані для пам'яті некластерізованний індекси однонаправлені. Вони не підтримують витяг рядків в порядку сортування, зворотному порядку сортування індексу. Наприклад, для індексу, визначеного як (c1 ASC), неможливо сканувати індекс в зворотному порядку, як (c1 DESC).
Кожен індекс використовує пам'ять. Хеш-індекси використовують фіксований розмір пам'яті, який залежить від числа контейнерів. У некластерізованних індексів споживання пам'яті є функцією від числа рядків і розміру ключових стовпців індексу з деякими додатковими витратами в залежності від робочого навантаження. Пам'ять для індексів, оптимізованих для пам'яті, - це додаткова пам'ять, яка відокремлена від пам'яті, використовуваної для зберігання рядків в таблицях, оптимізованих для пам'яті.
Повторювані ключові значення завжди ділять один і той же хеш-контейнер. Якщо хеш-індекс містить багато повторюваних ключових значень, підсумкові довгі ланцюжки хешування погіршать продуктивність. Конфлікти хеша, які відбуваються в будь-якому хеш-індексі, в подальшому знизить продуктивність в цьому сценарії. З цієї причини, якщо число унікальних ключів індексу хоча б в 100 разів менше, ніж число рядків, ви можете знизити ризик конфліктів хеша, збільшивши число контейнерів (мінімум у вісім разів більше числа унікальних ключів індексу; зверніться до розділу Визначення правильного числа контейнерів для хеш -індекс за додатковою інформацією), або ви можете повністю усунути конфлікти хеша, використовуючи некластерізованний індекс.
Кожна оптимізована для пам'яті таблиця повинна містити як мінімум один індекс. Зверніть увагу, що кожне обмеження PRIMARY KEY неявно створює індекс. Тому, якщо таблиця має первинний ключ, вона має індекс. Первинний ключ є обов'язковим для надійної таблиці, оптимізованої для пам'яті.
При запиті оптимізованої для пам'яті таблиці продуктивність хеш-індексів вище, якщо пропозиція предиката містить тільки предикати рівності. Предикат повинен містити всі стовпці в ключі хеш-індексу. Хеш-індекс повернеться до сканування даного предиката нерівності.
Стовпець в таблиці, оптимізованої для пам'яті, може бути частиною хеш-індексу і некластерізованний індексу.
При запиті оптимізованої для пам'яті таблиці з предикатами нерівності некластерізованний індекси працюють краще, ніж некластерізованний хеш-індекси.
Для хеш-індексу потрібно ключ (для хеша) для пошуку в індексі. Якщо ключ індексу складається з двох стовпців, а ви надаєте тільки перший стовпець, у SQL Server не буде повним ключа для хешування. Це призведе до отримання плану запиту сканування індексу. Стовпці, які необхідно проіндексувати, визначаються на практиці.
Якщо в кількох рядках стовпчика в некластерізованний індексі міститься однакове значення (ключові стовпці індексу містять багато значень, що повторюються), продуктивність при оновленні, вставці і видаленні може знизитися. Один із способів підвищення продуктивності в цій ситуації - додавання ще одного стовпчика в некластерізованний індекс.
Операції з індексами з оптимізацією для пам'яті, збереженими на диску.
Некластерізованний хеш-індекс, оптимізований для пам'яті
Некластерізованний індекс, оптимізований для пам'яті