国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數據庫 > 文庫 > 正文

關于關系數據庫如何快速查詢表的記錄數詳解

2020-10-29 21:46:01
字體:
來源:轉載
供稿:網友

前言

在數據庫中,很多人員習慣使用SELECT COUNT(*)SELECT COUNT(1)SELECT COUNT(COL)來查詢一個表有多少記錄,對于小表,這種SQL的開銷倒不是很大,但是對于大表,這種查詢表記錄數的做法就是一個非常消耗資源了,而且效率很差。下面介紹一下SQL Server、 Oracle、MySQL中如何快速獲取表的記錄數。

SQL SERVER 數據庫

在SQL Server數據庫中, 對象目錄視圖sys.partitions中有一個字段rows會記錄表的記錄數。我們以AdventureWorks2014為測試數據庫。

SELECT OBJECT_NAME(object_id) AS Object_Name,  i.name   AS Index_Name, p.rows   AS Table_RowsFROM sys.partitions pLEFT JOIN sys.sysindexes i ON p.object_id = i.id AND p.index_id = i.indid WHERE object_id = OBJECT_ID('TableName') 

那么我們還有一些疑問,我們先來看看這些問題吧!

1:沒有索引的表是否也可以使用上面腳本?

2:只有非聚集索引的堆表是否可以使用上面腳本?

3:有多個索引的表,是否記錄數會存在不一致的情況?

4:統計信息不準確的表,是否rows也會不準確

5: 分區表的情況又是怎么樣?

6:對象目錄視圖sys.partitions與sp_spaceused獲取的表記錄函數是否準確。

如下所示,我們先構造測試案例:

IF EXISTS(SELECT 1 FROM sys.objects WHERE type='U' AND name='TEST_TAB_ROW')BEGIN DROP TABLE TEST_TAB_ROW;END IF NOT EXISTS(SELECT 1 FROM sys.objects WHERE type='U' AND name='TEST_TAB_ROW')BEGIN CREATE TABLE TEST_TAB_ROW (  ID INT,  NAME CHAR(200) )ENDGO SET NOCOUNT ON;BEGIN TRANDECLARE @Index INT =1; WHILE @Index <= 100000BEGIN  INSERT INTO TEST_TAB_ROW VALUES(@Index, NEWID());  SET @Index+=1;  IF (@Index % 5000) = 0  BEGIN IF @@TRANCOUNT > 0   BEGIN   COMMIT;  BEGIN TRAN  END ENDEND IF @@TRANCOUNT > 0 BEGIN  COMMIT;ENDGO

關于問題1、問題2,都可以使用上面腳本, 如下測試所示:

SELECT OBJECT_NAME(object_id) AS Object_Name,  i.name   AS Index_Name, p.rows   AS Table_RowsFROM sys.partitions pLEFT JOIN sys.sysindexes i ON p.object_id = i.id AND p.index_id = i.indid WHERE object_id = OBJECT_ID('dbo.TEST_TAB_ROW') 

在表dbo.TEST_TAB_ROW 上創建非聚集索引后,查詢結果如下所示:

CREATE INDEX IX_TEST_TAB_ROW ON TEST_TAB_ROW(ID);

我們插入500條記錄,此時,這個數據量不足以觸發統計信息更新,如下所示, Rows Sampled還是1000000

DECLARE @Index INT =1; WHILE @Index <= 500BEGIN  INSERT INTO TEST_TAB_ROW VALUES(100000 +@Index, NEWID());  SET @Index+=1; END

如下所示,發現sys.partitions中的記錄變成了100500了,可見rows這個值的計算不依賴統計信息。

當然,如果你用sp_spaceused,發現這里面的記錄也是100500

sp_spaceused 'dbo.TEST_TAB_ROW'

關于問題3:有多個索引的表,是否記錄數會存在不一致的情況?

答案:個人測試以及統計來看,暫時發現多個索引的情況下,sys.partitions中的rows記錄數都是一致的。暫時沒有發現不一致的情況,當然也不排除有特殊情況。

關于問題5: 分區表的情況又是怎么樣?

答案:分區表和普通表沒有任何區別。

關于問題6:對象目錄視圖sys.partitions與sp_spaceused獲取的表記錄函數是否準確?

答案:對象目錄視圖sys.partitions與sp_spaceused獲取的表記錄數是準確的。

ORACLE 數據庫

