sql不唯一
㈠ sql Server唯一索引和非唯一索引的區別簡析
1. 在表和索引設計階段,如果配卜可能,欄位設定為不允許NULL,索引設定為唯一。這樣節約存儲空間並提高了IO效率。
2. 聚集索引鍵列應該盡量選用窄的欄位,因為非聚集索引會引用其鍵列。如果聚集鍵過大則會使非聚集索引同時也佔用更多存儲空間。
3. SQL Server在創建索引時,默認是創建非唯一的培旦穗。所以在創建索引時,要認真考慮是否可遲耐以創建為唯一索引。
㈡ SQL Server唯一索引和非唯一索引的區別簡析
SQL Server創建索引時,可以指定Unique使之成為唯一索引。「唯一」顧名思義,但是兩都到底有什麼區別呢?因為索引也是一種物理結構,所以還是要從存儲和結構上分析。
索引結構分葉級和非葉級,分析時我們要分開來看,這個很重要。
文中涉及的索引行大小計算,參考MSDN估計資料庫大小索引部分。
1. 非唯一聚集索引和唯一聚集索引
創建兩個測試表,各10000條整數,tb1唯一,tb2非唯一,有1000條為9999的重復值。
view sourceprint?
01.<img onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_402704').style.display='none'; document.getElementById('Code_Open_Image_402704').style.display='inline'; document.getElementById('Code_Open_Text_402704').style.display='inline';"id="Code_Closed_Image_402704"align="top"src=""width="11"height="16"style="display: none;"><img alt="載入中..."title="圖片載入中..."src="http://www.it165.net/statics/images/s_nopic.gif"><img onclick="this.style.display='none'; document.getElementById('Code_Open_Text_402704').style.display='none'; getElementById('Code_Closed_Image_402704').style.display='inline'; getElementById('Code_Closed_Text_402704').style.display='inline';"id="Code_Open_Image_402704"style="display: none;"align="top"src=""width="11"height="16"><img alt="載入中..."title="圖片載入中..."src="http://www.it165.net/statics/images/s_nopic.gif">Codecreate table tb1
02.(col1int);
03.declare@iint=1
04.while@i<10001
05.begin
06.insert into tb1 values(@i);
07.set@i=@i+1;
08.end;
09.create unique clustered index ucix on tb1 (col1)
10.go
11.-------
12.create table tb2
13.(col2int);
14.declare@iint=1
15.while@i<9001
16.begin
17.insert into tb2 values(@i);
18.set@i=@i+1;
19.end;
20.go
21.insert into tb2 values(9999)
22.go1000;
23.create clustered index cix on tb2 (col2)
24.go
先查詢索引的一些基本狀況:
發現多出一個UNIQUIFIER,同樣葉級也是一樣。MSDN說明:
「如果聚集索引不是唯一的索引,SQL Server 將添加在內部生成的值(稱為唯一值)以使所有重復鍵唯一。此四位元組的值對於用戶不可見。僅當需要使聚集鍵唯一以用於非聚集索引中時,才添加該值。」
還有UNIQUIFIER不是一個全局自增列,重復記錄增加時此值會發生改變,並且它是一個可為null的變長列。
現在來算一算索引行大小:
兩個表都是只有一個int型可為NULL的欄位,而聚集索引葉級是存儲數據本身
葉級是一個4位元組的INT列,無變長列,加上3位元組的NULL點陣圖,再加上4位元組的行頭開銷:兩個表的葉級minSize =4+0+3+4=11
非葉級是一個4位元組的INT列,無變長列,加上3位元組的NULL點陣圖,加上1位元組的行頭開銷,再加6位元組的子頁指針:兩個表的非葉級minSize=4+0+3+1+6=14
tb1的索引行大小是一致的minSize=maxSize,因為它是唯一的。tb2的索引行大小不一致,有大有小,大的索引行是因為:a)不唯一 b)UNIQUIFIER
唯一標識列增加了2+1*2+4=8位元組開銷,tb2的min和max相差就是這8位元組。
tb2的葉級maxSize=4+8+3+4=19
tb2的非葉級maxSize=4+8+3+1+6=22
小結:非唯一聚集索引為保證索引鍵值唯一性,會生成UNIQUIFIER與鍵列一起組成索引鍵值。同時無論在葉級還是非葉頁級,都比唯一索引佔用更多存儲空間。
㈢ SQL server 建立的觸發器子查詢返回值不唯一,需要用多個返回值如何操作
問題在
(select商品數目 from購物襪梁車細則where購物車細則.購物車編號=購物車編號)。
這裡面商品數目是多條。
改為
(select商品數目 from購物車細則where購物車細則告敗運.購物車編號=購物枯帶車編號 and 購物車細則.商品編號=商品.商品編號)
㈣ SQL SERVER中怎麼樣在主關鍵字上創建聚集不唯一索引
一個表只能有一個 聚集索引 ,但可以有多個野納神 非聚集索引 設置某列為主鍵,則該列就默認為 聚集索引;
創建了唯一茄陪約束,將自動為其創建 唯一索引, 唯一索引的性能 往往是很差的,所以 建議使頌虧用 主鍵約束;相信您的問題已經得到了解答。。
㈤ SQL SERVER中怎麼樣在主關鍵字上創建聚集不唯一索引
呵,你可以試著在建表時,建雙主鍵!
或者,建一張關聯表,把第一張表的主建,和要讓桐關聯的第二張的主坦州坦建,都放在第三跡鉛張表去,然後進行關聯查尋!這樣表與表之間就能相互取值了
㈥ sql把兩個結果集一對一連接但欄位不唯一
關聯問題。在sql里兩張表帆數中的關聯欄位都是唯一的,關聯之後關聯欄位竟然不態鋒首唯一了。SQL是具有數據操縱和數據定義等多種功能的資料庫語言基者,這種語言具有交互性特點。
㈦ 資料庫語句返回記錄不唯一,會出現什麼現象
返回數據不唯一,就把符合SQL語句條件的所有項都列出來。
查詢語句不會只輪鄭用於精確定位查找,還會有泛查找,比如符合每個條件的許多人,例如都是20歲的,或者都大於多少小於多少等等。
你問這個問題,表示你對SQL語句很不熟悉頃畝,只要你的語句是對的,你的資料庫不要太龐大(如果你查雀桐森詢的范圍太廣,會耗費非常大的資源),就OK