作为数据库开发人员,我正在从SQL Server过渡到Oracle,并且已经在这里找到了一些很棒的资源(如何从SQL Server DBA过渡到Oracle?以及作为DBA,我将如何从Oracle过渡到SQL Server。 ?),但是我很难找到有关在Oracle中使用索引组织表的良好信息。
在我的前世中,我们在OLTP-ish数据集市中广泛使用了SQL Server中的聚集索引,并取得了巨大的成功。索引组织表是否可以方便地用作Oracle中的工具?
作为数据库开发人员,我正在从SQL Server过渡到Oracle,并且已经在这里找到了一些很棒的资源(如何从SQL Server DBA过渡到Oracle?以及作为DBA,我将如何从Oracle过渡到SQL Server。 ?),但是我很难找到有关在Oracle中使用索引组织表的良好信息。
在我的前世中,我们在OLTP-ish数据集市中广泛使用了SQL Server中的聚集索引,并取得了巨大的成功。索引组织表是否可以方便地用作Oracle中的工具?
Answers:
如果要从SQL Server过渡到Oracle,建议先尝试使用堆表,因为它们是在Oracle中存储数据的标准形式。对于大多数工作负载,在DML和查询性能方面,Oracle中具有常规索引的堆表是最平衡的存储形式。
如果以后发现性能问题或瓶颈,则应研究专用的高级存储方法,例如IOT,分区,集群,反向键索引等。
特别是关于物联网,我建议不要将其普遍使用,因为初学者可能会遇到很多“陷阱”:
Oracle中的IOT与SS中的聚簇索引并不完全相同,因为Oracle统计信息包括行的物理散布,而SS统计信息中不包括物理位置。有关更多信息,请参见Lewis和Fritchey之间关于Oracle和Sql Server中的统计数据的辩论。(http://www.red-gate.com/products/oracle-development/deployment-suite-for-oracle/education/webinars/webinar-statistics-oracle-sql-server-jonathan-lewis )这就是为什么集群的原因SS中的索引比堆好。聚集索引将物理位置数据添加到统计信息中。当您知道索引提供了将要搜索的数据行的共置时,IOT就是很好的选择,例如,order_date上的索引和客户的订单表将是一个很好的IOT。
文森特对物联网的警告提出了一些要点,但您也可以从中获得一些重大利益。
我个人认为它们在Oracle中没有得到充分利用,应该被广泛考虑-不仅仅是解决性能问题的方法。由于您必须重新创建表以在IOT和堆之间进行转换,因此,除非性能问题严重,否则在经常使用且频繁使用的数据库上不太可能发生此更改。
Martin Widlake撰写了许多有关物联网的文章。使用它们可以获得一些明显的好处:
但是,要获得这些好处,您需要一个表(几乎)始终在查询中包含主键的前导列,并且您可能一次要获取几行。此类表的一些常见示例是:
customer_addresses
表中,查找一个客户的所有地址,而不是查找一个地址的所有客户,是非常普遍的。缺点是插入数据的速度较慢,因此您需要权衡成本和收益。归根结底,这取决于了解您的数据并了解如何使用它来指导决策。