我正在使用Oracle数据库,有些情况下我们从表中查询所有行(选择少数但不是所有列名)(在某些情况下,在表上创建的视图)。我想提高我的选择查询的性能。我在表格中使用主键。
例如,有一个表:表(id,a,b,c,d,e,f)有100k行。我查询如下:
SELECT c, d, f FROM Table;
我尝试过使用MATERIALIZED VIEWS,但几乎没有发现性能提升。
我考虑过使用PARTITIONS,但后来我认为我正在扫描所有行(但不是所有列),所以在这种情况下分区帮助会是什么?
答案 0 :(得分:1)
评论时间有点长。
如果您选择所有行,则表示您正在选择大量数据。删除少量列可能对性能影响很小 - 除非您遗漏的列非常宽。毕竟,数据库引擎仍然需要读取所有数据页,并返回几乎所有数据。
如果你有宽列,那么你可以通过使用物化视图(带有相关的开销)来减少时间,或者将常用列存储在一个表中,将其余列存储在另一个表中(垂直分区) )。
最后,100,000条记录是返回应用程序的大量记录。如果你能在数据库中做更多工作并减少返回的数据量,我不会感到惊讶。
答案 1 :(得分:1)
根据您的列类型/数据,100,000条记录不会太多,无法检索。如果您要检索大型类型,例如BLOB
和CLOB
,那就太多了。好吧,这一切都依赖于运行Oracle服务器的机器的配置,但我假设它具有合理的配置。
我在一个包含386,843行的Oracle表中执行了一个类似于你的查询...它在8.25秒内为每行返回了三个NUMBER
列...考虑到数据量,它不是那个慢......
EXPLAIN PLAN
表示它执行了索引FAST FULL SCAN
,但在检索到所有数据时,FULL TABLE SCAN
也不应代表性能问题。
我认为你应该检查两点:
多少客户端会在同一时间执行此功能?可以说,500个同时访问......它对您的数据库/网络来说是一个很大的负担,即使有一些数据缓存......
网络延迟了你的工作吗?你可能会在这里发现一个问题......
您是否只是按需加载数据"?每次检索5,000行。这是处理用例的更好方法。这样,表/索引分区可能会有很大的帮助。