Sqlserver 筆記 持續更新

來源:互聯網
上載者:User

標籤:使用   io   資料   ar   art   問題   時間   size   

1.sp_spaceused :

sp_spaceused table_name


---------------------------------------------------------------------------------------------

name  rows  reserved  data  index_size  unused

table_name 16470592  36315696KB  35796160KB  519432KB  104KB

name  -- 自然就是表名或object名了


rows -- 表中資料的行數


reserved -- 這個表占的總共的size,等於data 35796160KB + index_size 519432KB + unused 104KB

data -- 資料頁面總共占的大小

index_size -- index頁面總共占的大小

unused -- 留下的一點小空間。因為磁碟分配空間等原因多給的那麼一點。和fill factor沒有關係

 

2.sys.dm_db_partition_stats

select b.name,a.row_count from sys.dm_db_partition_stats a,
sys.objects b
where a.object_id=b.object_id
and a.index_id<=1
and b.type=‘U‘

sys.dm_db_partition_stats它返回當前資料庫中每個分區的頁和行計數資訊,在上面的sql中,三個關鍵列的意思如下:
object_id:表或者索引檢視表的ID,所以可以用它與sys.objects表的object_id相匹配。
row_count:該表或索引檢視表中資料的數量,就是我們要查詢的結果。
index_id:該表或索引檢視表的索引ID。 如果該表沒有索引,那麼會在sys.dm_db_partition_stats中存在一行index_id=0的記錄,如果有一個叢集索引(而且一個表中也只能有一個叢集索引),那麼在sys.dm_db_partition_stats中存在一行index_id=1的記錄,而對應的index_id=0的記錄沒有了。如果這個表在sys.dm_db_partition_stats中存在多行index_id >1的記錄,則說明這個表存在多個非叢集索引,我們這裡判斷index_id<=1,是假定每個表都有主鍵,且主鍵為叢集索引。配合sys.objects表的type=‘U‘,就可以查出每個使用者表的資料數量了。

 3.使用Delete刪除大量資料後SQL Server效能下降的問題及解決方案

 

問題產生原因:
1,當表上有叢集索引時,刪除操作會釋放空頁。然而,從堆中刪除行時,資料庫引擎可以使用行鎖定或頁鎖定進行操作。結果,刪除操作導致的空頁將繼續分配給堆。未釋放空頁時,資料庫中的其他對象將無法重用關聯的空間。
2,雖然表中沒有大量資料,但是它們擁有大量的幾乎為空白的資料頁。掃描表因此變得十分花時間。

解決方案:
若要刪除堆中的行並釋放頁,我們可以使用下列方法中的一種。
1,在DELETE語句中指定TABLOCK提示。使用TABLOCK命令會導致刪除操作擷取表的共用鎖定,而不是行鎖或頁鎖。這將允許釋放頁。
2,如果要從表中刪除所有行,可使用TRUNCATE TABLE代替Delete
3,刪除行之前,請對堆建立叢集索引。刪除行之後,可以刪除叢集索引。與前面的方法相比,此方法非常耗時,並且使用更多的臨時資源。

4.

在SQL中邏輯運算式的可能值包括TRUE、FALSE和UNKNOWN,它們被稱之為三值邏輯。

我們知道,在其它的語言中,邏輯運算式只有兩種,要麼是true,要麼就是false。而sql中卻存在第三個邏輯運算式UnKnown,這個是sql中特有的。從字面意思上我們可以解理該值的意思是:什麼都不知道,就是什麼都不是。一般情況下我們將任何值(包括NULL本身)與NULL做比較的時候,都會返回UnKnown。而在查詢運算式中(比如where與having中),UnKnown會視為false。所以我們就明白了為什麼select * from 表 where 欄位=null查不到正確的結果的原因了。

但並不是在所有場情下UnKnown都會視為false來處理,在check約束中,UnKnown就會視為true來處理。這就是為什麼我們設定某個欄位的值必須大於等於0的情況下,我們還可以往該欄位中插入Null值,那是因為在check約束中null>=0的邏輯結果UnKnown會被當作true來處理
需要注意的是,在分組子句與排序子句中,sql視null是相等的
即:
1,GROUP BY會把所有NULL值分到一組。
2,ORDER BY會把所有NULL值排列在一起。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.