我有一个简单的查询:
select *
from TABLE t
where t.something = 'code I am interested in';
该表有大约1300万条记录。而这个简单的查询大约需要10秒钟。然后我在列t.something
上创建了一个索引,查询需要30毫秒。
不幸的是,我无法在生产服务器上使用相同的方法,因为我没有对生产数据库的写入权限。除了索引之外,还有其他方法可以优化这个简单的查询吗?
编辑 - 不幸的是,即使它不会影响现有表,我也无法创建新表。我与我的一位同事聊天,他建议使用日期范围,以便我多次运行查询,但日期范围不同。感谢你们的评论。
答案 0 :(得分:1)
实际上,没有。
如果问题是您对未索引的值进行了查询(听起来就是这样),解决该性能问题的唯一方法是在数据库中创建一个索引(或其他一些结构)您的查询可以使用。显然,你个人并不需要成为那样做的人。但您需要与DBA或开发人员合作,或者与谁决定创建索引以便为查询创建适当的索引。
潜在地,您可以修改查询,以便获得相同的信息,但允许您利用表上的现有索引。如果存在与您正在寻找的特定代码相关联的其他索引属性,则在这些值上添加谓词可以提高性能。例如,如果您知道t.some_indexed_column
对于您感兴趣的行总是42,那么在您的查询中添加and t.some_indexed_column = 42
可能会允许Oracle使用some_indexed_column
上的现有索引更有效地获得结果。
答案 1 :(得分:0)
如果不添加索引,您将无法在生产数据库服务器上将1300万行表扫描改进为索引查找。
您可能希望对维护生产数据库并请求添加索引的人员进行信息和性能分析。
答案 2 :(得分:0)
假设您在表格中有主键,则可以使用该列而不是在选择查询中使用*。这将减少相当长的时间。
答案 3 :(得分:0)
在许多情况下,虽然显然我无法对您的特定公司或代理商发表评论,但员工至少可以在自己的架构中获得创建和维护表的权限,因为它对实际可能使用的其他架构没有影响。应用
你应该检查的是你是否拥有"创建表"特权。如果这样做,您可以在自己的架构中创建表。它与" CREATE ANY TABLE"非常不同。特权,你不太可能拥有,至少在生产中。
您可以运行以下命令检查是否具有CREATE TABLE权限:
select * from user_sys_privs
如果您这样做,那么您可以执行以下操作:
create table table2
( col1 col1_definition,
col2 col2_definition,
something something_def );
insert into table2
select * from table;
create index tab2_idx on table2 (something);
select * from table2 where something = 'code I am interested in';
INSERT需要一段时间才能运行,也许可以在一夜之间完成。但是,一旦完成,您就已经在'某些事情上创建了索引。字段 - 如图所示 - 您的查询将对其非常有效地运行。
如果该表中的数据经常更改,您可能想要创建一个物化视图(也可以将其编入索引)。