我对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上存在锁定问题...
希望可以有人帮帮我。