sql count(*) vs count(1)

Post on 09-Jan-2017

88 Views

Category:

Software

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

MS SQL 123

2

SELECT COUNT (*) FROM mytable 一定會使用 Table Scan?

3

NO

4

SQL 會用最小 i/o 成本的方式選擇最小的 Page Number

5

DEMO

6

CREATE TABLE CTest (c1 INT IDENTITY, c2 BIGINT DEFAULT 1, c3 CHAR (1000) DEFAULT 'a');GOSET NOCOUNT ON;GOINSERT INTO CTest DEFAULT VALUES;GO 10000

7

開啟實際的執行計畫 Enable execution plan viewers in SSMS

Include Actual Execution Plan

8

SELECT COUNT (*)

SELECT COUNT (*) from CTest;

9

加入 NonClustered Index – c2 (BIGINT)

CREATE NONCLUSTERED INDEX CTest_1 ON CTest (c2);

10

SELECT COUNT (*) SELECT COUNT (*) from CTest;

變成了 Index Scan 因為使用 CTest_1 index 會比使用 Table Scan 使用更少的 i/o

11

加入 NonClustered Index – c1 (INT)

CREATE NONCLUSTERED INDEX CTest_2 ON CTest (c1);

12

SELECT COUNT (*) SELECT COUNT (*) from CTest;

跟 CTest_1 Index 相比 CTest_2 Index 使用更少的 i/o

13

看一下每個 Index 的 Page CountSELECT a.[index_id], a.[page_count], b.name AS index_nameFROM sys.dm_db_index_physical_stats(DB_ID (), OBJECT_ID ('CTest'), NULL, NULL, 'LIMITED') aINNER JOIN sys.indexes bON a.object_id = b.object_id AND a.index_id = b.index_id;

14

15

Count(*) or

Count(1)

16

50/50

17

GUID是一個好的Cluster Key?

18

NO

19

RandomIndex fragmentation

16 bytes long

20

DEMO

21

建立測試的資料表create table tblSAMPLE_1(xnewid uniqueidentifier default(newid()) primary key, xname varchar(10) );go

insert into tblSAMPLE_1(xname) values('rainmaker')go 500

22

查看 Index 的破碎狀況

23

大於 30% 就 Rebuild Index

24

查看 Table 各 Index 的破碎狀況SELECT a.index_id, name, avg_fragmentation_in_percentFROM sys.dm_db_index_physical_stats (DB_ID(N'tempdb'), OBJECT_ID(N'tblSAMPLE_1'), NULL, NULL, NULL) AS a JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;

top related