DBAPUB 发表于 2013-12-10 15:26

〇〇 发表于 2013-12-9 16:42 static/image/common/back.gif
别怕sql麻烦,关键是少用资源

不是麻烦,是这样开销返回更大,3个变量意味着排序3次,给你看看例子SQL>            select ge.v_targ_id,sum(decode(sign(mileage*6400-time*24*250),-1,time,0))*24*3600 as total_time,
             round(sum(decode(sign(mileage*6400-time*24*250),-1,mileage,0))*6400,2) as total_mileage
2    3                from ( select v_equp_id,(t2d_data_date - d_data_date) as time,
4                     acos(round((sin(n_data_y) * sin(t2n_data_y) +cos(n_data_y) * cos(t2n_data_y) *cos(t2n_data_x - n_data_x)),12)) as mileage
5                  from
6                        (select ga.v_equp_id,
7                           ga.d_data_date,
8                           lead(d_data_date,1,d_data_date) over (order by v_equp_id, d_data_date) as t2d_data_date,
9                           (ga.n_data_x * 3.14159265358979323846 / 180) as n_data_x,
                         (lead(n_data_x,1,n_data_x) over (order by d_data_date)) * 3.14159265358979323846 / 180 as t2n_data_x,
10   11                           (ga.n_data_y * 3.14159265358979323846 / 180) as n_data_y,
12                           (lead(n_data_y,1,n_data_y) over (order byv_equp_id, d_data_date)) * 3.14159265358979323846 / 180 as t2n_data_y
13                      from gps_data ga
                   where ga.d_data_date >= to_date('2013-12-07','yyyy-mm-dd')
14   15                     and ga.d_data_date <to_date('2013-12-08','yyyy-mm-dd')) ) t,gps_equp ge
16                     where ge.v_equp_id = t.v_equp_id and t.time > 0
17                     group by ge.v_targ_id;

191 rows selected.

Elapsed: 00:00:20.50

Execution Plan
----------------------------------------------------------
Plan hash value: 3945074772

------------------------------------------------------------------------------------------------------------------
| Id| Operation                     | Name   | Rows| Bytes |TempSpc| Cost (%CPU)| Time   | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |   312 | 26520 |       |2862   (1)| 00:00:35 |       |       |
|   1 |HASH GROUP BY                |          |   312 | 26520 |       |2862   (1)| 00:00:35 |       |       |
|*2 |   HASH JOIN                   |          |   312 | 26520 |       |2861   (1)| 00:00:35 |       |       |
|   3 |    VIEW                     | VW_GBC_5 |   330 | 13200 |       |2724   (1)| 00:00:33 |       |       |
|   4 |   HASH GROUP BY             |          |   330 | 21780 |       |2724   (1)| 00:00:33 |       |       |
|*5 |      VIEW                     |          |   126K|8157K|       |2724   (1)| 00:00:33 |       |       |
|   6 |       WINDOW SORT             |          |   126K|4326K|5968K|2724   (1)| 00:00:33 |       |       |
|   7 |      WINDOW SORT            |          |   126K|4326K|5968K|2724   (1)| 00:00:33 |       |       |
|   8 |         PARTITION RANGE SINGLE|          |   126K|4326K|       |   369   (1)| 00:00:05 |   158 |   158 |
|   9 |          TABLE ACCESS FULL    | GPS_DATA |   126K|4326K|       |   369   (1)| 00:00:05 |   158 |   158 |
|10 |    TABLE ACCESS FULL          | GPS_EQUP | 22853 |1004K|       |   136   (0)| 00:00:02 |       |       |
------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("GE"."V_EQUP_ID"="ITEM_1")
   5 - filter("T2D_DATA_DATE"-"D_DATA_DATE">0)


Statistics
----------------------------------------------------------
          1recursive calls
          1db block gets
       1824consistent gets
          0physical reads
          0redo size
      12761bytes sent via SQL*Net to client
      655bytes received via SQL*Net from client
         14SQL*Net roundtrips to/from client
          2sorts (memory)
          0sorts (disk)
      191rows processed

DBAPUB 发表于 2013-12-10 15:29

看错了,是变小了

〇〇 发表于 2013-12-10 15:38

DBAPUB 发表于 2013-12-10 15:29 static/image/common/back.gif
看错了,是变小了

时间缩短了,autotracecost不准,
用select * from table(dbms_xplan.display_cursor('sql_id/hash_value', child_cursor_number, 'advanced')),要指定SQL_ID和Child Cursor Number。
另外注意,当对并行执行的SQL使用GATHER_PLAN_STATISTICS hint时,FORMAT参数得是'ALLSTATS ALL',不能是常规的'ALLSTATS LAST'。

dingjun123 发表于 2013-12-10 15:44

本帖最后由 dingjun123 于 2013-12-10 15:44 编辑

貌似你改写后结果集都不一样了啊


jlandzpa 发表于 2013-12-10 15:53

竟然有三角函数,oracle应该不擅长这些的吧

DBAPUB 发表于 2013-12-10 16:02

本帖最后由 DBAPUB 于 2013-12-10 16:04 编辑

dingjun123 发表于 2013-12-10 15:44 static/image/common/back.gif
貌似你改写后结果集都不一样了啊
结果集是一样的,一个返回设备id,一个是对象id,设备比对象多。所以一个是300多,一个是200。我看的不是cost,是“1824consistent gets”,一致性读

DBAPUB 发表于 2013-12-10 16:05

jlandzpa 发表于 2013-12-10 15:53 static/image/common/back.gif
竟然有三角函数,oracle应该不擅长这些的吧

java、c++?

DBAPUB 发表于 2013-12-10 16:06

jlandzpa 发表于 2013-12-10 15:53 static/image/common/back.gif
竟然有三角函数,oracle应该不擅长这些的吧

刚看到您的徽章,这么元老的都出来啦。。。。

lastwinner 发表于 2013-12-10 16:16

3.14159265358979323846 / 180
这些位数都对,但干嘛不用反三角函数表示?
pi/180=arctan(1)*4/180=>oracle写法: atan(1)*4/180或asin(1)*2/180也行

用了分析函数lead或lag后,mt就不需要了,t的order by 也不需要了,因为lead/lag自带你所需要的排序

〇〇 发表于 2013-12-10 16:17

jlandzpa 发表于 2013-12-10 15:53 static/image/common/back.gif
竟然有三角函数,oracle应该不擅长这些的吧

如果用低精度的浮点类型代替number,还是可以提高的
SQL> select sum(cos(cast(level/10 as binary_double)))from dual connect by level<=5e4;

SUM(COS(CAST(LEVEL/10ASBINARY_DOUBLE)))
---------------------------------------
                           -1.03E+001

已用时间:00: 00: 00.23
SQL> set num 20
SQL> /

SUM(COS(CAST(LEVEL/10ASBINARY_DOUBLE)))
---------------------------------------
                   -1.029409575842E+001

已用时间:00: 00: 00.21
SQL> select sum(cos(level/10)) from dual connect by level<=5e4;

SUM(COS(LEVEL/10))
--------------------
-10.2940957584186055

已用时间:00: 00: 01.19
页: 1 [2] 3
查看完整版本: 帮忙看一个行驶里程的,大家看看是否有优化的空间