數(shù)據(jù)庫實驗工作報告總結(jié)多篇_第1頁
數(shù)據(jù)庫實驗工作報告總結(jié)多篇_第2頁
數(shù)據(jù)庫實驗工作報告總結(jié)多篇_第3頁
數(shù)據(jù)庫實驗工作報告總結(jié)多篇_第4頁
數(shù)據(jù)庫實驗工作報告總結(jié)多篇_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)庫實驗工作報告總結(jié)多篇

試驗內(nèi)容

1、數(shù)據(jù)表的建立

基本表《簡潔的》帶有主鍵

帶有外碼約束的(外碼來自其他表或者本表)

2、數(shù)據(jù)表的修改

添加刪除列

修改列屬性類型

添加刪除約束(約束名)

元組的添加,修改,刪除

刪除數(shù)據(jù)表

試驗過程

1、createtablestudent

(

snochar(9)primarykey,/*sno是主碼列級完整性約束條件*/

snamechar(20)unique,/*sname取唯一值*/

ssexchar(2),

sagesmallint,/*類型為smallint*/

sdeptchar(20)/*所在系*/

);

createtablecourse

(

cnochar(4)primarykey,/*列級完整性約束條件,cno是主碼*/

cnamechar(40),

cpnochar(4),/*cpno的含義是先行課*/

ccreditsmallint,

foreignkey(cpno)referencescourse(cno)

/*表級完整性約束條件,cpno是外碼,被參照表是course,被參照列是cno*/

);

createtablesc

(

snochar(9),

cnochar(4),

gradesmallint,

primarykey(sno,cno),

/*主碼有兩個屬性構(gòu)成,必需作為表級完整性進(jìn)行定義*/

foreignkey(sno)referencesstudent(sno),

/*表級完整性約束條件,sno是外碼,被參照表是student*/

foreignkey(cno)referencescourse(cno),

/*表級完整性約束條件,cno是外碼,被參照表示course*/

);

例1、createtables

(

cnovarchar(3),/*變長的字符串,輸入2個字符就是兩個字符不會補空格*/

snamevarchar(20),

statusint,

cityvarchar(20),

constraintpk_snoprimarykey(sno),/*約束條件的名字為pk_sno*/

);

createtablep

(

pnovarchar(3),

pnamevarchar(20),

colorvarchar(3),

weightint,

constraintpk_pnoprimarykey(pno),/*約束條件的名字是pk_pno*/

);

createtablej

(

jnovarchar(3),

jnamevarchar(20),

cityvarchar(20),

constraintpk_jnoprimarykey(jno)/*約束條件的名字為pk_jno*/

);

例2、createtablespj

(

snovarchar(3),/*第一個表中的主碼*/

pnovarchar(3),

jnovarchar(3),

qtyint,/*數(shù)量*/

constraintpk_spjprimarykey(sno,pno,jno),/*主碼由3個屬性組成*/

foreignkey(sno)referencess(sno),

/*表級完整性約束條件,sno是外碼,被參照表是s*/

foreignkey(pno)referencesp(pno),

/*表級完整性約束條件,pno是外碼,被參照表是p*/

foreignkey(jno)referencesj(jno),

/*表級完整性約束條件,jno是外碼,被參照表是j*/

);

2、數(shù)據(jù)表的更改

在s表中添加一個concat列

altertablesaddconcatvarchar(20)

在s表中刪除concat列

altertablesdropcolumnconcat

更改s表concat列的屬性把長度由20改為30

altertablesaltercolumnconcatvarchar(30)

聯(lián)系方式名字為concat修改屬性為唯一的屬性名為con_concat

altertablesaddconstraintcon_concatunique(concat)

刪除約束關(guān)系con_concat

altertablesdropconstraintcon_concat

/*插入一個元組*/

insertintosvalus(‘s1’,’精益’,20,’天津’)/*20不能寫成’20’*/

試驗中的問題的排解與總結(jié):

1、在創(chuàng)建spj時

有三個實體所以從3個實體中取主碼,還有一個數(shù)量屬性也要寫上

主碼由那3個主碼確定

2、更改一個數(shù)據(jù)庫中數(shù)據(jù)表時肯定要先使該數(shù)據(jù)庫處于正在使用狀態(tài)

3、constraint

是可選關(guān)鍵字,表示primarykey、notnull、unique、foreignkey或check約束定義的開頭。約束是特別屬性,用于強制數(shù)據(jù)完整性并可以為表及其列創(chuàng)建索引。

4、--go可以不加但是要留意挨次注:go--解釋提示錯誤

