楼主: wolfop

还是查询优化的问题,可能有点怪

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
51#
发表于 2024-12-22 10:37 | 只看该作者
什么索引都不建,也没慢

  1. SQL> create table range_a(id number);
  2. 已用时间:  00: 00: 00.01
  3. SQL> create table range_b(start_id number,end_id integer,type number);
  4. 已用时间:  00: 00: 00.01
  5. SQL> insert into range_a
  6.   2  select round(dbms_random.value(1,25000000)) from dual connect by level<=200000;
  7. 已用时间:  00: 00: 01.14
  8. SQL> insert into range_b
  9.   2  select 10000*(level-1)+3000 as start_id, 10000*level as end_id , level as type
  10.   3  from dual connect by level<=2000
  11.   4  order by dbms_random.value;
  12. 已用时间:  00: 00: 00.01
  13. SQL> explain plan for SELECT ID, TYPE
  14.   2  FROM range_a A,range_b B
  15.   3  WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;
  16. 已用时间:  00: 00: 00.04
  17. SQL> select * from table(dbms_xplan.display);

  18. PLAN_TABLE_OUTPUT
  19. ------------------------------------------------------------------------------------------------------------------------
  20. Plan hash value: 1183490394

  21. ----------------------------------------------------------------------------------------
  22. | Id  | Operation            | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
  23. ----------------------------------------------------------------------------------------
  24. |   0 | SELECT STATEMENT     |         |  1086K|    53M|       |  1183   (6)| 00:00:15 |
  25. |   1 |  MERGE JOIN          |         |  1086K|    53M|       |  1183   (6)| 00:00:15 |
  26. |   2 |   SORT JOIN          |         |  2000 | 78000 |       |     4  (25)| 00:00:01 |
  27. |   3 |    TABLE ACCESS FULL | RANGE_B |  2000 | 78000 |       |     3   (0)| 00:00:01 |
  28. |*  4 |   FILTER             |         |       |       |       |            |          |
  29. |*  5 |    SORT JOIN         |         |   217K|  2758K|  8536K|  1119   (1)| 00:00:14 |
  30. |   6 |     TABLE ACCESS FULL| RANGE_A |   217K|  2758K|       |    85   (2)| 00:00:02 |
  31. ----------------------------------------------------------------------------------------

  32. Predicate Information (identified by operation id):
  33. ---------------------------------------------------

  34.    4 - filter("A"."ID"<="B"."END_ID")
  35.    5 - access("A"."ID">="B"."START_ID")
  36.        filter("A"."ID">="B"."START_ID")

  37. Note
  38. -----
  39.    - dynamic sampling used for this statement (level=2)
  40. 已用时间:  00: 00: 00.04
  41. SQL> create table range_result (id number, type number);
  42. 已用时间:  00: 00: 00.00
  43. SQL> --原sql:
  44. SQL> insert into range_result
  45.   2  SELECT ID, TYPE
  46.   3  FROM range_a A,range_b B
  47.   4  WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;
  48. 已用时间:  00: 00: 47.07
  49. SQL> select count(*) from range_result;

  50.   COUNT(*)
  51. ----------
  52.     112182
  53. 已用时间:  00: 00: 00.01
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
52#
发表于 2024-12-22 10:53 | 只看该作者
不加索引用NL JOIN提示,比merge join快

  1. SQL> explain plan for insert into range_result
  2.   2  SELECT /*+ use_nl(b a)*/ ID, TYPE
  3.   3  FROM range_a A,range_b B
  4.   4  WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;
  5. 已用时间:  00: 00: 00.03
  6. SQL> select * from table(dbms_xplan.display);

  7. PLAN_TABLE_OUTPUT
  8. ------------------------------------------------------------------------------------------------------------------------
  9. Plan hash value: 747228058

  10. -----------------------------------------------------------------------------------------
  11. | Id  | Operation                | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
  12. -----------------------------------------------------------------------------------------
  13. |   0 | INSERT STATEMENT         |              |  1086K|    53M|   167K  (2)| 00:33:26 |
  14. |   1 |  LOAD TABLE CONVENTIONAL | RANGE_RESULT |       |       |            |          |
  15. |   2 |   NESTED LOOPS           |              |  1086K|    53M|   167K  (2)| 00:33:26 |
  16. |   3 |    TABLE ACCESS FULL     | RANGE_B      |  2000 | 78000 |     3   (0)| 00:00:01 |
  17. |*  4 |    TABLE ACCESS FULL     | RANGE_A      |   543 |  7059 |    84   (2)| 00:00:02 |
  18. -----------------------------------------------------------------------------------------

  19. Predicate Information (identified by operation id):
  20. ---------------------------------------------------

  21.    4 - filter("A"."ID">="B"."START_ID" AND "A"."ID"<="B"."END_ID")

  22. Note
  23. -----
  24.    - dynamic sampling used for this statement (level=2)
  25. 已用时间:  00: 00: 00.06
  26. SQL> truncate table range_result;
  27. 已用时间:  00: 00: 00.26
  28. SQL> insert into range_result
  29.   2  SELECT /*+ use_nl(b a)*/ ID, TYPE
  30.   3  FROM range_a A,range_b B
  31.   4  WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;
  32. 已用时间:  00: 00: 31.48
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
53#
发表于 2024-12-22 11:41 | 只看该作者
duckdb默认的IE join就很快

  1. D:\>duckdb
  2. v1.1.3 19864453f7
  3. Enter ".help" for usage hints.
  4. Connected to a transient in-memory database.
  5. Use ".open FILENAME" to reopen on a persistent database.
  6. D create table range_a(id int);
  7. D create table range_b(start_id int,end_id integer,type int);
  8. D select random();
  9. ┌─────────────────────┐
  10. │      random()       │
  11. │       double        │
  12. ├─────────────────────┤
  13. │ 0.40514024486765265 │
  14. └─────────────────────┘
  15. D insert into range_a
  16. 路 select round(random()*25000000) from range(200000);
  17. D insert into range_b
  18. 路 select 10000*(level-1)+3000 as start_id, 10000*level as end_id , level as type
  19. 路 from range(2000)t(level)
  20. 路 order by random();
  21. D create table range_result (id int, type int);
  22. D explain insert into range_result
  23. 路 SELECT ID, TYPE
  24. 路 FROM range_a A,range_b B
  25. 路 WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;

  26. ┌─────────────────────────────┐
  27. │┌───────────────────────────┐│
  28. ││       Physical Plan       ││
  29. │└───────────────────────────┘│
  30. └─────────────────────────────┘
  31. ┌───────────────────────────┐
  32. │           INSERT          │
  33. └─────────────┬─────────────┘
  34. ┌─────────────┴─────────────┐
  35. │         PROJECTION        │
  36. │    ────────────────────   │
  37. │             id            │
  38. │            type           │
  39. │                           │
  40. │         ~2500 Rows        │
  41. └─────────────┬─────────────┘
  42. ┌─────────────┴─────────────┐
  43. │          IE_JOIN          │
  44. │    ────────────────────   │
  45. │      Join Type: INNER     │
  46. │                           │
  47. │        Conditions:        ├──────────────┐
  48. │       id >= start_id      │              │
  49. │        id <= end_id       │              │
  50. │                           │              │
  51. │         ~2500 Rows        │              │
  52. └─────────────┬─────────────┘              │
  53. ┌─────────────┴─────────────┐┌─────────────┴─────────────┐
  54. │         SEQ_SCAN          ││         SEQ_SCAN          │
  55. │    ────────────────────   ││    ────────────────────   │
  56. │          range_a          ││          range_b          │
  57. │                           ││                           │
  58. │      Projections: id      ││        Projections:       │
  59. │                           ││          start_id         │
  60. │          Filters:         ││           end_id          │
  61. │ id<=19990000 AND id IS NOT││            type           │
  62. │            NULL           ││                           │
  63. │                           ││          Filters:         │
  64. │                           ││  end_id>=69 AND end_id IS │
  65. │                           ││          NOT NULL         │
  66. │                           ││                           │
  67. │        ~200000 Rows       ││         ~2000 Rows        │
  68. └───────────────────────────┘└───────────────────────────┘
  69. D .timer on
  70. D insert into range_result
  71. 路 SELECT ID, TYPE
  72. 路 FROM range_a A,range_b B
  73. 路 WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;
  74. Run Time (s): real 0.177 user 0.453125 sys 0.031250
  75. D from range_a limit 3;
  76. ┌──────────┐
  77. │    id    │
  78. │  int32   │
  79. ├──────────┤
  80. │ 14138313 │
  81. │ 17794606 │
  82. │  7518591 │
  83. └──────────┘
  84. Run Time (s): real 0.003 user 0.000000 sys 0.000000
  85. D from range_b limit 3;
  86. ┌──────────┬─────────┬───────┐
  87. │ start_id │ end_id  │ type  │
  88. │  int32   │  int32  │ int32 │
  89. ├──────────┼─────────┼───────┤
  90. │  9443000 │ 9450000 │   945 │
  91. │  4573000 │ 4580000 │   458 │
  92. │  6063000 │ 6070000 │   607 │
  93. └──────────┴─────────┴───────┘
  94. Run Time (s): real 0.003 user 0.000000 sys 0.000000
  95. D from range_result limit 3;
  96. ┌─────────┬───────┐
  97. │   id    │ type  │
  98. │  int32  │ int32 │
  99. ├─────────┼───────┤
  100. │ 7699929 │   770 │
  101. │ 7699883 │   770 │
  102. │ 7699823 │   770 │
  103. └─────────┴───────┘
  104. Run Time (s): real 0.003 user 0.000000 sys 0.000000
复制代码

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表