我正在使用52 CPU的Oracle EXADATA数据服务器,但是当我在并行提示为128的全表扫描上查询一个包含900万条记录的表时,查询的输出需要20多分钟才能获取数据,而数据库级别没有利用率。在这个查询中可以改进什么?
parallel_max_servers参数如下所示:
Current_utilization: 432
Max Utilization: 1040
Initial Allocation: 1040
Limit Value: 32767
使用的查询如下:
Alter session force parallel;
Select /* +PARALLEL(128) */ * FROM TABLE;
已按照问题陈述中所述进行尝试
1条答案
按热度按时间rekjcdws1#
select * from table
的东西,都是有用的。这里有一些东西要检查。
1.请确保您的提取大小至少在数千。1或10或100的提取大小可能会导致太多的网络往返,如果延迟在几十毫秒或更高,这可能会使提取数百万行非常低效。将获取大小增加到适当的大小。检查你的网络延迟(使用
ping
),以确保它是合理的。您可以通过在共享池(v$sql
)中找到您的SQL并将rows_processed
除以fetches
来确定获取大小。1.你的行列非常宽。如果每行有数千个字节,那么通过网络获取900万行并写入磁盘所需的工作量要比每条只有几十个字节的900万行多得多。考虑省略可能不需要的过大列。
1.您的应用程序处理行的速度很慢。它在分类吗?在那几排上转来转去做些什么?调整应用程序。
1.应用程序向文件写入行的速度很慢。您正在写入的文件系统可能很慢(例如,NFS到某个远程网络)。请您的操作系统管理员或存储团队查看此信息。如果写入过程受I/O限制(不受CPU限制),请考虑内联压缩,以便写入磁盘的字节更少。
最后,当您查看了所有这些选项后,仍然需要拉取以更快地进行,您可能需要建立多个并发连接,每个连接都拉取表的一部分。例如,如果有10个进程选择
select * from table where MOD(pkcol,10)=:thread-1
,并且它们绑定了各自的线程号,那么它们将各自提取表的1/10。虽然这意味着数据库端的工作量增加了10倍,但它将克服网络、应用程序处理行的限制,并在一定程度上帮助通过使用多个CPU写入文件。如果这有帮助,但您的DBA抱怨负载(这 * 可能 * 导致Example存储单元上的CPU过多,因此不应过度使用),那么请考虑对表进行分区,并让各个并发进程拉取各个分区。这将把存储单元上的负载降低到可接受的水平。