exists、in、table join 实际案例

 

SQL> select /*+ optimizer_features_enable('9.2.0') */

  2         pk_bdinfo,

  3         bdcode,

  4         bdname,

  5         bdtype,

  6         tablename,

  7         tablepkname,

  8         corpfieldname,

  9         codefieldname,

 10         namefieldname,

 11         refnodename

 12    from ufnc5610.bd_bdinfo a

 13   where exists (select 1

 14            from ufnc5610.bd_subjass b, ufnc5610.bd_accsubj acc

 15           where b.pk_accsubj = acc.pk_accsubj

 16             and a.pk_bdinfo = b.pk_bdinfo

 17             and (acc.pk_glorgbook = '0001AA1000000000S3MT'));

 

已选择16行。

 

已用时间:  00: 00: 00.98

 

执行计划

----------------------------------------------------------

Plan hash value: 30633670

 

-------------------------------------------------------------------

| Id  | Operation          | Name         | Rows  | Bytes | Cost  |

-------------------------------------------------------------------

|   0 | SELECT STATEMENT   |              |    15 |  1590 |    11 |

|*  1 |  FILTER            |              |       |       |       |

|   2 |   TABLE ACCESS FULL| BD_BDINFO    |    15 |  1590 |     5 |

|   3 |   NESTED LOOPS     |              |   802 | 67368 |     6 |

|*  4 |    INDEX RANGE SCAN| I_BD_ACCSUBJ |   765 | 32130 |     4 |

|*  5 |    INDEX RANGE SCAN| I_BD_SUBJASS |     1 |    42 |     1 |

-------------------------------------------------------------------

 

统计信息

----------------------------------------------------------

          0  recursive calls

          0  db block gets

     412764  consistent gets

          0  physical reads

          0  redo size

       1861  bytes sent via SQL*Net to client

        250  bytes received via SQL*Net from client

          3  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         16  rows processed

        

换成in,效率的到提高

 

SQL> select /*+optimizer_features_enable('9.2.0')*/

  2         pk_bdinfo,

  3         bdcode,

  4         bdname,

  5         bdtype,

  6         tablename,

  7         tablepkname,

  8         corpfieldname,

  9         codefieldname,

 10         namefieldname,

 11         refnodename

 12    from ufnc5610.bd_bdinfo a

 13   where pk_bdinfo in (select b.pk_bdinfo

 14            from ufnc5610.bd_subjass b, ufnc5610.bd_accsubj acc

 15           where b.pk_accsubj = acc.pk_accsubj

 16             and (acc.pk_glorgbook = '0001AA1000000000S3MT'));

 

 

SQL> /

 

已选择16行。

 

已用时间:  00: 00: 00.01

 

执行计划

----------------------------------------------------------

Plan hash value: 2360601918

 

--------------------------------------------------------------------

| Id  | Operation           | Name         | Rows  | Bytes | Cost  |

--------------------------------------------------------------------

|   0 | SELECT STATEMENT    |              |    22 |  2816 |    33 |

|*  1 |  HASH JOIN SEMI     |              |    22 |  2816 |    33 |

|   2 |   TABLE ACCESS FULL | BD_BDINFO    |   292 | 30952 |     5 |

|   3 |   VIEW              | VW_NSO_1     |  2346 | 51612 |    27 |

|   4 |    NESTED LOOPS     |              |  2346 |   192K|    27 |

|*  5 |     INDEX RANGE SCAN| I_BD_ACCSUBJ |   765 | 32130 |     4 |

|*  6 |     INDEX RANGE SCAN| I_BD_SUBJASS |     3 |   126 |     1 |

--------------------------------------------------------------------

 

统计信息

----------------------------------------------------------

          0  recursive calls

          0  db block gets

       1525  consistent gets

          0  physical reads

          0  redo size

       1946  bytes sent via SQL*Net to client

        250  bytes received via SQL*Net from client

          3  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         16  rows processed  

        

实际是CBO优化器没有对exists做unnest转换,提示其转换,效率得到提高              

 

SQL> ed

已写入 file afiedt.buf

 

  1  select /*+ optimizer_features_enable('9.2.0') */

  2         pk_bdinfo,

  3         bdcode,

  4         bdname,

  5         bdtype,

  6         tablename,

  7         tablepkname,

  8         corpfieldname,

  9         codefieldname,

 10         namefieldname,

 11         refnodename

 12    from ufnc5610.bd_bdinfo a

 13   where exists (select /*+unnest*/ 1

 14            from ufnc5610.bd_subjass b, ufnc5610.bd_accsubj acc

 15           where b.pk_accsubj = acc.pk_accsubj

 16             and a.pk_bdinfo = b.pk_bdinfo

 17*            and (acc.pk_glorgbook = '0001AA1000000000S3MT'))

SQL> /

 

已选择16行。

 

已用时间:  00: 00: 00.03

 

执行计划

----------------------------------------------------------

Plan hash value: 2542036995

 

--------------------------------------------------------------------

| Id  | Operation           | Name         | Rows  | Bytes | Cost  |

--------------------------------------------------------------------

|   0 | SELECT STATEMENT    |              |    22 |  2816 |    33 |

|*  1 |  HASH JOIN SEMI     |              |    22 |  2816 |    33 |

|   2 |   TABLE ACCESS FULL | BD_BDINFO    |   292 | 30952 |     5 |

|   3 |   VIEW              | VW_SQ_1      |  2346 | 51612 |    27 |

