oracle数据库计数器,DM 达梦数据库 表的 行计数器(COUNTER)属性
1 表行計(jì)數(shù)器 說(shuō)明
默認(rèn)情況下,DM 達(dá)夢(mèng)數(shù)據(jù)庫(kù)count() 是秒回結(jié)果的,不受表中實(shí)際行數(shù)的影響,執(zhí)行select count() 都能立即返回正確的結(jié)果。因?yàn)檫_(dá)夢(mèng)數(shù)據(jù)庫(kù)的count(*)操作不需要執(zhí)行全表掃描,直接讀取表行計(jì)數(shù)器的結(jié)果。
這個(gè)表行計(jì)數(shù)器實(shí)際上是表的一個(gè)存儲(chǔ)屬性,在創(chuàng)建表時(shí)可以指定是否啟用表行計(jì)數(shù)器。默認(rèn)為啟動(dòng),可以配置為如下2個(gè)值:
WITH COUNTER:默認(rèn)值,在表上維護(hù)當(dāng)前表內(nèi)的行數(shù);
WITHOUT COUNTER:表上只維護(hù)一個(gè)非實(shí)時(shí)的大概的行數(shù);https://www.cndba.cn/dave/article/3829
如果表啟用了WITH COUNTER 屬性, SELECT COUNT(*)時(shí)服務(wù)器直接取行數(shù)返回即可,可以快速響應(yīng);
如果表是 WITHOUT COUNTER 屬性,服務(wù)器需要先掃描 B 樹獲取行數(shù)返回后才能響應(yīng)。
https://www.cndba.cn/dave/article/3829https://www.cndba.cn/dave/article/3829
2 測(cè)試
2.1 創(chuàng)建默認(rèn)啟用counter的表cndba
[dave@www.cndba.cn ~]$ disql SYSDBA/SYSDBA
服務(wù)器[LOCALHOST:5236]:處于普通打開狀態(tài)
登錄使用時(shí)間: 12.679(毫秒)
disql V8
SQL> create table cndba(id int,website varchar(50));
操作已執(zhí)行
已用時(shí)間: 9.588(毫秒). 執(zhí)行號(hào):3281.
SQL> insert into cndba values(1,'https://www.cndba.cn/dave');
影響行數(shù) 1
已用時(shí)間: 1.908(毫秒). 執(zhí)行號(hào):3282.
SQL> commit;
操作已執(zhí)行
已用時(shí)間: 1.376(毫秒). 執(zhí)行號(hào):3283.
SQL>
查看此時(shí)的執(zhí)行計(jì)劃
SQL> explain select count(*) from cndba;
1 #NSET2: [0, 1, 0]
2 #PRJT2: [0, 1, 0]; exp_num(1), is_atom(FALSE)
3 #FAGR2: [0, 1, 0]; sfun_num(1),
已用時(shí)間: 29.509(毫秒). 執(zhí)行號(hào):0.
SQL>
2.2 創(chuàng)建沒(méi)有啟用counter的表cndba2
SQL> create table cndba2(id int,website varchar(50)) storage(without counter);
操作已執(zhí)行
已用時(shí)間: 5.633(毫秒). 執(zhí)行號(hào):3284.
SQL> insert into cndba2 values(2,'https://www.cndba.cn/dave');
影響行數(shù) 1
已用時(shí)間: 2.107(毫秒). 執(zhí)行號(hào):3285.
SQL> commit;
操作已執(zhí)行
已用時(shí)間: 1.856(毫秒). 執(zhí)行號(hào):3286.
SQL> explain select count(*) from cndba2;
1 #NSET2: [0, 1, 0]
2 #PRJT2: [0, 1, 0]; exp_num(1), is_atom(FALSE)
3 #AAGR2: [0, 1, 0]; grp_num(0), sfun_num(1) slave_empty(0)
4 #CSCN2: [0, 1, 0]; INDEX33555492(CNDBA2)
已用時(shí)間: 1.307(毫秒). 執(zhí)行號(hào):0.
SQL>
2.3 對(duì)比
2.3.1 查看表的定義語(yǔ)句
[dave@www.cndba.cn Code]# drz getddl table cndba SYSDBA
*****************DDL SQL******************
CREATE TABLE "SYSDBA"."CNDBA"
(
"ID" INT,
"WEBSITE" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
[dave@www.cndba.cn Code]#
未啟用表行計(jì)數(shù)器:
[dave@www.cndba.cn Code]# drz getddl table cndba SYSDBA
*****************DDL SQL******************
CREATE TABLE "SYSDBA"."CNDBA2"
(
"ID" INT,
"WEBSITE" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR, WITHOUT COUNTER) ;
[dave@www.cndba.cn Code]#
2.3.2 執(zhí)行計(jì)劃的操作符
啟用counter:https://www.cndba.cn/dave/article/3829
2 #PRJT2: [0, 1, 0]; exp_num(1), is_atom(FALSE)
3 #FAGR2: [0, 1, 0]; sfun_num(1),
FAGR2 表示:快速聚集,如果沒(méi)有 where 條件,且取 count(*), 或者基于索引的 MAX/MIN 值,則可以快速取得集函數(shù)的值
未啟用counter:
2 #PRJT2: [0, 1, 0]; exp_num(1), is_atom(FALSE)
3 #AAGR2: [0, 1, 0]; grp_num(0), sfun_num(1) slave_empty(0)
4 #CSCN2: [0, 1, 0]; INDEX33555492(CNDBA2)
AAGR2表示:簡(jiǎn)單聚集
CSCN2表示:聚集索引掃描
2.4 Counter 狀態(tài)切換
將cndba 改成不啟用counter:
SQL> alter table cndba without counter;
操作已執(zhí)行
已用時(shí)間: 9.653(毫秒). 執(zhí)行號(hào):3291.
SQL>
[dave@www.cndba.cn Code]# drz getddl table cndba SYSDBA
*****************DDL SQL******************
CREATE TABLE "SYSDBA"."CNDBA"
(
"ID" INT,
"WEBSITE" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR, WITHOUT COUNTER) ;
將cndba2 改成啟用counter:https://www.cndba.cn/dave/article/3829
SQL> alter table cndba2 with counter;
操作已執(zhí)行
已用時(shí)間: 5.636(毫秒). 執(zhí)行號(hào):3294.
SQL>
[dave@www.cndba.cn Code]# drz getddl table cndba2 SYSDBA
*****************DDL SQL******************
CREATE TABLE "SYSDBA"."CNDBA2"
(
"ID" INT,
"WEBSITE" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
2.5 Count(*) 時(shí)間對(duì)比
2.5.1 啟用counter
SQL> create table t1 as select * from sysobjects;
操作已執(zhí)行
已用時(shí)間: 11.657(毫秒). 執(zhí)行號(hào):3297.
SQL> insert into t1 select * from t1;
影響行數(shù) 1399
已用時(shí)間: 28.383(毫秒). 執(zhí)行號(hào):3298.
SQL> insert into t1 select * from t1;
影響行數(shù) 2798
已用時(shí)間: 14.120(毫秒). 執(zhí)行號(hào):3299.
SQL> insert into t1 select * from t1;
影響行數(shù) 5596
已用時(shí)間: 21.753(毫秒). 執(zhí)行號(hào):3300.
SQL> commit;
操作已執(zhí)行
已用時(shí)間: 1.950(毫秒). 執(zhí)行號(hào):3301.
SQL> select count(*) from t1;
行號(hào) COUNT(*)
---------- --------------------
1 11192
已用時(shí)間: 1.902(毫秒). 執(zhí)行號(hào):3302.
2.5.2 未啟用counter
SQL> create table t2 as select * from sysobjects where 1=2;
操作已執(zhí)行
已用時(shí)間: 7.219(毫秒). 執(zhí)行號(hào):3303.
SQL> alter table t2 without counter;
操作已執(zhí)行
已用時(shí)間: 7.715(毫秒). 執(zhí)行號(hào):3304.
SQL> insert into t2 select * from t1;
影響行數(shù) 11192
已用時(shí)間: 31.559(毫秒). 執(zhí)行號(hào):3305.
SQL> commit;
操作已執(zhí)行
已用時(shí)間: 1.500(毫秒). 執(zhí)行號(hào):3306.
SQL> select count(*) from t2;
行號(hào) COUNT(*)
---------- --------------------
1 11192
已用時(shí)間: 2.608(毫秒). 執(zhí)行號(hào):3307.
SQL>
我們這里僅僅是1w多條數(shù)據(jù),如果是上千萬(wàn)級(jí)別的記錄數(shù),那么時(shí)間差距就會(huì)更明顯一些。
https://www.cndba.cn/dave/article/3829
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的oracle数据库计数器,DM 达梦数据库 表的 行计数器(COUNTER)属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二战德军无人坦克
- 下一篇: 请问世界上有哪些国家被天堑环绕保护几千年