问题描述
嗨,
我们正在将数据库从db2迁移到Oracle。
在db2上,我们可以使用DSC列支持主键索引。假设:
-ColumnA ASC
-ColumnB DSC
-ColumnC ASC
如果您需要使用第一个1/2列进行一些范围扫描,这很有用。
由于AFAIK,在Oracle中,DSC列是基于功能的,我应该为主键索引定义DSC列吗?
还是我应该将它们定义为 “所有ASC”?
另外: 我们在其他索引上使用NLS_SORT来获得正确的西班牙语排序。我也应该在PK索引上使用NLS_SORT吗?或者也许我应该有2个索引: 一个 “所有asc”,另一个用于DSC和NLS_SORT?
非常感谢。
致以最良好的问候。
我们正在将数据库从db2迁移到Oracle。
在db2上,我们可以使用DSC列支持主键索引。假设:
-ColumnA ASC
-ColumnB DSC
-ColumnC ASC
如果您需要使用第一个1/2列进行一些范围扫描,这很有用。
由于AFAIK,在Oracle中,DSC列是基于功能的,我应该为主键索引定义DSC列吗?
还是我应该将它们定义为 “所有ASC”?
另外: 我们在其他索引上使用NLS_SORT来获得正确的西班牙语排序。我也应该在PK索引上使用NLS_SORT吗?或者也许我应该有2个索引: 一个 “所有asc”,另一个用于DSC和NLS_SORT?
非常感谢。
致以最良好的问候。
专家解答
可悲的是,你不能使用基于功能的索引来监管主键:
您可以创建两个索引。PK的常规 (唯一)。和基于函数的查询:
但我会避免这种情况,除非你从下降指数中获得真正的好处。
如果您有很多类似的索引,优化器可能会很难选择 “正确” 的索引。随着索引的下降,你所谈论的就是避免排序操作。我希望查询使用PK的前两列来定位只有几行。所以在大多数情况下,节省的钱会很小。
但当然,这只是我的猜测。测试你的数据,看看它是如何发挥作用的!
create table t ( x int, y int, z int ); create unique index pk on t (x, y desc, z); alter table t add primary key (x, y, z) using index pk; ORA-14196: Specified index cannot be used to enforce the constraint.
您可以创建两个索引。PK的常规 (唯一)。和基于函数的查询:
create unique index pk2 on t (x, y, z); alter table t add primary key (x, y, z) using index pk2;
但我会避免这种情况,除非你从下降指数中获得真正的好处。
如果您有很多类似的索引,优化器可能会很难选择 “正确” 的索引。随着索引的下降,你所谈论的就是避免排序操作。我希望查询使用PK的前两列来定位只有几行。所以在大多数情况下,节省的钱会很小。
但当然,这只是我的猜测。测试你的数据,看看它是如何发挥作用的!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




