oracle tabs作用,select * from tab的劣势在哪里

身为DBA,为开发人员制定的DB标准肯定包含"尽量避免使用select * from tab",可此种查询究竟坏在哪里?试着解释一下,有不妥之处还望各位多多赐教;数据从disk呈现给client应该经历如下步骤:

disk  --> SGA  --> PGA  --> client(不考虑direct read)

分两种情况讨论

1 索引扫描

如果select col采用覆盖索引,select *可能导致不必要的回表,这会导致上述各个步骤都增加成本;

如果select col采用索引且本身需要回表,则select *主要多消耗在后两个阶段(见下文);

2 全表扫描

oracle采用行存储,以block为最小IO单位,故当采用全表扫描时,select *和select col读取的数据块一样多,只是发送给客户端的bytes肯定是前者多,也就是说多出的消耗主要在SGA-->PGA和PGA-->client

注:project投影应该发生在SGA --> PGA

以一个小实验为例(11.2.0.3)create table t as select * from dba_objects;

set autotrace TRACE stat

SQL> select object_id from t;

104569 rows selected.

Statistics

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

0  recursive calls

0  db block gets

8434  consistent gets

0  physical reads

0  redo size

1913663  bytes sent via SQL*Net to client

77205  bytes received via SQL*Net from client

6973  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

104569  rows processed

SQL> select *  from t;

104569 rows selected.

Statistics

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

0  recursive calls

0  db block gets

8434  consistent gets

0  physical reads

0  redo size

12638304  bytes sent via SQL*Net to client

77205  bytes received via SQL*Net from client

6973  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

104569  rows processed

select *要传送的字节多出一个数量级,最直观的反映是消耗的时间更长

10046文件

select *

from

t

call     count       cpu    elapsed       disk      query    current        rows

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

Parse        1      0.01       0.02          0         70          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch     6973      0.29       0.28          0       8433          0      104569

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

total     6975      0.31       0.30          0       8503          0      104569

Elapsed times include waiting on following events:

Event waited on                             Times   Max. Wait  Total Waited

----------------------------------------   Waited  ----------  ------------

row cache lock                                 15        0.00          0.00

SQL*Net message to client                    6973        0.00          0.00

SQL*Net message from client                  6973        0.00          1.08

********************************************************************************

select object_id

from

t

call     count       cpu    elapsed       disk      query    current        rows

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

Parse        1      0.00       0.00          0          0          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch     6973      0.19       0.20          0       8433          0      104569

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

total     6975      0.19       0.20          0       8433          0      104569

Elapsed times include waiting on following events:

Event waited on                             Times   Max. Wait  Total Waited

----------------------------------------   Waited  ----------  ------------

SQL*Net message to client                    6973        0.00          0.00

SQL*Net message from client                  6973        0.00          0.43

********************************************************************************

您好!要实现一个`tabs`方法,并且在点击标签时触发相应的操作,您可以按照以下步骤进行: 1. 首先,创建一个HTML结构,包含标签和内容区域。例如: ``` <div class="tabs"> <div class="tab" data-tab="tab1">标签1</div> <div class="tab" data-tab="tab2">标签2</div> <div class="tab" data-tab="tab3">标签3</div> </div> <div class="content"> <div class="tab-content" data-tab="tab1">内容1</div> <div class="tab-content" data-tab="tab2">内容2</div> <div class="tab-content" data-tab="tab3">内容3</div> </div> ``` 2. 接着,在JavaScript中定义`tabs`方法,用于处理标签点击事件和显示相应的内容。代码如下: ```javascript function tabs() { const tabs = document.querySelectorAll('.tab'); const tabContents = document.querySelectorAll('.tab-content'); tabs.forEach(tab => { tab.addEventListener('click', () => { const tabId = tab.getAttribute('data-tab'); // 隐藏所有内容区域 tabContents.forEach(content => { content.style.display = 'none'; }); // 显示点击标签对应的内容区域 const selectedContent = document.querySelector(`[data-tab="${tabId}"]`); selectedContent.style.display = 'block'; }); }); } // 调用tabs方法 tabs(); ``` 3. 最后,将上述代码放置在页面加载完成后执行的事件中,例如: ```javascript window.addEventListener('DOMContentLoaded', () => { tabs(); }); ``` 这样,当点击标签时,对应的内容区域将显示出来。您可以根据需要自定义样式和内容。希望能对您有所帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值