在ORACLE數據庫中,可以通過DBA_TABLES、ALL_TABLES、USER_TABLES視圖查看表的記錄數,不過這個值(NUM_ROWS)跟統計信息有很大的關系,有時候統計信息沒有更新或采樣比例會導致這個值不是很準確。

SELECT OWNER  ,   TABLE_NAME,   NUM_ROWS ,  LAST_ANALYZEDFROM DBA_TABLES WHERE OWNER = '&OWNER'   AND TABLE_NAME = '&TABLE_NAME';   SELECT OWNER,  TABLE_NAME,  NUM_ROWS ,  LAST_ANALYZEDFROM ALL_TABLESWHERE OWNER ='&OWNER'AND TABLE_NAME='&TABLE_NAME';  SELECT TABLE_NAME,  NUM_ROWS ,  LAST_ANALYZEDFROM USER_TABLESWHERE TABLE_NAME='&TABLE_NAME'

更新統計信息后,就能得到準確的行數。所以如果需要得到正確的數據,最好更新目標表的統計信息,進行100%采樣分析。對于分區表,那么就需要從dba_tab_partitions里面查詢相關數據了。

SQL>execute dbms_stats.gather_table_stats(ownname => 'username', tabname =>'tablename', estimate_percent =>100, cascade=>true);

MySQL數據庫

在MySQL中比較特殊,雖然INFORMATION_SCHEMA.TABLES也可以查到表的記錄數,但是非常不準確。如下所示,即使使用ANALYZE TABLE更新了統計信息,從INFORMATION_SCHEMA.TABLES中獲取的記錄依然不準確

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLESWHERE TABLE_NAME='table_name'
mysql> SELECT TABLE_ROWS  -> FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_NAME='jiraissue' -> ;+------------+| TABLE_ROWS |+------------+|  36487 |+------------+1 row in set (0.01 sec) mysql> select count(*) from jiraissue;+----------+| count(*) |+----------+| 36973 |+----------+1 row in set (0.05 sec) mysql> analyze table jiraissue;+----------------+---------+----------+----------+| Table   | Op  | Msg_type | Msg_text |+----------------+---------+----------+----------+| jira.jiraissue | analyze | status | OK  |+----------------+---------+----------+----------+1 row in set (1.41 sec) mysql> SELECT TABLE_ROWS  -> FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_NAME='jiraissue';+------------+| TABLE_ROWS |+------------+|  34193 |+------------+1 row in set (0.00 sec) mysql> 

如上所示,MySQL這種查詢表記錄數的方法看來還是有缺陷的。當然如果不是要求非常精確的值,這個方法也是不錯的。

