2011-07-22 45 views
2

我有一个操作是sql插入。我有另一个操作是SQL选择和更新。表格大小为300K-1Million。如果我把索引,这是否意味着我的插入和更新会减慢,选择会更快。但通常select会更快,插入和更新会有多慢?一般来说,在300K-1Million的记录中,一般性能会不会提高呢?SQL性能;插入,选择和更新

+1

通常,这取决于您的应用程序的目的和用途。你会做更多的读取而不是写入?你有沉重的负担吗?索引通常有帮助,但是查询也需要被智能地编写,以便以一种好的方式使用这些索引。还有其他解决方案,如表分区,索引分区,集群等。 –

+0

我在哪里可以读取这些解决方案,如表分区,索引分区,集群?这些解决方案是否适用于各种商业数据库? – user84592

+0

我会建议查看您正在使用的数据库引擎的文档。 –

回答

1

如果只有这样简单的生活,答案一如既往;这取决于。

想象一下你的桌子是你自己喜欢的人的“小黑书”。每个页面都有一个不同的人nameaddressdate of birth等(图书=表,页=记录)

现在,你只希望每个人在那里一次的基础上,他们的名字和姓氏(唯一的关键,可能是主键)。但是你也希望它们在Order中,这样它们很容易查找。您决定按姓氏排序,对于姓氏相同的人,按照姓氏排序(聚集索引,它们的物理顺序,收益选择数据)

现在,聚集索引,你可以很快地在你的书中查找你的朋友。但是,如果你添加一个新的人,你不能只是把它们添加到最后,你必须找到合适的地方,他插入它们。 (插入索引的开销)

如果他们不方便地更改他们的名字(比如结婚),您必须找到他们,更改名称,并将其移动到书中的其他位置。幸运的是,索引确实使它更容易找到它们;将它们转移到书中的新地方是一件痛苦的事情,但不会像试图在随机订购的书中找到它们那样糟糕。 (索引的更新开销)

最终,有一天,当你意识到自己在记忆生日时非常糟糕。所以你转向你的小背本。不幸的是,他们是按照他们的名字命令的,而不是他们的出生日期;找出谁的生日即将到来是一个真正的痛苦!所以你在后面创建一个小索引。有序的生日列表以及当天出生的每个人的姓名。 (二级指数,根据出生日期选择福利)

如果您发现某人的出生日期错了,但是您必须改变一些事情; DoB在他们的页面上,以及在DoB索引中的位置。同样,当您为本书添加新人时,您必须找到插入这些人的正确页面,但也需要在DoB索引中添加他们的姓名。 (更新和插入开销)

幸运的是,更新他们的地址不是问题。找到他们,改变地址,然后完成。直到有一天,你创建一个地址索引以及...


总之...
1.索引可以帮助特定种类的选择性能
2.它总是增加了一个插入成本
3.可加快寻找要更新的记录
4.但是,还可以在索引字段

你指数的交易和余额取决于你使用的数据的添加开销更新。大量的插入和更新?很多选择?许多不同的选择保证倍数索引,等等?

你可以用科学做到这一切,但实际上它感觉像一门艺术。

+0

这是一个非常好的解释。特别是在短的部分。 – user84592

2

我的个人经验:使用索引时速度增益巨大,更新/插入速度略有下降。

难道你不能创建一个&没有索引的测试用例吗?

1

这取决于您要创建的索引类型。

Clustered索引增加选择速度(对于大数据范围非常适用),但需要更长的时间插入新行,因为每次插入新数据时都会重新排序(服务器保持物理顺序以提高数据访问速度)。 关键列的更新也会影响非聚簇索引,因此在聚簇表上创建非聚簇索引时请记住它。

创建你应该准确地做任何指数反正当,所以我想收集更多的时候统计查询其运行(SELECTINSERTUPDATE),然后决定创建哪个索引上的列。

1

当表格包含与场景中行数相同的行时,索引需要达到可接受的性能。减缓插入和更新的索引开销仅在大型批次插入/更新时才引人注意;索引开销对孤立插入/更新事务的影响可以忽略不计。