Мої знання нижчого рівня про SQL (Server 2008) обмежені, і зараз вони ставлять під сумнів наші DBA. Дозвольте мені пояснити (я згадав очевидні твердження в надії, що я маю рацію, але якщо ви бачите щось не так, будь ласка, скажіть мені) сценарій:
У нас є таблиця, в якій розміщено "Судові ухвали" для людей. Коли я створив таблицю, (Ім'я: CourtOrder), я створив її так:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
Потім я застосував некластеризований індекс до первинного ключа (для ефективності). Мої причини полягають у тому, що це унікальне поле (первинний ключ), і його слід індексувати, в основному, для цілей відбору, як ми частоSelect from table where primary key = ...
Потім я застосував CLUSTERED індекс на PersonId. Причиною було групувати замовлення для конкретної людини фізично, оскільки переважна більшість робіт - це отримання замовлень на людину. Так,select from mytable where personId = ...
Мене зараз потягнуло на це. Мені сказали, що слід класти кластерний індекс на первинний ключ, а звичайний індекс на personId. Це здається мені дуже дивним. По-перше, чому б ви поставили кластерний індекс на унікальний стовпець? що це кластеризація? Напевно, це марно трапляється кластерний індекс? Я вважав би, що звичайний індекс буде використаний в унікальній колонці. Також кластеризація індексу означатиме, що ми не можемо кластеризувати інший стовпець (Один на таблицю, правда?).
Міркування мені сказали, що я помилився, що вони вважають, що введення кластерного індексу в PersonId зробить вставки повільними. Для 5% -ного збільшення швидкості вибору ми отримаємо 95-відсоткове зниження швидкості для вставок та оновлень. Це правильно і дійсно?
Вони кажуть, що, оскільки ми кластеризуємо personId, SQL Server повинен переставляти дані коли-небудь, коли ми вставляємо або вносимо зміни до PersonId.
Тож я запитав, чому SQL має поняття КЛАСТИРОВАНИЙ ІНДЕКС, якщо це так повільно? Це так повільно, як вони говорять? Як я маю налаштувати свої індекси для досягнення оптимальної продуктивності? Я б подумав, що SELECT використовується більше, ніж INSERT ... але вони кажуть, що у нас є проблеми з блокуванням в INSERTS ...
Сподіваюся, хтось може мені допомогти.