SQL 常識

一、varchar 與 nvarchar 的區別?數據庫

varchar(n):長度爲 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節。nvarchar(n):包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。數據庫設計

通俗的說:通常若是包含中文或者其它特殊字符,我就會使用n開頭的類型,不然的話直接使用var開頭的。性能

順便介紹下Unicode字符:Unicode字符集就是爲了解決字符集這種不兼容的問題而產生的,它全部的字符都用兩個字節表示,即英文字符也是用兩個字節表示。優化

附表:spa

char(n)設計

定長指針

索引效率高 程序裏面使用trim去除多餘的空白code

 n 的值必須介於1 和 8,000 之間,存儲大小爲 n 個字節排序

nchar(n)索引

定長

處理Unicode數據類型(全部的字符使用兩個字節表示)

n 的值必須介於 1 與 4,000 之間,存儲大小爲 n 字節的兩倍

varchar(n)

變長

效率沒char高 但靈活

n 的值必須介於 1 和 8,000 之間,存儲大小爲輸入數據的字節的實際長度,而不是   n 個字節

nvarchar(n)

變長

處理Unicode數據類型(全部的字符使用兩個字節表示)

n 的值必須介於 1與 4,000 之間,字節的存儲大小是所輸入字符個數的兩倍,所輸入的數據字符長度能夠爲零

text

變長

 

 

ntext

變長

處理Unicode數據類型(全部的字符使用兩個字節表示)

 

針對上表所屬類型我作一個簡單的分析:

char:儲定長數據很方便,char字段上的索引效率級高,好比定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間,不足的自動用空格填充,因此在讀取的時候可能要屢次用到trim()。

varchar:存儲變長數據,但存儲效率沒有char高。若是一個字段可能的值是不固定長度的,咱們只知道它不可能超過10個字符,把它定義爲varchar (10)是最合算的。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際狀況找到權衡點。

歸納一下就是:

char,nchar定長,速度快,佔空間大,需處理

varchar,nvarchar,text不定長,空間小,速度慢,無需處理

nchar、nvarchar、ntext處理Unicode碼

二、 數據庫索引

要點:索引關鍵目的是爲了加快檢索速度而創建的,因此,怎麼用索引是數據庫系統自己的事情,做爲數據庫設計或使用者,設計並建立好索引而後體驗加上索引後的查詢變快的感受就好了。因此,索引怎麼用就變爲了「怎麼建立合適的索引」。

是什麼:索引是與表或視圖關聯的磁盤上結構,能夠加快從表或視圖中檢索行的速度。索引包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構中,使 SQL Server 能夠快速有效地查找與鍵值關聯的行。

索引的分類:

彙集索引:將表中記錄在物理數據頁中的位置按索引字段值從新排序,再將重排後的結果寫會到磁盤上,每一個表只能有一個彙集索引。

非彙集索引:與表中數據行的實際存儲結構無關,不會改變數據表中記錄的實際存儲順序,每一個表均可以有多個非彙集索引;

惟一索引:要求建立索引的關鍵字段值在表中不能有重複值。

複合索引:對錶建立的索引是基於多個字段對錶中的記錄排序的。

做用:與 書中的索引同樣,數據庫中的索引使您能夠快速找到表或索引視圖中的特定信息。索引包含從表或視圖中一個或多個列生成的鍵,以及映射到指定數據的存儲位置的 指針。經過建立設計良好的索引以支持查詢,能夠顯著提升數據庫查詢和應用程序的性能。索引能夠減小爲返回查詢結果集而必須讀取的數據量。索引還能夠強制表 中的行具備惟一性,從而確保表數據的數據完整性。

設計良好的索引能夠減小磁盤 I/O 操做,而且消耗的系統資源也較少,從而能夠提升查詢性能。對於包含 SELECT、UPDATE、DELETE 或 MERGE 語句的各類查詢,索引會頗有用。

怎麼用:怎麼用索引是數據庫系統自己的事情,做爲數據庫設計或使用者,設計並建立好索引,而後體驗加上索引後的查詢變快的感受就好了。因此,索引怎麼用就變爲了「怎麼建立合適的索引」。

建立索引的原則:

(1)、在常常用來檢索的列上建立索引(好比常常在where語句中出現的列);

(2)、在表的主鍵、或外鍵上建立索引;

(3)、不在數據類型爲text、ntext或image的列上建立索引;

(4)、只有較少行數的表沒有必要建立索引。

(5)、在常常須要排序的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間;

(6)、在常常須要根據範圍進行搜索的列上建立索引,由於索引已經排序,其指定的範圍是連續的;

總結概括索引的優勢:

(1)、建立惟一性索引,保證數據庫表中每一行數據的惟一性;

(2)、大大加快數據的檢索速度,這也是建立索引的最主要的緣由;

(3)、加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義;

(4)、在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間;

(5)、經過使用索引,能夠在查詢的過程當中使用優化隱藏器,提升系統的性能。

二)、創建方向索引的不利因素(缺點)
也許會有人要問:增長索引有如此多的優勢,爲何不對錶中的每個列建立一個索引呢?這種想法當然有其合理性,然而也有其片面性。雖然,索引有許多優勢,可是,爲表中的每個列都增長索引,是很是不明智的。這是由於,增長索引也有許多不利的一個方面。

第一,   建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。
第二,   索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
第三,   當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。

3、如何進行數據庫優化?

如何讓你的數據庫運行的更快,達到最好的性能效果,從多方面入手,好比:字段類型的定位、使用存儲過程、創建索引、關鍵字的使用等等。概要歸結以下:

(1)、使用where子句過濾,而少使用或不使用having;

(2)、使用錶鏈接而不是多個表查詢;

(3)、少創建觸發器,多使用存儲過程;

(4)、字段類型定位,創建索引;

(5)、使用union all 而不是 union;

(6)、使用exists而不是in、distinct;

(7)、提升硬件環境。

相關文章
相關標籤/搜索