我正在尝试优化在Oracle数据库上运行的SQL查询。查询是:
composer require drupal/security_review:1.x-dev#35ebae44
1/2: http://packagist.org/p/provider-latest$00ceddb9dc4b7174d6c84c3e2ac454ccd6a6cb952ab70c1ab623371566d63754.json
2/2: http://packagist.org/p/provider-2018-04$1ce22045b6ddc998c850721c3db7f2902d0d37ae5989b30f0fb40ebfa5e91833.json
Finished: success: 2, skipped: 0, failure: 0, total: 2
./composer.json has been updated
Gathering patches for root package.
> DrupalProject\composer\ScriptHandler::checkComposerVersion
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
Gathering patches for root package.
- Installing drupal/security_review (dev-1.x 35ebae44): Gathering patches for dependencies. This might take a minute.
Cloning 35ebae44 from cache
Writing lock file
Generating autoload files
> DrupalProject\composer\ScriptHandler::createRequiredFiles
TABLE有1亿多行,并且经常更新。看起来像:
SELECT Col_5, Col_10, Col_15, Col_20, ..., Col_100
FROM TABLE
WHERE Col_5 = 37 AND Col_10 IS NOT NULL
我的查询返回了大约一千万行,但是运行大约需要30分钟。我应该补充一点,该查询通过pd.read_sql(SQL_query,data_connection)读入Python中的Pandas DataFrame中。使用Python之后,所有后续数据操作都将在几秒钟内完成。出于这个原因,我已经排除了简单地添加更多WHERE子句以减少返回的行数的可能性,因为我希望对所有返回的1000万左右行执行操作。
不幸的是,创建索引不是一种选择。鉴于此限制,我是否仍然可以加快查询速度?
谢谢!
答案 0 :(得分:2)
您的查询返回表的约10%的行。它从整个行中选择多个列。假设所发布的样本数据具有代表性,那么数据不会成簇,并且选定的行将贯穿整个表格。
因此索引编制对您没有帮助。您需要全表扫描。
对查询运行一个解释计划,以确保您正在使用一个计划。如果由于某种原因您正在运行某种形式的索引读取修复(例如,通过刷新过时的统计信息)。除此之外,没有很多方法可以调整全表扫描:如果您拥有Enterprise Edition和多个CPU,那么并行查询可能会有所帮助。
但是,让我们回退一分钟。
“我的查询返回了大约一千万行,但是运行大约需要30分钟。”
瓶颈在哪里?几乎可以肯定不是数据库。 1000万行(约20列)的数据量很大,但是对一个表的全表扫描应该在几分钟之内运行,甚至要少得多(取决于服务器的强大程度)。
很有可能是网络(除非您在本地运行此查询,也就是说熊猫客户端在数据库服务器上)。您正在网络上传递许多数据包。您可能会遇到可用带宽的限制,请与您的网络管理员联系(或安装wireshark!)。如果网络延迟是问题,请检查设置pd.read_sql() chunksize
是否有帮助。
要考虑的另一件事是客户端内存:数据帧是内存中的结构,因此您加载的数据可能比客户端可以处理的更多。您可以采取任何减少所选数据总量的措施来解决问题。重新查看查询的投影并删除后续处理不需要的任何列。
'EXPLAIN PLAN FOR命令未返回任何内容'
EXPLAIN PLAN填充一个表。 Find out more。您需要查询表以制定计划。 DBMS_XPLAN内置软件包是您最好的朋友。 Check it out。某些IDE(例如PL / SQL Developer)会透明地处理此问题。