表量子查询优化SQL

开发发来条SQL,7分32秒出236行数据
 Select Ot.Guest_Id,
       Ot.Order_Id,
       Ot.Guest_Name,
       Oct.Guest_Name,
       Ot.Ticket_Price,
       Oct.Ticket_Price
  From t_To_Order_Tickets Ot
  Left Join (Select    Oct.*,
                    (Select Order_Id
                       From t_To_Order_Change Oc
                      Where Oct.Change_Order_Id = Oc.Change_Order_Id) Order_Id
               From t_To_Order_Change_Tickets Oct) Oct
    On Ot.Order_Id = Oct.Order_Id
   And Ot.Guest_Name = Oct.Guest_Name
    Where Ot.Order_Id > (Select Max(Order_Id) From t_To_Order_Info) - 200
    
Plan hash value: 3057350477
 
-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                           |   249K|    30M|       | 14809   (2)| 00:02:58 |
|*  1 |  HASH JOIN OUTER              |                           |   249K|    30M|  9248K| 14808   (2)| 00:02:58 |
|   2 |   TABLE ACCESS BY INDEX ROWID | T_TO_ORDER_TICKETS        |   249K|  6323K|       | 10597   (1)| 00:02:08 |
|*  3 |    INDEX RANGE SCAN           | TORDERINFO_PORDER_FK      | 44832 |       |       |    41   (3)| 00:00:01 |
|   4 |     SORT AGGREGATE            |                           |     1 |     6 |       |            |          |
|   5 |      INDEX FULL SCAN (MIN/MAX)| PK_T_TO_ORDER_INFO        |  3736K|    21M|       |     1   (0)| 00:00:01 |
|   6 |   VIEW                        |                           |   408K|    40M|       |  1493   (6)| 00:00:18 |
|   7 |    TABLE ACCESS FULL          | T_TO_ORDER_CHANGE_TICKETS |   408K|  7575K|       |  1493   (6)| 00:00:18 |
-------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("OT"."GUEST_NAME"="OCT"."GUEST_NAME"(+) AND "OT"."ORDER_ID"="OCT"."ORDER_ID"(+))
   3 - access("OT"."ORDER_ID"> (SELECT MAX("ORDER_ID") FROM "T_TO_ORDER_INFO" "T_TO_ORDER_INFO")-200)

分析:where后面的条件进不了内嵌视图,过滤条件没有,要把它那进去,这里要改写SQL
=================================================================== 
改为子查询后0.03秒出结果

优化后的SQL
 Select Ot.Guest_Id,
       Ot.Order_Id,
       Ot.Guest_Name,
       Ot.Ticket_Price,
   (select Guest_Name from t_To_Order_Change t1,t_To_Order_Change_Tickets t2 
  where t1.Change_Order_Id=t2.Change_Order_Id 
    and Ot.Order_Id=T1.order_id 
    and Ot.Guest_Name=t2.Guest_Name) xxx,
   (select Ticket_Price from t_To_Order_Change t1,t_To_Order_Change_Tickets t2 
  where t1.Change_Order_Id=t2.Change_Order_Id 
    and Ot.Order_Id=T1.order_id 
    and Ot.Guest_Name=t2.Guest_Name) yyy
  From t_To_Order_Tickets Ot
  Where Ot.Order_Id > (Select Max(Order_Id) From t_To_Order_Info) - 200    
  
Plan hash value: 3136190503
 
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                             |   249K|  6323K| 10598   (1)| 00:02:08 |
|*  1 |  TABLE ACCESS BY INDEX ROWID  | T_TO_ORDER_CHANGE_TICKETS   |     1 |    15 |     1   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                |                             |     1 |    26 |     3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| T_TO_ORDER_CHANGE           |     1 |    11 |     2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | TO_RELATIONCHANGE_FK        |     1 |       |     1   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN           | TORDERINFO_PORDER_CHANGE_FK |     1 |       |     1   (0)| 00:00:01 |
|*  6 |  TABLE ACCESS BY INDEX ROWID  | T_TO_ORDER_CHANGE_TICKETS   |     1 |    19 |     1   (0)| 00:00:01 |
|   7 |   NESTED LOOPS                |                             |     1 |    30 |     3   (0)| 00:00:01 |
|   8 |    TABLE ACCESS BY INDEX ROWID| T_TO_ORDER_CHANGE           |     1 |    11 |     2   (0)| 00:00:01 |
|*  9 |     INDEX RANGE SCAN          | TO_RELATIONCHANGE_FK        |     1 |       |     1   (0)| 00:00:01 |
|* 10 |    INDEX RANGE SCAN           | TORDERINFO_PORDER_CHANGE_FK |     1 |       |     1   (0)| 00:00:01 |
|  11 |  TABLE ACCESS BY INDEX ROWID  | T_TO_ORDER_TICKETS          |   249K|  6323K| 10597   (1)| 00:02:08 |
|* 12 |   INDEX RANGE SCAN            | TORDERINFO_PORDER_FK        | 44832 |       |    41   (3)| 00:00:01 |
|  13 |    SORT AGGREGATE             |                             |     1 |     6 |            |          |
|  14 |     INDEX FULL SCAN (MIN/MAX) | PK_T_TO_ORDER_INFO          |  3736K|    21M|     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("T2"."GUEST_NAME"=:B1)
   4 - access("T1"."ORDER_ID"=:B1)
   5 - access("T2"."CHANGE_ORDER_ID"="T1"."CHANGE_ORDER_ID")
   6 - filter("T2"."GUEST_NAME"=:B1)
   9 - access("T1"."ORDER_ID"=:B1)
  10 - access("T2"."CHANGE_ORDER_ID"="T1"."CHANGE_ORDER_ID")
  12 - access("OT"."ORDER_ID"> (SELECT /*+ */ MAX("ORDER_ID") FROM "T_TO_ORDER_INFO" 
              "T_TO_ORDER_INFO")-200)
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以将标子查询嵌套在 SELECT 语句中作为一个列,然后在外部 SELECT 语句中选择该列。例如: ``` SELECT column1, (SELECT COUNT(*) FROM my_table WHERE column2 = 'my_value') as scalar_subquery FROM my_table WHERE column1 = 'another_value'; ``` 在上面的示例中,标子查询 `(SELECT COUNT(*) FROM my_table WHERE column2 = 'my_value')` 返回一个值,该值作为一个名为 `scalar_subquery` 的列包含在结果集中。 如果你想要抓取标子查询SQL 语句,可以使用以下方法: 1. 将标子查询作为一个子查询,并将其结果集保存到一个临时表中,然后在外部查询中使用该临时表。例如: ``` CREATE TABLE temp_table AS SELECT COUNT(*) as count_value FROM my_table WHERE column2 = 'my_value'; SELECT column1, count_value FROM my_table, temp_table WHERE column1 = 'another_value'; ``` 在上面的示例中,第一个 SELECT 语句将标子查询的结果集保存到一个名为 `temp_table` 的临时表中,然后在第二个 SELECT 语句中使用该临时表。 2. 使用变来存储标子查询的结果,并将该变作为参数传递给外部查询。例如: ``` DECLARE @count_value INT; SELECT @count_value = (SELECT COUNT(*) FROM my_table WHERE column2 = 'my_value'); SELECT column1, @count_value FROM my_table WHERE column1 = 'another_value'; ``` 在上面的示例中,第一个 SELECT 语句将标子查询的结果保存到一个名为 `@count_value` 的变中,然后在第二个 SELECT 语句中使用该变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值