【发布时间】:2011-11-28 04:11:54
【问题描述】:
我对 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 = ...
然后我在 PersonId 上应用了一个 CLUSTERED 索引。原因是对特定人的订单进行物理分组,因为绝大多数工作都是为一个人获得订单。所以,select from mytable where personId = ...
我现在已经被吸引了。有人告诉我,我们应该将聚集索引放在主键上,将普通索引放在 personId 上。这对我来说似乎很奇怪。首先,为什么要将聚集索引放在唯一列上?它是什么聚类?这肯定是对聚集索引的浪费吗?我曾相信正常索引将用于唯一列。此外,对索引进行聚类意味着我们不能对不同的列进行聚类(每个表一个,对吗?)。
我被告知我犯了一个错误的原因是他们认为在 PersonId 上放置一个聚集索引会使插入变慢。对于 5% 的选择速度增益,我们的插入和更新速度将降低 95%。这正确有效吗?
他们说,因为我们对 personId 进行了聚类,所以当我们插入或更改 PersonId 时,SQL Server 必须重新排列数据。
然后我问,如果 SQL 这么慢,为什么会有 CLUSTERED INDEX 的概念?有他们说的那么慢吗?我应该如何设置索引以实现最佳性能?我原以为 SELECT 比 INSERT 使用得更多……但他们说我们在 INSERTS 上遇到了锁定问题……
希望有人可以帮助我。
【问题讨论】:
标签: sql performance sql-server-2008 indexing