成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何讓SQL中的COUNT(*)飛起來

運維 數據庫運維
COUNT(*)是每個初學者的最愛,但凡漂亮的按下回車時,看著轉啊轉的進度條,總是有種莫名的喜感。平時總被老板催著干這干那,現在我也能指揮下電腦幫我跑跑數據!

[[410900]]

本文轉載自微信公眾號「有關SQL」,作者一只小小鳥鳥。轉載本文請聯系有關SQL公眾號。

COUNT(*)是每個初學者的最愛,但凡漂亮的按下回車時,看著轉啊轉的進度條,總是有種莫名的喜感。平時總被老板催著干這干那,現在我也能指揮下電腦幫我跑跑數據!

雖說平時面試官總愛問 COUNT(*) 有什么壞處啊,為什么要避免使用 COUNT(*) 這類怪問題。真要說起來,他們也是一臉懵圈,因為面試題都有可能是網上隨便摘的。

至于原理,多少人真正懂呢,真正在乎呢?

那么,COUNT(*)的性能真那么差嗎?怎么才能提高性能呢!今天就盤它

已知 SQL Server 中有這樣張表 (其他數據庫也適用):

  1. CREATE TABLE [dbo].[MobileLink]( 
  2.  [user_id] [varchar](50) NULL
  3.  [item_id] [varchar](50) NULL
  4.  [behavior_type] [varchar](50) NULL
  5.  [user_geohash] [varchar](50) NULL
  6.  [item_category] [varchar](50) NULL
  7.  [time] [varchar](50) NULL 

笨拙的堆表(Heap Table)

這張表沒有索引,是張堆表(Heap Table). 總共有4000多萬條數據。

第一次,運行 count(*)

  1. SELECT COUNT(*) AS CNT  
  2. FROM dbo.MobileLink 

可以看到運行大約花了 3 秒時間 執行計劃也簡單,走了全表掃描

萬能的性能殺-索引

我之前也分享過,數據是存在數據頁上的。這個數據頁可以看做是一頁紙。在紙上把字寫得越緊湊,得到的信息越多。反之,如果你把字寫得夠大,行與行之間又很松散,每頁紙能容納的信息量也就少了。

于是,像這樣全表掃描的效率就很低,理論上,只要把每頁上,每一行的第一個字段統計下,就能知道有多少行了。于是索引就排上用場了。

第一個提高性能的方案就出來了,建一個索引

  1. CREATE INDEX IDX_USR_ITEM ON dbo.MobileLink(user_id,item_id) ;  

執行計劃如我所料,肯定走索引

總耗時2.036s 比剛才 3s 好上一丟丟。

經??吹骄W上有貼發表,count 單列(如 count(user_id) )會比 count(*) 有優勢,果真如此嗎?

  1. SELECT COUNT(user_id) AS CNT  
  2. FROM  dbo.MobileLink 

2.813s 對 2.036s , 并無優勢。

快上加快-壓縮

那么按照剛才的思路,現在已經取 user_id , item_id 作為統計基數了,那么是不是還有辦法可以更小?對,那就是壓縮

  1. ALTER INDEX IDX_USR_ITEM ON dbo.MobileLink REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);   

執行上面壓縮語句,再運行 count(*). 對比結果與執行計劃

耗時已經進入1s級,又進一步。

再反觀,使用單列( COUNT(user_id) )來統計行數:

依舊在2s級徘徊!

可見, COUNT(USER_ID) 并無優勢!

SQL Server: 我還可以更快

還有更快的方法,列式索引。它的優點除了節省空間外,還外加壓縮,雙重優化。

  1. CREATE NONCLUSTERED COLUMNSTORE INDEX COL_IDX ON dbo.MobileLink(user_id,item_id) ;  

已經破1s 級。在列式索引面前,其他索引都得讓道!

列式索引的結構比較復雜,詳細可見這篇(SQL Server Storage)。在這里提到列式索引,旨在分享,列式索引的存儲和壓縮優勢。

 

對數據庫各項特性了解越多,對待同一問題可用的方法也就越多。所以,我找不到理由,不去通讀數據庫體系類的書。

 

責任編輯:武曉燕 來源: 有關SQL
相關推薦

2020-09-29 07:54:05

Express 飛起

2011-04-13 10:51:58

MATLAB

2024-11-27 09:46:34

2023-11-10 18:03:04

業務場景SQL

2025-04-15 00:00:00

2025-03-28 03:20:00

MySQL數據庫搜索

2019-11-05 10:35:57

SpringBoot調優Java

2013-01-07 09:34:43

CodeLoveBAT

2011-02-25 08:39:11

QFabric數據中心Juniper

2025-01-17 09:23:31

2019-03-25 08:05:35

Elasticsear優化集群

2016-01-19 17:03:59

數據中心網絡華為

2023-03-01 23:59:23

Java開發

2011-09-27 13:25:05

Web

2024-06-12 12:28:23

2024-11-25 18:00:00

C#代碼編程

2020-12-31 07:59:11

SaaS軟件即服務軟件

2011-10-18 10:30:11

筆記本評測

2025-06-04 01:35:00

RocketMQ異步消息

2016-05-11 09:18:21

AWS云數據倉庫Redshift
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产精品一区二区 | 美女视频一区二区三区 | 老牛嫩草一区二区三区av | 亚洲一区电影 | 国产精品美女久久久久aⅴ国产馆 | 国产一级毛片精品完整视频版 | 久久蜜桃av一区二区天堂 | 天天色天天色 | 中文字幕视频一区 | 久久九九影视 | 午夜在线视频 | 国产精品久久久久久影视 | 综合九九 | 色一级| 九一国产精品 | 国产一区二区三区在线视频 | 一级黄色淫片 | 九色 在线| 成人免费网站 | 亚洲视频区 | 国产精品日韩一区 | 一级毛片在线播放 | 99久久精品免费看国产小宝寻花 | 日韩精品一区二区三区久久 | www.成人.com | 岛国毛片在线观看 | 精品欧美一区二区久久久伦 | 日韩一区二区久久 | 亚洲精品视频导航 | 成人h免费观看视频 | 国产精品国产三级国产aⅴ中文 | 日本大香伊一区二区三区 | 久久久人 | 亚洲国产一区二区三区四区 | 91视频一区二区三区 | 人人看人人射 | 日韩成人免费视频 | 男女网站免费 | 亚洲欧美激情网 | 欧美精品中文字幕久久二区 | 午夜国产 |