2011-09-17 55 views
1
  1. 当为字段上的唯一约束创建数据库索引或为多字段唯一约束创建多个索引时,是否可以在查询对象时用于提高效率的相同索引,与其他数据库索引的使用方式大致相同?我的猜测是,为独特约束创建的索引与为提高效率而创建的索引相同,并且唯一约束本身是额外的东西,但我对数据库并不熟悉。
  2. 是否有可能以任何方式通过长事务和高并发等破坏一个唯一的约束,包括多字段约束(例如field_a和field_b是唯一的)?或者,独特的约束是否提供100%的保护。

回答

2

至于问题1:

是 - 这些都是指标在定义和查询计划例如用于提高性能,使用任何其他指标......你可以定义唯一索引,而不确定了“独特的约束“顺便说一句。

至于问题2:

是 - 这是一个100%的保护,只要数据库引擎是ACID兼容和可靠(在这方面即没有错误),只要你暂时不禁用约束。

+0

谢谢。顺便说一句,你是什么意思关于“可以定义独特的...没有定义...”?两者有什么区别? – orokusaki

+0

一个约束是一个“逻辑定义”(可以是唯一的或外键或...) - 在“唯一”的情况下,它通常通过(自动)创建唯一索引来实现。索引仅仅是一个索引 - 唯一的索引恰好强制唯一性,而首先出于性能原因他们是“发明的”......有关解释,请参阅http://asktom.oracle.com/pls/asktom/ ?在fp = 100:11:0 :::: P11_QUESTION_ID:3051352977204 – Yahia

2
  1. 是的。一个唯一的约束是一个索引(在SQL Server中)并且将(可以)用于查询计划

  2. 这是不可能的。无论事务时间或并发问题如何,您都无法将数据存储在违反约束的表中(至少在SQL Server中)。顺便说一句,如果你的交易时间太长,你担心这一点,你需要重新考虑你在这个交易中做了什么。即使您不会违反长事务操作的数据库约束,您也会遇到其他问题。

1

问题与您的问题是,它是非常笼统的,不适合具体的实施。因此,任何答案都是非常通用的。

在这个心:

  1. 每当一个数据库认为,通过索引访问可能加快的东西,它会这么做 - 独特性是不关心这里。如果在一张桌子上存在许多指标,体面的数据库将尝试使用“最佳”指标 - 关于实际“最佳”含义的不同观点。 但是许多数据库只会使用一个索引得到一行。因此,根据经验,DB通常会尝试使用indizes,其中查找会导致行数尽可能少。一个独特的指标是相当不错的。 :-)

  2. 其实这不是一个点,而是两个不同点:

    • 一个体面 DB不会破坏你的索引即使长时间运行的事务或高并发性。至少不是故意的。如果是这样,它可能是数据库软件中的一个错误,必须快速修复非常 - 否则数据库供应商可能会以非常激烈的方式遭受声誉损失。另一种可能性是,它不是一个体面的数据库,而只是一个持久的散列表或类似的东西。如果数据确实是很重要,那么高并发性和长时间交易是没有任何借口的。

    • 多值唯一索引是一个野兽:数据库实现是不同的,当一个或多个关键列包含NULL时,他们认为它是“唯一”的。例如,你可以看看PostgreSQL文档关于这一点:http://www.postgresql.org/docs/9.1/interactive/indexes-unique.html

希望这使得一些事情说清楚。