Powerful Explain in MySQL 5.6

1,645 views

Published on

Published in: Technology

Powerful Explain in MySQL 5.6

  1. 1. 1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  2. 2. Powerful EXPLAIN inMySQL 5.6Evgeny PotemkinMySQL Optimizer team2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  3. 3. Program Agenda  Introduction  Optimizer trace  EXPLAIN in JSON format  Explaining INSERT, UPDATE, DELETE3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  4. 4. Graphic Section Divider4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  5. 5. Optimizer Trace5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  6. 6. Optimizer trace: quick startmysql> SET optimizer_trace= “enabled=on“, end_markers_in_json=on;mysql> SELECT * FROM orders WHERE customer_id <> 6;mysql> SELECT trace FROM information_schema.OPTIMIZER_TRACE;mysql> SET optimizer_trace="enabled=off"; QUERY SELECT * FROM orders WHERE customer_id <> 6 TRACE “steps”: [ { "join_preparation": { "select#": 1,… } … } …] MISSING_BYTES_BEYOND_MAX_MEM_SIZE 0 INSUFFICIENT_PRIVILEGES 06 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  7. 7. Optimizer trace: what’s inside Steps – Join preparation  Modifications to subquery  Expanded query – Join optimization  Range optimizer info  Plan generation process  Condition optimization  Processing of ORDER/GROUP BY – Join execution  Tmp tables related info7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  8. 8. Optimizer trace: examplemysql> SET optimizer_trace="enabled=on";mysql> SELECT * FROM t1,t2 WHERE f1=1 AND f1=f2 AND f2>0;mysql> SELECT trace FROM information_schema.optimizer_trace;mysql> SET optimizer_trace="enabled=off";8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  9. 9. Optimizer trace: example join_optimization / steps / condition_processing "condition": "WHERE", "original_condition": "((`t1`.`f1` = 1) and (`t1`.`f1` = `t2`.`f2`) and (`t2`.`f2` > 0))", "steps": [ { "transformation": "equality_propagation", "resulting_condition": "((`t2`.`f2` > 0) and multiple equal(1, `t1`.`f1`, `t2`.`f2`))" }, { "transformation": "constant_propagation", "resulting_condition": "((1 > 0) and multiple equal(1, `t1`.`f1`, `t2`.`f2`))" }, { "transformation": "trivial_condition_removal", "resulting_condition": "multiple equal(1, `t1`.`f1`, `t2`.`f2`)" } ] /* steps */9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  10. 10. Optimizer trace: example join_optimization / row_estimation / table : t1, range_analysis "table_scan": { "analyzing_range_alternatives": { "rows": 5, "range_scan_alternatives": [ { "cost": 5.1085 "index": "f1", } /* table_scan */, "ranges": [ "1 <= f1 <= 1“ ] /* ranges */, "potential_range_indices": [ { "index_dives_for_eq_ranges": true, "index": "f1", "usable": true, "rows": 2, "cost": 3.41, "key_parts": [ "f1“ ] /* key_parts */ } "chosen": false, ] /* potential_range_indices */, "cause": "cost" "best_covering_index_scan": { } "index": "f1", "cost": 2.093, "chosen": true ] /* range_scan_alternatives */, } /* best_covering_index_scan */, "analyzing_roworder_intersect": { "group_index_range": { "usable": false, "cause": "too_few_roworder_scans" "chosen": false, "cause": "not_single_table" } /* analyzing_roworder_intersect */ } /* group_index_range */, } /* analyzing_range_alternatives */10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  11. 11. Optimizer trace: example join_optimization / considered_execution_plan "plan_prefix": [ ] /* plan_prefix */, "plan_prefix": [ "`t2`“ ] /* plan_prefix */, "table": "`t2`", "table": "`t1`", "best_access_path": { "best_access_path": { "considered_access_paths": [ { "considered_access_paths": [ { "access_type": "scan", "rows": 3, "access_type": "ref", "index": "f1", "cost": 2.6051, "chosen": true "rows": 2, "cost": 3.4698, "chosen": true } ] /* considered_access_paths */ }, { } /* best_access_path */, "access_type": "scan", "using_join_cache": true, "cost_for_plan": 2.6051, "rows": 2, "cost": 3.8087, "rows_for_plan": 3, "chosen": true "rest_of_plan": [ { } ] } /* best_access_path */, … next iteration … => "cost_for_plan": 6.4138, } ] /* rest_of_plan */ "rows_for_plan": 6, "chosen": true11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  12. 12. Optimizer trace: example join_optimization / plan refinement { { "attaching_conditions_to_tables": { "refine_plan": [ "original_condition": { "((`t1`.`f1` = 1) and (`t2`.`f2` = 1))", "table": "`t1`" "attached_conditions_summary": [ { }, "table": "`t1`", "attached": null { }, { "table": "`t2`", "table": "`t2`", "attached": "(`t2`.`f2` = 1)" "access_type": "table_scan" } } ] /* attached_conditions_summary */ ] /* refine_plan */ } /* attaching_conditions_to_tables */ } },12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  13. 13. Optimizer trace: controls  optimizer-trace  optimizer-trace-features – greedy_search – range_optimizer – dynamic_range – repeated_subselect  optimizer-trace-limit  optimizer-trace-offset  optimizer-trace-max-mem-size  end-markers-in-json13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  14. 14. Optimizer trace: exploring  mysql> pager less  SELECT TRACE INTO DUMPFILE <filename> FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;  JSONView for Firefox  Pretty JSON for Chrome  A registry patch for IE14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  15. 15. EXPLAIN in JSON format15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  16. 16. Traditional EXPLAINid select type table type possible key key len ref rows extra keys 1 PRIMARY cust index cust_id, cust_name 40 const 10 Using where; Start cust_name materialize; Scan 1 PRIMARY orders ref order_id order_id 8 ordid 32 Using where; End materialize; Using join buffer (Block Nested Loop) 1 PRIMARY <derived2> ref <auto_key0> <auto_key0> 23 vc1 100 Using index 2 DERIVED flights ALL NULL NULL NULL NULL 10000 Using where; Start materialize; Scan 2 DERIVED storage eq_ref PRIMARY PRIMARY 8 fl_store 1 Using where; End materialize; Using join buffer (Block Nested Loop) 4 SUBQUERY buzz range buzzez buzzez 11 NULL 42 Using index; Using where 6 SUBQUERY shortage index shrt_idx shrt_idx 100 NULL 243 Using index; Using where16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  17. 17. Traditional EXPLAIN: Cons  Hard to read in complex cases  Unclear/non-obvious query structure in complex cases – Could take quite some time to see what’s going on  Limited information about query plan – How conditions are split? When a subquery is evaluated?  Hard to impossible to extend – Indication of a feature being used usually is limited to “Using <something>”17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  18. 18. EXPLAIN in JSON: Basics mysql> EXPLAIN SELECT * FROM t1; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 index NULL i 5 NULL 3 NULL18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  19. 19. EXPLAIN in JSON: Basics EXPLAIN "query_block": { "select_id": 1, "table": { "table_name": "t1", mysql> EXPLAIN FORMAT=JSON "access_type": "index", SELECT * FROM t1; "key": "i", "key_length": "5", "rows": 3, "filtered": 100, "using_index": true } /* table */ } /* query_block */19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  20. 20. EXPLAIN in JSON: Basics mysql> set end_markers_in_json = on; end_markers_in_json = off end_markers_in_json = on } } /* table */ } } /* query_block */ } } ] ] /* query_specifications */ } } /* union_result */ } } /* query_block */ } } /* materialized_from_subquery */ } } /* table */ } } /* grouping_operation */ } } /* ordering_operation */ } } /* query_block */20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  21. 21. EXPLAIN in JSON: Basics mysql> EXPLAIN SELECT * FROM t1 WHERE str IS NULL AND id > 0; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 ref str str 11 const 1 Using index condition; Using where21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  22. 22. EXPLAIN in JSON: Basics EXPLAIN "query_block": { "select_id": 1, "table": { "table_name": "t1", mysql> EXPLAIN FORMAT=JSON "access_type": "ref", SELECT * FROM t1 WHERE str IS "possible_keys": [ "str“ ], "key": "str", "key_length": "11", NULL AND id > 0; "ref": [ "const"], "rows": 1, "filtered": 100, "index_condition": "isnull(`test`.`t1`.`str`)“ "attached_condition": "(`test`.`t1`.`id` > 0)" } /* table */ } /* query_block */22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  23. 23. EXPLAIN in JSON: Basics mysql> EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a BETWEEN 0000-00-00 AND 1001-01-01; possible key id select type partitions table type key ref rows extra keys len 1 SIMPLE pNULL, t1 index a a 4 NULL 6 Using where; p0001-01-01, Using index p1001-01-0123 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  24. 24. EXPLAIN in JSON: Basics EXPLAIN "query_block": { "select_id": 1, "table": { "table_name": "t1", mysql> EXPLAIN FORMAT=JSON "partitions": [ "pNULL", "p0001-01-01", SELECT * FROM t1 WHERE a "p1001-01-01"], "access_type": "index", BETWEEN 0000-00-00 AND 1001- "possible_keys": [ "a" ], 01-01; "key": "a", "key_length": "4", "rows": 6, "filtered": 33.333, "using_index": true, "attached_condition": "(`test`.`t1`.`a` between 0000-00-00 and 1001-01-01)" }}24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  25. 25. EXPLAIN in JSON: Basics mysql> EXPLAIN SELECT * FROM t1 JOIN t2 USING(i); possible key id select type table type key ref rows extra keys len 1 SIMPLE t2 ALL NULL NULL NULL NULL 3 NULL 1 SIMPLE t1 index i i 5 NULL 3 Using where; Using index; Using join buffer (Block Nested Loop)25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  26. 26. EXPLAIN in JSON: Basics EXPLAIN { { "query_block": { "table": { "select_id": 1, "table_name": "t1", "nested_loop": [ "access_type": "index", { "possible_keys": [ "i" ], "table": { "key": "i", "key_length": "5", "table_name": "t2", "rows": 3, "filtered": 100, "access_type": "ALL", "using_index": true, "rows": 3, "using_join_buffer": "Block Nested Loop", "filtered": 100 "attached_condition": } /* table */ "(`test`.`t1`.`i` = `test`.`t2`.`i`)" }, } /* table */ … next table … => } ] } /* nested_loop */ } /* query_block */26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  27. 27. EXPLAIN in JSON: Basics MySQL Workbench 5.2 SELECT * FROM t1 JOIN t2 USING(i);27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  28. 28. EXPLAIN in JSON: more complex queries mysql> EXPLAIN FORMAT=JSON SELECT t1.a, MIN(t2.b) FROM t1 LEFT JOIN t2 ON t1.a=t2.a GROUP BY t1.a ORDER BY t1.b; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using temporary; Using filesort 1 SIMPLE t2 ref PRIMARY PRIMARY 4 test.t1.a 1 Using index28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  29. 29. EXPLAIN in JSON: more complex queries EXPLAIN "query_block": { mysql> EXPLAIN FORMAT=JSON "select_id": 1, SELECT t1.a, MIN(t2.b) "ordering_operation": { "using_temporary_table": true, FROM t1 LEFT JOIN t2 "using_filesort": true, "grouping_operation": { ON t1.a=t2.a "using_filesort": true, GROUP BY t1.a ORDER BY t1.b; "nested_loop": [ { “table” : {…} }, { “table” : {…} } ] /* nested_loop */ } /* grouping_operation */ } /* ordering_operation */ } /* query_block */29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  30. 30. EXPLAIN in JSON: more complex queries MySQL Workbench 5.2 SELECT t1.a, MIN(t2.b) FROM t1 LEFT JOIN t2 ON t1.a=t2.a GROUP BY t1.a ORDER BY t1.b;30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  31. 31. EXPLAIN in JSON: more complex queries mysql> EXPLAIN SELECT a, b FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 1 AS a, 2 AS b) t1 GROUP BY a ORDER BY b DESC; possible key id select type table type key ref rows extra keys len 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2 Using temporary; Using filesort 2 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used 3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used NULL UNION <union2,3> ALL NULL NULL NULL NULL NULL Using temporary RESULT31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  32. 32. EXPLAIN in JSON: more complex queries EXPLAIN "query_block": { "union_result": { "ordering_operation": { "using_temporary_table": true, "using_filesort": true, "table_name": "<union2,3>", "grouping_operation": { "query_specifications": [ { "using_temporary_table": true, "query_block": { "using_filesort": false, "table": { "table": { "message": "No tables used" "table_name": "t1", } } }, { "materialized_from_subquery": { "query_block": { "using_temporary_table": true, "table": { "query_block": { "message": "No tables used" … here goes union_result… => } } } ] } /* union_result */ }}}}}}32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  33. 33. EXPLAIN in JSON: more complex queries MySQL Workbench 5.2 SELECT a, b FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 1 AS a, 2 AS b) t1 GROUP BY a ORDER BY b DESC;33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  34. 34. EXPLAIN in JSON: subqueries mysql> EXPLAIN FORMAT=JSON SELECT derived.vc FROM (SELECT * FROM t1) AS derived WHERE derived.vc IN (SELECT t2.vc1 FROM t2 JOIN t3 ON t2.vc2=t3.vc); select possible key id table type key ref rows extra type keys len 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where; Start materialize; Scan 1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where; End materialize; Using join buffer (Block Nested Loop) 1 PRIMARY <derived2> ref <auto_key0> <auto_key0> 23 t2.vc1 2 NULL 2 DERIVED t1 ALL NULL NULL NULL NULL 2 NULL34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  35. 35. EXPLAIN in JSON: subqueries EXPLAIN "query_block": { "table": { "select_id": 1, "table_name": "derived", "nested_loop": [ "materialized_from_subquery": { { "table": { "using_temporary_table": true, "table_name": "<subquery3>", "query_block": { "materialized_from_subquery": { "select_id": 2, "query_block": { "table": { "nested_loop": [ "table_name": "t1“, { "table": { "table_name": "t2“ } }, … { "table": { "table_name": "t3“ } } } ] } /* query_block */ } } /* table */ } /* query_block */ }, { … next table goes here … => } } /* materialized_from_subquery */ ] /* nested_loop */ } /* query_block */ } /* table */35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  36. 36. EXPLAIN in JSON: subqueries MySQL Workbench 5.2 SELECT derived.vc FROM (SELECT * FROM t1) AS derived WHERE derived.vc IN (SELECT t2.vc1 FROM t2 JOIN t3 ON t2.vc2=t3.vc);36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  37. 37. EXPLAIN in JSON: subqueries mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t2.a IN (SELECT a FROM t1 WHERE t1.b <> 30) AND t1.b=t2.a GROUP BY t1.a; select possible id table type key key len ref rows extra type keys 1 SIMPLE t2 index a a 5 NULL 4 Using where; Using index; Using temporary; Using filesort 1 SIMPLE t1 ref a a 5 test.t2.a 101 Using where; Using index; Start temporary; End temporary 1 SIMPLE t1 index NULL a 10 NULL 10004 Using where; Using index; Using join buffer (Block Nested Loop)37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  38. 38. EXPLAIN in JSON: subqueries EXPLAIN "query_block": { { "select_id": 1, "duplicates_removal": { "grouping_operation": { "using_temporary_table": true, "using_temporary_table": true, "table": { "nested_loop": [ "table_name": "t1", { "attached_condition": "(`test`.`t1`.`b` <> 30)" "table": { } /* table */ "table_name": "t2", } /* duplicates_removal */ "attached_condition": "(`test`.`t2`.`a` is not null)" }, { } /* table */ "table": { }, "table_name": "t1", … next 2 tables => … "attached_condition": "(`test`.`t1`.`b` = `test`.`t2`.`a`)" ] /* nested_loop */ } /* grouping_operation */ } /* table */ } /* query_block */ }38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  39. 39. EXPLAIN in JSON: subqueries MySQL Workbench 5.2 SELECT * FROM t1, t2 WHERE t2.a IN (SELECT a FROM t1 WHERE t1.b <> 30) AND t1.b=t2.a GROUP BY t1.a;39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  40. 40. EXPLAIN in JSON: subqueries EXPLAIN "query_block": { "query_block": { "select_id": 1, "select_id": 1, "nested_loop": [ "nested_loop": [ { { "table": { "table": { "table_name": "t2", "table_name": "t1", } /* table */ "access_type": "range", "loosescan": true, }, { } /* table */ "table": { }, { "table_name": "t1", "table": { "first_match": "t2", "table_name": "t2", "attached_condition": "(`test`.`t1`.`b` <> 30)" } /* table */ } /* table */ } } ] /* nested_loop */ } /* query_block */ ] /* nested_loop */ } /* query_block */40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  41. 41. EXPLAIN for non-select queries41 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  42. 42. EXPLAINing non-select queries  INSERT/REPLACE and INSERT/REPLACE SELECT  Single- and multi-table UPDATE  Single- and multi-table DELETE42 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  43. 43. EXPLAINing non-select queries mysql> EXPLAIN UPDATE t1 SET a = 10 WHERE a < 10; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 range a,a_2 a 5 NULL 2 Using where; Using temporary43 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  44. 44. EXPLAINing non-select queries EXPLAIN "query_block": { "select_id": 1, "table": { "update": true, mysql> EXPLAIN FORMAT=JSON "table_name": "t1", "access_type": "range", UPDATE t1 SET a = 10 WHERE "possible_keys": [ "a", "a_2" ], a < 10; "key": "a", "key_length": "5", "rows": 2, "filtered": 100, "using_temporary_table": "for update", "attached_condition": "(`test`.`t1`.`a` < 10)" } /* table */ } /* query_block */44 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  45. 45. EXPLAINing non-select queries EXPLAIN "query_block": { "select_id": 1, "table": { "delete": true, mysql> EXPLAIN FORMAT=JSON "table_name": "t1", "access_type": "range", DELETE FROM t1 WHERE a < 10; "possible_keys": [ "a", "a_2“ ], "key": "a", "key_length": "5", "rows": 2, "filtered": 100, "attached_condition": "(`test`.`t1`.`a` < 10)" } /* table */ } /* query_block */45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  46. 46. EXPLAINing non-select queries mysql> EXPLAIN UPDATE t1 t11, (SELECT * FROM t2) t12 SET t11.a =10 WHERE t11.a = 1; select possible id table type key key len ref rows extra type keys 1 PRIMARY t11 ref a,a_2 a 5 const 1 NULL 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 Using join buffer (Block Nested Loop) 2 DERIVED t2 ALL NULL NULL NULL NULL 3 NULL46 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  47. 47. EXPLAINing non-select queries EXPLAIN "query_block": { { "select_id": 1, "table": { "nested_loop": [ { "table_name": "t12", "table": { "access_type": "ALL", "update": true, "rows": 3, "filtered": 100, "table_name": "t11", "using_join_buffer": "Block Nested Loop", "access_type": "ref", "materialized_from_subquery": { "possible_keys": [ "a", "a_2“ ], "using_temporary_table": true, "key": "a", "key_length": "5", "query_block": { "ref": ["const"] /* ref */, "select_id": 2, "rows": 1, "filtered": 100 "table": { … } /* table */ } /* table */ }, } /* query_block */ … here goes 2nd table…=> } /* materialized_from_subquery */ ] /* nested_loop */ } /* query_block */ } /* table */ }47 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  48. 48. EXPLAINing non-select queries mysql> EXPLAIN UPDATE t1 SET a = 10 WHERE a IN (SELECT a FROM t2); id select type table type possible keys key key len ref rows extra 1 PRIMARY t1 ALL a,a_2 NULL NULL NULL 3 NULL 1 DEPENDENT t2 ALL NULL NULL NULL NULL 3 Using where SUBQUERY48 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  49. 49. EXPLAINing non-select queries EXPLAIN "query_block": { [{ "select_id": 1, "dependent": true, "cacheable": false, "table": { "query_block": { "update": true, "select_id": 2, "table_name": "t1", "table": { "possible_keys": [ "a", "a_2“ ], "table_name": "t2", "attached_condition": "access_type": "ALL", "<in_optimizer>(`test`.`t1`.`a`, "rows": 3, "filtered": 100, <exists>(select 1 from `test`.`t2` where "attached_condition": (<cache>(`test`.`t1`.`a`) = "(<cache>(`test`.`t1`.`a`) = `test`.`t2`.`b`)" `test`.`t1`.`a`)))", } /* table */ "attached_subqueries": [ … => …] } /* query_block */ } /* table */ }] } /* query_block */49 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  50. 50. 50 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12

×