【发布时间】:2015-05-27 14:02:28
【问题描述】:
最近我使用Oracle 11g 数据库做作业。我有 12 个表,例如 trip_data_11 和 trip_data_12。 它们具有相同的结构并且记录的数量几乎相同。我在每个表上创建了相同的索引。 所以对于trip_data_11表:
create index pick_add_11 on trip_data_11(pickup_longitude,pickup_latitude);
create index drop_add_11 on trip_data_11(dropoff_longitude,dropoff_latitude);
对trip_data_12进行同样的操作。
然后我使用下面的 select 语句来选择每天的出租车号码。
SELECT
COUNT(DISTINCT(td.medallion)) AS taxi_num
FROM
SYS.TRIP_DATA_11 td
WHERE
(td.pickup_longitude >= -74.2593 AND td.pickup_longitude <= -73.7011
AND td.pickup_latitude >= 40.4770 AND td.pickup_latitude <= 40.9171
)
AND
(td.dropoff_longitude >= -74.2593 AND td.dropoff_longitude <= -73.7011
AND td.dropoff_latitude >= 40.4770 AND td.dropoff_latitude <= 40.9171
)
AND
td.trip_distance > 0
AND
td.passenger_count > 0
GROUP BY
regexp_substr(td.pickup_datetime,'\d{4}-\d{2}-\d{2}')
ORDER BY
regexp_substr(td.pickup_datetime,'\d{4}-\d{2}-\d{2}');
耗时38sec。当我将表名改为SYS.TRIP_DATA_12时,问题来了,耗时2个多小时。 更重要的是,它并没有结束。我不知道为什么。
今天我问我的同学,他说:清除缓存。所以我用下面的语句来做。
alter system flush shared_pool;
alter system flush buffer_cache;
alter system flush global context;
现在,当我对 SYS.TRIP_DATA_11 使用相同的选择语句时,我得到的性能与 SYS.TRIP_DATA_12 一样差。为什么?
【问题讨论】:
-
首先,永远不要在
SYS模式中创建对象。SYS的行为与其他模式不同。不知道这是否是一个问题,但它无济于事。桌子有多大?表和索引的统计信息是否准确且最新? -
感谢您的建议。但是我创建的所有表都使用 sys 帐户。这些表包含几乎 14,000,000。昨天,我创建了表并使用 Ttoad 加载数据,然后创建了索引。所以表和索引的统计数据是准确和最新的。
-
如果您打算使用
SYS帐户,预计您可能会遇到看起来像错误的奇怪行为。您在此过程的哪个阶段收集了统计数据? -
刚刚获得一个月每天的出租车数量。
标签: oracle performance query-optimization