Чи є "уникнути створення кластерного індексу на основі ключа, що збільшується" міфом з SQL Server 2000 днів?


22

Наші бази даних складаються з безлічі таблиць, більшість з яких використовують цілий сурогатний ключ в якості основного ключа. Близько половини цих первинних ключів знаходяться в стовпцях ідентичності.

Розробка бази даних розпочалася ще за часів SQL Server 6.0.

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

Тепер, використовуючи SQL Server 2005 та SQL Server 2008, у мене сильне враження, що обставини змінилися. Тим часом ці стовпчики первинного ключа є ідеальними першими кандидатами для кластерного індексу таблиці.

Відповіді:


34

Міф сходить до SQL Server 6.5, який додав блокування рівня рядків . І натякнув тут Кален Ділейні .

Це було пов'язано з "гарячими точками" використання сторінок даних та тим, що була заблокована ціла сторінка 2k (SQL Server 7 та версії 8k), а не вставлений рядок Редагувати, лютий 2012

Знайдена авторитетна стаття Кімберлі Л. Тріпп

"Кластерні дебати в індексах тривають ..."

Точкові точки - це те, що ми сильно намагалися уникнути PRIOR на SQL Server 7.0 через блокування рівня сторінки (і саме тут термін «гаряча точка» став негативним терміном). Насправді це не повинно бути негативним терміном. Однак, оскільки механізм зберігання даних був перестановлений / перероблений (у SQL Server 7.0) і тепер включає справжнє блокування рівня рядків, ця мотивація (щоб уникнути точкових точок) вже не існує.

Редагувати, травень 2013 року

Посилання у відповіді lucky7_2000, здається, говорить про те, що гарячі точки можуть існувати, і вони викликають проблеми. Однак у статті використовується унікальний кластерний індекс на TranTime. Для цього потрібно додати уніфікатор. Що означає індекс не суворо монотонно зростаючого (і занадто широкого). Посилання у цій відповіді не суперечить цій відповіді чи моїм посиланням

На особистому рівні я прокинувся в базах даних, де я вставляв десятки тисяч рядків в секунду в таблицю, в якій стовпчик bigint ІДЕНТИЧНОСТІ як кластеризований ПК.


23

Підсумовуючи це, у сучасних версіях SQL Server в даний час кращим варіантом є кластерний ключ у стовпчику ідентичності.


Короткий, простий, до речі, так що це отримує мій +1. Не забудьте ознайомитись із посиланням на SQLSkills, оскільки там є велика кількість хорошої інформації.
AndrewSQL

12
Це звучить як команда. Ніяких пояснень чи логіки, чому ми повинні ...
gbn

Це не тільки звучить як команда, але й неправильно. Будь-яка база даних, що займає дуже велику кількість вставок / сек, вплине на точку доступу, якщо ви користуєтеся послідовними ключами.
Томас Кейсер

1
Я сказала, що віддано перевагу, не потрібно. Для звичайних додатків, що складають 98% баз даних у світі, кластерний ключ у стовпчику ідентичності працює чудово.
mrdenny

10

У Кімберлі Трипп є фантастична публікація в блозі про цю тему. Я міг би перефразувати, але повірте, я б не робив це справедливо. Прочитайте. http://www.sqlskills.com/BLOGS/KIMBERLY/post/Ever-increasing-clustering-key-the-Clustered-Index-Debateagain!.aspx

Перебуваючи там, перегляньте кілька інших її публікацій на тему кластеризації ключів. З її сайту є хороше багатство знань.


4

перевірити цю публікацію:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/monotonically-increasing-clustered-index-keys-can- why-latch-contention.aspx

створення кластерного індексу на основі приросту ключа може створити гарячі точки, які погані для продуктивності ...


1
+1 за надання цього посилання. Тут є кілька цікавих підказок. Але я думаю, що результат був би набагато переконливішим, якби він порівняв заданий сценарій з одним із створенням некластеризованого індексу cidx_trantime на tblTransaction (TranTime) або якусь іншу альтернативу. Пам'ятайте, що коли ви генеруєте таку велику кількість даних, повинні бути ефективні способи їх отримання, ви не можете просто кинути кожну річ у купу.
bernd_k

@bernd_k: це поганий приклад посилання. Дочірній стіл має поганий неповторний кластерний ключ, для якого потрібен внутрішній уніфікатор
gbn

1
Спробуйте потім цей експеримент: kejser.org/boosting-insert-speed-by-generating-scalable-keys
Thomas Kejser
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.