2017-05-05 106 views
0

整理一张大桌子比方说,我有一个个人数据表Table1first_namelast_namedate_of_birthaddress。数百万行。我应该创建哪些索引,以便能够快速运行以下查询:查询和甲骨文12C

select * from Table1 where date_of_birth > some_date and contains(address,'some street') > 0 order by first_name offset 100 rows fetch next 5 rows only;

select * from Table1 where date_of_birth > some_date and contains(address,'some street') > 0 order by last_name offset 100 rows fetch next 5 rows;

这是一个简化的情况,但我试图搞清楚的是如何建立一个数据库结构的网站类似易趣,即几个排序顺序,几个数字参数和文字描述。我已经有address文本索引已经

+0

如果你添加一些东西你试过和如何查询这将是更好表现(执行持续时间) –

+0

这对StackOverflow来说太宽泛了。除了其他事情之外,你还想如何使用eBay? – APC

+1

但你能评论我描述的情况吗?只有一个表格和两个排序顺序。这是非常具体的 – Toolkit

回答

0

它取决于各种条件,如果索引是有用的或没有。数据的

  • 分布(在表格中的date_of_birth例如范围)
  • 选择参数(例如,与date_of_birth > 1900-01-01选择)
  • 预期的结果集的选择(通过顺序)
  • 表大小
  • 您的数据库环境
  • ...

在某些情况下,全表扫描是更好的选择。

为了确定这一点,你必须研究你的表的数据,检查你的商业案例,调查执行计划

在某些情况下,你可以提高你的SELECT语句。

例如

限制date_of_birth的范围与上限。

where date_of_birth between some_date and some_date +7 

这不等同于你的SELECT语句(只在此范围内按名称排序),但也许不够好,显著提高性能

+0

我不认为DB环境与这个问题有关。数据库大小在后数百万条记录中提及。出生日期范围也没有太大的作用。你做过类似的任务吗?你如何解决大集合的分类(或预分类)?假设你有1000万条记录,你搜索的查询会给你带来5000个,你想要得到5个。目前我正在使用预分类的mviews,但还有其他的选择。请具体说明 – Toolkit

+0

对不起,但答案与您的问题一样具体。数据库环境设置与此问题有关(例如OPTIMIZER_INDEX_COST_ADJ)。如果您的表格包含date_of_birth,范围为1920-01-01至2017-01-01(均匀分配),并且您选择了'date_of_birth> 01-01-1930',那么date_of_birth上的索引将无用。 –

+0

OPTIMIZER_INDEX_COST_ADJ默认为100%,date_of_birth是均匀分布的。任何解决方案 – Toolkit