oracle数据库计数器,DM 达梦数据库 表的 行计数器(COUNTER)属性
1 表行計數器 說明
默認情況下,DM 達夢數據庫count() 是秒回結果的,不受表中實際行數的影響,執行select count() 都能立即返回正確的結果。因為達夢數據庫的count(*)操作不需要執行全表掃描,直接讀取表行計數器的結果。
這個表行計數器實際上是表的一個存儲屬性,在創建表時可以指定是否啟用表行計數器。默認為啟動,可以配置為如下2個值:
WITH COUNTER:默認值,在表上維護當前表內的行數;
WITHOUT COUNTER:表上只維護一個非實時的大概的行數;https://www.cndba.cn/dave/article/3829
如果表啟用了WITH COUNTER 屬性, SELECT COUNT(*)時服務器直接取行數返回即可,可以快速響應;
如果表是 WITHOUT COUNTER 屬性,服務器需要先掃描 B 樹獲取行數返回后才能響應。
https://www.cndba.cn/dave/article/3829https://www.cndba.cn/dave/article/3829
2 測試
2.1 創建默認啟用counter的表cndba
[dave@www.cndba.cn ~]$ disql SYSDBA/SYSDBA
服務器[LOCALHOST:5236]:處于普通打開狀態
登錄使用時間: 12.679(毫秒)
disql V8
SQL> create table cndba(id int,website varchar(50));
操作已執行
已用時間: 9.588(毫秒). 執行號:3281.
SQL> insert into cndba values(1,'https://www.cndba.cn/dave');
影響行數 1
已用時間: 1.908(毫秒). 執行號:3282.
SQL> commit;
操作已執行
已用時間: 1.376(毫秒). 執行號:3283.
SQL>
查看此時的執行計劃
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),
已用時間: 29.509(毫秒). 執行號:0.
SQL>
2.2 創建沒有啟用counter的表cndba2
SQL> create table cndba2(id int,website varchar(50)) storage(without counter);
操作已執行
已用時間: 5.633(毫秒). 執行號:3284.
SQL> insert into cndba2 values(2,'https://www.cndba.cn/dave');
影響行數 1
已用時間: 2.107(毫秒). 執行號:3285.
SQL> commit;
操作已執行
已用時間: 1.856(毫秒). 執行號: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)
已用時間: 1.307(毫秒). 執行號:0.
SQL>
2.3 對比
2.3.1 查看表的定義語句
[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]#
未啟用表行計數器:
[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 執行計劃的操作符
啟用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 表示:快速聚集,如果沒有 where 條件,且取 count(*), 或者基于索引的 MAX/MIN 值,則可以快速取得集函數的值
未啟用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表示:簡單聚集
CSCN2表示:聚集索引掃描
2.4 Counter 狀態切換
將cndba 改成不啟用counter:
SQL> alter table cndba without counter;
操作已執行
已用時間: 9.653(毫秒). 執行號: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;
操作已執行
已用時間: 5.636(毫秒). 執行號: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(*) 時間對比
2.5.1 啟用counter
SQL> create table t1 as select * from sysobjects;
操作已執行
已用時間: 11.657(毫秒). 執行號:3297.
SQL> insert into t1 select * from t1;
影響行數 1399
已用時間: 28.383(毫秒). 執行號:3298.
SQL> insert into t1 select * from t1;
影響行數 2798
已用時間: 14.120(毫秒). 執行號:3299.
SQL> insert into t1 select * from t1;
影響行數 5596
已用時間: 21.753(毫秒). 執行號:3300.
SQL> commit;
操作已執行
已用時間: 1.950(毫秒). 執行號:3301.
SQL> select count(*) from t1;
行號 COUNT(*)
---------- --------------------
1 11192
已用時間: 1.902(毫秒). 執行號:3302.
2.5.2 未啟用counter
SQL> create table t2 as select * from sysobjects where 1=2;
操作已執行
已用時間: 7.219(毫秒). 執行號:3303.
SQL> alter table t2 without counter;
操作已執行
已用時間: 7.715(毫秒). 執行號:3304.
SQL> insert into t2 select * from t1;
影響行數 11192
已用時間: 31.559(毫秒). 執行號:3305.
SQL> commit;
操作已執行
已用時間: 1.500(毫秒). 執行號:3306.
SQL> select count(*) from t2;
行號 COUNT(*)
---------- --------------------
1 11192
已用時間: 2.608(毫秒). 執行號:3307.
SQL>
我們這里僅僅是1w多條數據,如果是上千萬級別的記錄數,那么時間差距就會更明顯一些。
https://www.cndba.cn/dave/article/3829
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
總結
以上是生活随笔為你收集整理的oracle数据库计数器,DM 达梦数据库 表的 行计数器(COUNTER)属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二战德军无人坦克
- 下一篇: SQL Server 2008 复习(一