5、留意添加一個空元素用null

附sql備份

--創(chuàng)建一個數(shù)據(jù)庫student

createdatabasestudent

go

--在數(shù)據(jù)庫student中創(chuàng)建表studentcoursesc留意挨次

usestudent

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

createtablestudent

(

snochar(9)primarykey,/*sno是主碼列級完整性約束條件*/

snamechar(10)unique,/*sname取唯一值*/

ssexchar(2),

sagesmallint,/*類型為smallint*/

sdeptchar(20)/*所在系*/

);/*;要加*/

-----------

數(shù)據(jù)庫試驗總結(jié)【二】

我在sqlserver索引基礎(chǔ)學(xué)問系列中,第一篇就講了記錄數(shù)據(jù)的基本格式。那里主要講解的是,數(shù)據(jù)庫的最小讀存單元:數(shù)據(jù)頁。一個數(shù)據(jù)頁是8k大小。

對于數(shù)據(jù)庫來說,它不會每次有一個數(shù)據(jù)頁變化后,就存到硬盤。而是變化達(dá)到肯定數(shù)量級后才會作這個操作。這時候,數(shù)據(jù)庫并不是以數(shù)據(jù)頁來作為操作單元,而是以64k的數(shù)據(jù)(8個數(shù)據(jù)頁,一個區(qū))作為操作單元。

區(qū)是管理空間的基本單位。一個區(qū)是八個物理上連續(xù)的頁(即64kb)。這意味著sqlserver數(shù)據(jù)庫中每mb有16個區(qū)。

為了使空間安排更有效,sqlserver不會將全部區(qū)安排給包含少量數(shù)據(jù)的表。sqlserver有兩種類型的區(qū):

統(tǒng)一區(qū),由單個對象全部。區(qū)中的全部8頁只能由所屬對象使用。

混合區(qū),最多可由八個對象共享。區(qū)中八頁的每頁可由不同的對象全部。

通常從混合區(qū)向新表或索引安排頁。當(dāng)表或索引增長到8頁時,將變成使用統(tǒng)一區(qū)進(jìn)行后續(xù)安排。假如對現(xiàn)有表創(chuàng)建索引,并且該表包含的行足以在索引中生成8頁,則對該索引的全部安排都使用統(tǒng)一區(qū)進(jìn)行。

為何會這樣呢?

其實很簡潔:

讀或?qū)?kb的時間與讀或?qū)?4kb的時間幾乎相同。

在8kb到64kb范圍之內(nèi),單個磁盤i/o傳輸操作所花的時間主要是磁盤取數(shù)臂和讀/寫磁頭運動的時間。

因此,從數(shù)學(xué)上來講,當(dāng)需要傳輸64kb以上的sql數(shù)據(jù)時,

盡可能地執(zhí)行64kb磁盤傳輸是有益的,即分成數(shù)個64k的操作。

由于64kb傳輸基本上與8kb傳輸一樣快,而每次傳輸?shù)膕qlserver數(shù)據(jù)是8kb傳輸?shù)?8倍。

我們通過一個實例來看有and操作符時候的最常見的一種狀況。我們有下面一個表,

createtable[dbo].[member]([member_no][dbo].[numeric_id]identity(1,1)notnull,[lastname][dbo].[shortstring]notnull,[firstname][dbo].[shortstring]notnull,[middleinitial][dbo].[letter]null,[street][dbo].[shortstring]notnull,[city][dbo].[shortstring]notnull,[state_prov][dbo].[statecode]notnull,[country][dbo].[countrycode]notnull,[mail_code][dbo].[mailcode]notnull,[phone_no][dbo].[phonenumber]null,[photograph][image]null,[issue_dt][datetime]notnulldefault(getdate()),[expr_dt][datetime]notnulldefault(dateadd(year,1,getdate())),[region_no][dbo].[numeric_id]notnull,[corp_no][dbo].[numeric_id]null,[Pv_balance][money]nulldefault(0),[curr_balance][money]nulldefault(0),[member_code][dbo].[status_code]notnulldefault())

這個表具備下面的四個索引:

索引名細(xì)節(jié)索引的列

member_corporation_linknonclusteredlocatedonprimarycorp_no

member_identclustered,unique,primarykeylocatedonprimarymember_no

member_region_linknonclusteredlocatedonprimaryregion_no

memberfirstnamenonclusteredlocatedonprimaryfirstname

當(dāng)我們執(zhí)行下面的sql查詢時候,

selectm.member_no,m.firstname,m.region_nofromdbo.memberasmwherem.firstnamelikek%andm.region_no6andm.member_no5000go