|   4 |    NESTED LOOPS     |              |  2346 |   192K|    27 |

|*  5 |     INDEX RANGE SCAN| I_BD_ACCSUBJ |   765 | 32130 |     4 |

|*  6 |     INDEX RANGE SCAN| I_BD_SUBJASS |     3 |   126 |     1 |

--------------------------------------------------------------------

 

统计信息

----------------------------------------------------------

          1  recursive calls

          0  db block gets

       1525  consistent gets

          0  physical reads

          0  redo size

       1946  bytes sent via SQL*Net to client

        250  bytes received via SQL*Net from client

          3  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         16  rows processed

 

oracle 10G正常情况下会做unnest,如下

 

  1  select /*+ optimizer_features_enable('10.2.0.1') */

  2         pk_bdinfo,

  3         bdcode,

  4         bdname,

  5         bdtype,

  6         tablename,

  7         tablepkname,

  8         corpfieldname,

  9         codefieldname,

 10         namefieldname,

 11         refnodename

 12    from ufnc5610.bd_bdinfo a

 13   where exists (select  1

 14            from ufnc5610.bd_subjass b, ufnc5610.bd_accsubj acc

 15           where b.pk_accsubj = acc.pk_accsubj

 16             and a.pk_bdinfo = b.pk_bdinfo

 17*            and (acc.pk_glorgbook = '0001AA1000000000S3MT'))

SQL> /

 

已选择16行。

 

已用时间:  00: 00: 00.01

 

执行计划

----------------------------------------------------------

Plan hash value: 2542036995

 

------------------------------------------------------------------------------------

| Id  | Operation           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT    |              |    22 |  2816 |    36   (3)| 00:00:01 |

|*  1 |  HASH JOIN SEMI     |              |    22 |  2816 |    36   (3)| 00:00:01 |

|   2 |   TABLE ACCESS FULL | BD_BDINFO    |   292 | 30952 |     8   (0)| 00:00:01 |

|   3 |   VIEW              | VW_SQ_1      |  2346 | 51612 |    27   (0)| 00:00:01 |

|   4 |    NESTED LOOPS     |              |  2346 |   192K|    27   (0)| 00:00:01 |

|*  5 |     INDEX RANGE SCAN| I_BD_ACCSUBJ |   765 | 32130 |     4   (0)| 00:00:01 |

|*  6 |     INDEX RANGE SCAN| I_BD_SUBJASS |     3 |   126 |     1   (0)| 00:00:01 |

------------------------------------------------------------------------------------

 

统计信息

----------------------------------------------------------

          1  recursive calls

          0  db block gets

       1525  consistent gets

          0  physical reads

          0  redo size

       1946  bytes sent via SQL*Net to client

        250  bytes received via SQL*Net from client

          3  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         16  rows processed

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27378/viewspace-670132/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27378/viewspace-670132/

以下是一个使用Python封装数据库的完整案例,该案例使用了SQLite3数据库。 1. 创建数据库连接 ```python import sqlite3 class Database: def __init__(self, db_name): self.db_name = db_name self.conn = None self.cursor = None def connect(self): self.conn = sqlite3.connect(self.db_name) self.cursor = self.conn.cursor() def disconnect(self): self.conn.close() db = Database('MyDatabase.db') db.connect() ``` 2. 创建表格 ```python class Table: def __init__(self, db, table_name, columns): self.db = db self.table_name = table_name self.columns = columns def create(self): self.db.cursor.execute(f"CREATE TABLE IF NOT EXISTS {self.table_name} ({self.columns})") self.db.conn.commit() users_table = Table(db, 'users', 'id INTEGER PRIMARY KEY, name TEXT, email TEXT') users_table.create() ``` 3. 插入数据 ```python class User: def __init__(self, db, table_name): self.db = db self.table_name = table_name def insert(self, data): columns = ', '.join(data.keys()) values = ', '.join(['?' for _ in range(len(data))]) sql = f"INSERT INTO {self.table_name} ({columns}) VALUES ({values})" self.db.cursor.execute(sql, tuple(data.values())) self.db.conn.commit() user = User(db, 'users') user.insert({'name': 'John Doe', 'email': 'johndoe@example.com'}) ``` 4. 查询数据 ```python class Query: def __init__(self, db, table_name): self.db = db self.table_name = table_name def select_all(self): sql = f"SELECT * FROM {self.table_name}" self.db.cursor.execute(sql) return self.db.cursor.fetchall() query = Query(db, 'users') users = query.select_all() print(users) ``` 5. 更新数据 ```python class Update: def __init__(self, db, table_name): self.db = db self.table_name = table_name def update(self, data, where=None): set_clause = ', '.join([f"{k} = ?" for k in data.keys()]) where_clause = '' if where: where_clause = f" WHERE {where}" sql = f"UPDATE {self.table_name} SET {set_clause}{where_clause}" self.db.cursor.execute(sql, tuple(data.values())) self.db.conn.commit() update = Update(db, 'users') update.update({'email': 'janedoe@example.com'}, where="name='Jane Doe'") ``` 6. 删除数据 ```python class Delete: def __init__(self, db, table_name): self.db = db self.table_name = table_name def delete(self, where=None): where_clause = '' if where: where_clause = f" WHERE {where}" sql = f"DELETE FROM {self.table_name}{where_clause}" self.db.cursor.execute(sql) self.db.conn.commit() delete = Delete(db, 'users') delete.delete(where="name='John Doe'") ``` 7. 关闭数据库连接 ```python db.disconnect() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值