當然,上面介紹的SQL Server、Oracle、MySQL數據庫中的方法,還是有一些局限性的。例如,只能查詢整張表的記錄數,對于那些查詢記錄數帶有查詢條件(WHERE)這類SQL。還是必須使用SELECT COUNT(*)這種方法。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产免费一级| 在线中文资源天堂| xxx国产精品| 黄色网页网址在线免费| 免费特级黄毛片| 日p在线观看| 日本一卡二卡四卡精品| 国产精品乱码一区二区三区视频| 亚洲欧美日韩一区成人| 91这里只有精品| 国产色在线观看| 国产在线观看a视频| 日本高清中文字幕在线 | 最近中文字幕在线中文视频| 中文在线观看视频| 精品国产一区二区三区不卡在线| 亚洲私人影吧| 国产调教视频在线观看| av网站在线播放| 黄色国产网站在线观看| 国产精品久久久久一区二区国产| 亚洲欧美精选| 91嫩草在线播放| 最近中文字幕在线中文视频| 伊人国产在线看一| 一区二区三区四区在线免费视频| 亚洲国产精品区| 国产丝袜在线| 福利视频在线看| 国产丝袜在线观看视频| eeuss影院在线观看| 国产区卡一卡二卡三乱码免费| a视频在线看| 国产黄色在线观看| 国产乱子视频| 青青草在线免费观看| 国产精品视频福利一区二区 | 国产亚洲精品久久久久久青梅| 亚洲xxxxxx| 精品入口蜜桃| 国产黄色片中文字幕| 国产网友自拍视频导航网站在线观看| av免费在线观看网站| 国产色在线播放| 中文字幕亚洲免费| 国产美女视频一区二区三区| 思思99精品视频在线观看| 在线观看av网站| 在线观看视频污| 日本欧洲一区| 成年网在线观看免费观看网址| 日本福利在线观看| 久久99精品久久久久久野外| 麻豆福利在线观看| 国产麻豆一级片| 国产精品国产国产aⅴ| 91麻豆福利| 制服丝袜中文字幕在线观看| 国产激情视频网址| av在线1区2区| 超碰97国产精品人人cao| 成年黄网站在线观看免费| 久久国产综合视频| 国产精品久久久久白浆| 99在线播放| 九九热视频精品在线观看| 国产在线观看a视频| √天堂8资源中文在线| 国产精品国产三级国产试看| 亚洲欧美小说国产图片| 丁香花高清视频完整版在线观看| 国产精品一区在线看| 国产高清在线观看| www黄在线观看| 国产一卡2卡3卡四卡网站| 国产不卡精品一区二区三区| 日本免费黄色| 91xx在线观看| 天天av天天爱| sese一区| 精品视频一二区| 中文字幕高清av| 久久久久久91精品色婷婷| 91美女在线| 国产激情视频一区二区三区| 激情在线视频播放| 天天操夜夜添| 国产尤物一区二区三区| 91网页在线观看| 欧美视频免费一区二区三区 | av免费在线观看网站| 天天av天天爽| 久草视频国产| av在线免费观看网| 精品一二三四| 国产91在线视频蝌蚪| 91av久久| 国产免费电影网站入口| 欧美日韩一区二区三区在线播放| 精品无人区乱码1区2区3区免费| 国产网站麻豆精品视频| 免费看成年人视频在线观看| 在线欧美一级视频| 中文乱码字幕高清在线观看| 国产aa视频| 亚洲图区欧美| 亚洲精品影视在线| 日本一二三区视频免费高清| 性欧美精品xxxx| 四虎网站在线观看| 国产中文在线视频| 丁香六月婷婷| 久久五月精品中文字幕 | av在线电影观看| 国产黄色片大全| 91最新在线| 亚洲91av| 国产伦精品一区二区三区高清版禁| 最好2018中文免费视频| 国产成人福利| 日本a级黄色| 国产午夜精品一区理论片| 国产精品国产三级国产试看| 97一区二区三区| 午夜性爽视频男人的天堂| 国产原创av在线| 国产黄色av免费看| 免费影视观看网站入口| 国产婷婷视频在线| av在线播放av| 国产婷婷视频在线| 毛片在线视频| 伊人永久在线| 中文字幕视频在线免费| 日本调教视频在线观看| 中文字幕视频在线| 免费一区二区在线观看| 国产黄在线播放| 国产免费视频| 日本视频一二三区中文字幕| 国产精品欧美韩国日本久久| www.xxx黄| 国产成人亚洲精品播放器下载| 四虎精品视频| 国产一起色一起爱| 九九热在线视频| baoyu777.永久免费视频| 国产色在线观看| 国产中文伊人| www.操操操| av中文网站| 国产乱子伦三级在线播放| 天天操夜夜添| 天天操天天射天天插| 精品国产一区二区三区不卡在线| 黄色片大全在线观看| 亚洲欧美日韩综合精品网| 国产一级影片| 国产亚洲精品午夜高清影院| 亚洲国产日韩成人综合天堂| 中文资源在线网| 99爱视频在线观看| 91涩漫在线观看c| 国产高清大尺度一区二区不卡| 国产一二三区在线观看| 国产美女被草| 天天操天天操天天色天天要| 国产自产视频| 激情五月色综合亚洲小说| 美女av在线播放| 超碰在线网址| 最新av中文字幕| 777电影在线观看| 亚洲男人网站| 免费99热在线观看| 丁香在线视频| 国产丝袜在线| 性网站在线播放| 国产麻豆精品高清在线播放| 国产精品久久在线| 国产成人久久精品77777| 91福利在线视频| www.超级碰| 国产午夜在线视频| 亚洲精品少妇久久久久久| 免费在线黄色av| 国产精品jvid在线观看| 亚洲夜夜综合| 国产乱精品一区二区三区| 最新黄网在线观看| 97视频免费| 国产免费福利网站| 99reav| 亚洲一本大道| 天天操天天操一操| 亚洲网站视频在线观看| 亚洲91av| 日本中文字幕视频| 亚洲夜夜综合| 国产精品入口免费麻豆|