# `VERSION::7.1.0` Creating and Verifying the History Plan Binding

```
tidb> ~!@CREATE BINDING FROM HISTORY USING PLAN DIGEST@!~ '89ab72f95be8dda9488129b6c7d03f29410f49fcc129bdcbbe444d2b6d1bd455';
Query OK, 0 rows affected (0.01 sec)

tidb> SHOW BINDINGS\G
*************************** 1. row ***************************
~!@Original_sql:@!~ select `m` . `name` , `m` . `age` , `n` . `title` from ( `test` . `m` ) join `test` . `n` where `m` . `id` = `n` . `id`
   ~!@Bind_sql:@!~ SELECT /*+ inl_join(@`sel_1` `test`.`m`) use_index(@`sel_1` `test`.`n` ) use_index(@`sel_1` `test`.`m` )*/ `m`.`name`,`m`.`age`,`n`.`title` FROM (`test`.`m`) JOIN `test`.`n` WHERE `m`.`id` = `n`.`id`
 Default_db: test
   Status: enabled
 Create_time: 2023-10-07 03:24:54.628
 Update_time: 2023-10-07 03:24:54.628
   Charset: utf8
  Collation: utf8_general_ci
   Source: history
 Sql_digest: 272ddee83c7af8016b9f22b4fcb2ccc31b6038dfa7665f565fd9b868fc7ce321
 Plan_digest: 89ab72f95be8dda9488129b6c7d03f29410f49fcc129bdcbbe444d2b6d1bd455
1 row in set (0.00 sec)

tidb> EXPLAIN ~!@SELECT m.name, m.age, n.title FROM m, n WHERE m.id = n.id@!~;
+--------------------------+----------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------+
| id                       | estRows  | task      | access object | operator info                                                                                                   |
+--------------------------+----------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------+
| Projection_9             | 12487.50 | root      |               | test.m.name, test.m.age, test.n.title                                                                           |
| └─~!@IndexJoin_14@!~           | 12487.50 | root      |               | inner join, inner:TableReader_11, outer key:test.n.id, inner key:test.m.id, equal cond:eq(test.n.id, test.m.id) |
|  ├─TableReader_21(Build) | 9990.00  | root      |               | data:Selection_20                                                                                               |
|  │ └─Selection_20        | 9990.00  | cop[tikv] |               | not(isnull(test.n.id))                                                                                          |
|  │  └─TableFullScan_19   | 10000.00 | cop[tikv] | table:n       | keep order:false, stats:pseudo                                                                                  |
|  └─TableReader_11(Probe) | 9990.00  | root      |               | data:TableRangeScan_10                                                                                          |
|   └─TableRangeScan_10    | 9990.00  | cop[tikv] | table:m       | range: decided by [test.n.id], keep order:false, stats:pseudo                                                   |
+--------------------------+----------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
```
------------------------------------------------------------------------------
In this slide, we created a binding using the historical execution plan recorded in `INFORMATION_SCHEMA.STATEMENTS_SUMMARY`, as shown below:

```
tidb> CREATE BINDING FROM HISTORY USING PLAN DIGEST '89ab72f95be8dda9488129b6c7d03f29410f49fcc129bdcbbe444d2b6d1bd455';
Query OK, 0 rows affected (0.01 sec)

tidb> SHOW BINDINGS\G
*************************** 1. row ***************************
Original_sql: select `m` . `name` , `m` . `age` , `n` . `title` from ( `test` . `m` ) join `test` . `n` where `m` . `id` = `n` . `id`
   Bind_sql: SELECT /*+ inl_join(@`sel_1` `test`.`m`) use_index(@`sel_1` `test`.`n` ) use_index(@`sel_1` `test`.`m` )*/ `m`.`name`,`m`.`age`,`n`.`title` FROM (`test`.`m`) JOIN `test`.`n` WHERE `m`.`id` = `n`.`id`
 Default_db: test
   Status: enabled
 Create_time: 2023-10-07 03:24:54.628
 Update_time: 2023-10-07 03:24:54.628
   Charset: utf8
  Collation: utf8_general_ci
   Source: history
 Sql_digest: 272ddee83c7af8016b9f22b4fcb2ccc31b6038dfa7665f565fd9b868fc7ce321
 Plan_digest: 89ab72f95be8dda9488129b6c7d03f29410f49fcc129bdcbbe444d2b6d1bd455
1 row in set (0.00 sec)
```

After verification, when executing the SQL statement again: `EXPLAIN SELECT m.name, m.age, n.title FROM m, n WHERE m.id = n.id`; the optimizer chooses the IndexJoin table join algorithm.

```
tidb> EXPLAIN SELECT m.name, m.age, n.title FROM m, n WHERE m.id = n.id;
+--------------------------+----------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------+
| id                       | estRows  | task      | access object | operator info                                                                                                   |
+--------------------------+----------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------+
| Projection_9             | 12487.50 | root      |               | test.m.name, test.m.age, test.n.title                                                                           |
| └─IndexJoin_14           | 12487.50 | root      |               | inner join, inner:TableReader_11, outer key:test.n.id, inner key:test.m.id, equal cond:eq(test.n.id, test.m.id) |
|  ├─TableReader_21(Build) | 9990.00  | root      |               | data:Selection_20                                                                                               |
|  │ └─Selection_20        | 9990.00  | cop[tikv] |               | not(isnull(test.n.id))                                                                                          |
|  │  └─TableFullScan_19   | 10000.00 | cop[tikv] | table:n       | keep order:false, stats:pseudo                                                                                  |
|  └─TableReader_11(Probe) | 9990.00  | root      |               | data:TableRangeScan_10                                                                                          |
|   └─TableRangeScan_10    | 9990.00  | cop[tikv] | table:m       | range: decided by [test.n.id], keep order:false, stats:pseudo                                                   |
+--------------------------+----------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
```