sqlserver會依據(jù)索引方式,優(yōu)化成下面方式來執(zhí)行。

selecta.member_no,a.firstname,b.region_nofrom(selectm.member_no,m.firstnamefromdbo.memberasmwherem.firstnamelikek%andm.member_no5000)a,--這個查詢可以直接使用memberfirstname非聚集索引,而且這個非聚集索引掩蓋了全部查詢列--實際執(zhí)行時,只需要規(guī)律讀取3次

(selectm.member_no,m.region_nofromdbo.memberasmwherem.region_no6)b

--這個查詢可以直接使用member_region_link非聚集索引,而且這個非聚集索引掩蓋了全部查詢列--實際執(zhí)行時,只需要規(guī)律讀取10次

wherea.member_no=b.member_no

不信,你可以看這兩個sql的執(zhí)行方案,以及規(guī)律讀信息,都是一樣的。

其實上面的sql,假如優(yōu)化成下面的方式,實際的規(guī)律讀消耗也是一樣的。為何sqlserver不會優(yōu)化成下面的方式。是由于and操作符優(yōu)化的另外一個原則。

1/26的數(shù)據(jù)和1/6的數(shù)據(jù)找交集的速度要比1/52的數(shù)據(jù)和1/3的數(shù)據(jù)找交集速度要慢。

selecta.member_no,a.firstname,b.region_nofrom(selectm.member_no,m.firstnamefromdbo.memberasmwherem.firstnamelikek%--1/26數(shù)據(jù))a,

(selectm.member_no,m.region_nofromdbo.memberasmwherem.region_no6andm.member_no5000--1/3*1/2數(shù)據(jù))bwherea.member_no=b.member_no

當(dāng)然,我們要學(xué)習(xí)sql如何優(yōu)化的話,就會用到查詢語句中的一個功能,指定查詢使用哪個索引來進(jìn)行。

比如下面的查詢語句

selectm.member_no,m.firstname,m.region_nofromdbo.memberasmwith(index(0))wherem.firstnamelikek%andm.region_no6andm.member_no5000go

selectm.member_no,m.firstname,m.region_nofromdbo.memberasmwith(index(1))wherem.firstnamelikek%andm.region_no6andm.member_no5000goselectm.member_no,m.firstname,m.region_nofromdbo.memberasmwith(index(membercovering3))wherem.firstnamelikek%andm.region_no6andm.member_no5000goselectm.member_no,m.firstname,m.region_nofromdbo.memberasmwith(index(memberfirstname,member_region_link))wherem.firstnamelikek%andm.region_no6andm.member_no5000go

這里index計算符可以是0,1,指定的一個或者多個索引名字。對于0,1的意義如下:

假如存在聚集索引,則index(0)強制執(zhí)行聚集索引掃描,index(1)強制執(zhí)行聚集索引掃描或查找(使用性能最高的一種)。

假如不存在聚集索引,則index(0)強制執(zhí)行表掃描,index(1)被解釋為錯誤。

總結(jié)學(xué)問點:

簡潔來說,我們可以這么理解:sqlserver對于每一條查詢語句。會依據(jù)實際索引狀況(sysindexes系統(tǒng)表中存儲這些信息),分析每種組合可能的成本。然后選擇它認(rèn)為成本最小的一種。作為它實際執(zhí)行的方案。

成本代價計算的一個主要組成部分是規(guī)律i/o的數(shù)量,特殊是對于單表的查詢。

and操作要滿意全部條件,這樣,常常會要求對幾個數(shù)據(jù)集作交集。數(shù)據(jù)集越小,數(shù)據(jù)集的交集計算越節(jié)約成本。

的項目中,竟然消失了濫用聚集索引的問題??磥頉]有培訓(xùn)最最基礎(chǔ)的索引的意義,代價,使用場景,是一個特別大的失誤。這篇博客就是從這個角度來排列索引的基礎(chǔ)學(xué)問。

使用索引的意義

索引在數(shù)據(jù)庫中的作用類似于名目在書籍中的作用,用來提高查找信息的速度。

使用索引查找數(shù)據(jù),無需對整表進(jìn)行掃描,可以快速找到所需數(shù)據(jù)。

使用索引的代價

索引需要占用數(shù)據(jù)表以外的物理存儲空間。

創(chuàng)建索引和維護(hù)索引要花費肯定的時間。

當(dāng)對表進(jìn)行更新操作時,索引需要被重建,這樣降低了數(shù)據(jù)的維護(hù)速度。

創(chuàng)建索引的列

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論