2015計算機三級《數據庫技術》考前沖刺試題(3)
40在數據庫系統出現系統故障后進行恢復時,對于事務T,如果日志文件中有BEGIN TRANSACTION記錄,而沒有COMMIT或ROLLBACK記錄,則數據庫管理系統處理這種事務時應執行的操作是【11】。
參考解析:UNDO
【解析】系統故障造成數據庫狀態不一致的原因有兩個,一是未完成的事務對數據庫的更新可能已寫入數據庫,二是已提交事務對數據庫的更新可能還留在緩沖區沒來的及寫入數據庫。對于故障發生前已提交的事務(既有BEGIN Transaction,又有commit)做red0操作,對于故障發生時尚未完成的事務(只有BEGINTransaction,而沒有commit或rollback)做und0操作。
41在動態轉儲中,利用轉儲文件只能將數據庫恢復到轉儲過程中的某個狀態,且轉儲文件中的數據可能不一致,只有和【12】文件綜合起來使用,才能將數據庫恢復到一致狀態。
參考解析:日志
【解析】數據轉儲是數據庫恢復中采用的基本技術。所謂轉儲即DBA定期地將整個數據庫復制到磁帶或另一個磁盤上保存起來的過程。動態轉儲是指在轉儲過程期間允許對數據庫進行存取或修改,即轉儲和用戶事務可并發執行,但在轉儲數據后,副本上的數據并不能保證正確有效,為此必須把轉儲期間各事務對數據庫的修改活動登記下來,建立日志文件。
42通常數據庫的轉儲機制有三種,分別是完全轉儲、差量轉儲和【13】轉儲。
參考解析:增量
【解析】數據庫的轉儲機制一般有完全轉儲、差量轉儲和增量轉儲三種。完全轉儲是指對整個數據庫中的數據全部重新備份,效率低,時問長;差量轉儲指基于上一次完全轉儲基點之后變化轉儲,是對上次轉儲之后對所有文件中修改或刪除的記錄的轉儲,效率高,時問短;增量轉儲是對數據庫中凡是有記錄變化的文件的整個文件進行復制,效率介于前兩種轉儲方式之間。
43數據倉庫是面向主題的、【14】的、非易失的、隨時間變化的數據集合,用來支持管理人員的決策。
參考解析:集成
【解析】數據倉庫是為了構建新的分析處理環境而出現的一種數據存儲和組織技術,基本特征包括:數據是面向主題的、集成的、非易失的、隨時間不斷變化的數據集合,用來支持管理人員的決策。
44在數據倉庫設計和建設過程中,設計者需要調查用戶的決策或數據處理需求,并將功能相近且需要相關聯數據支持的需求進行歸類,得到不同的需求集合,并在企業數據模型中尋找能夠滿足各個需求集合的數據集合,然后針對各個數據集合開展數據倉庫數據模型的設計。這種設計方法稱為【15】的設計方法。
參考解析:面向主題
【解析】面向主題的數據組織方式,就是在較高層次上對分析對象數據的一個完整并且一致的描述,能刻畫各個分析對象所涉及的企業各項數據,以及數據之間的聯系。所謂較高層次是相對面向應用的數據組織方式而言的,即按照主題進行數據組織的方式具有更高的數據抽象級別。與傳統數據庫面向應用進行數據組織的特點相對應,數據倉庫中的數據面向主題進行組織。例如,一個生產企業的數據倉庫所組織的主題可能有產品訂貨分析和貨物發運分析等。
三、設計與應用題
45某書店采用了SQL Server 2008數據庫管理系統,該書店有一個需求,需要統計指定年份中每一本書的銷售總額,例如:查詢2012年所有書的銷售總額。
已知圖書結構如下:
圖書表(書號BOOK_ID,書名BOOK_NAME,單價BOOK_PRICE)
銷售表(書號BOOK_ID,銷售時間SALE_TIME,銷售數量SALE_NUM)。
假設單價和銷售數量均為int型,書號和書名均為varchar(50)類型,銷售時問為datetime型。請給出滿足如下要求的多語句表值函數,該函數統計指定年份中每本書的銷售總額。(10分)設函數名為:BOOK_PROFIT(@year int),函數的返回結果格式如下:
書號銷售總額
B001 60000
A004 50000
參考解析:
【解題思路】
采用JOIN聯合查詢,先用WHERE條件查出符合銷售時間=@year的記錄,再將找出的記錄和圖書表合并,并采用單價*銷售數量計算出聯合查詢的表數據,最后根據GROUP BY統計每種書的銷售價格總和。
【參考答案】
CREATE FUNCTION BOOK_PROFIT(@year int)
RETURNS@f_BOOK_PROFIT table(
書號varchar(50),
銷售總額int)
AS
BEGIN
INSERT INTO@f_BOOK_PROFIT
SELECT a書號,SUM(a單價*b銷售數量)
FROM圖書表a JOIN銷售表b ON a書號=b書號
WHERE year(b銷售時間)=@year
GROUP BY a.書號
RETURN
END
或者
CREATE FUNCTION BOOK_PROFIT(@year int)
RETURNS@f_BOOK_PROFlT table(
BOOK_ID varchar(50),
PROFIT int)
AS
BEGIN
INSERT INTO@f_BOOK_PROFIT
SELECT a.BOOK_ID,SUM(a.BOOK_PRICE*b,SALE_NUM)
FROM BOOK a JOIN SALE b ON a.BOOK ID=b.B00K ID
WHERE year(bSALE_TIME)=@year
GROUP BY a.BOOK_ID
RETURN
END
46某商場商品經營管理系統使用SQL Server 2008數據庫管理系統,此系統上線運行1年后,業務人員使用某統計功能(此功能每月使用一次)時發現速度很慢。該統計功能主要執行的SQL語句如下:
SELECT商品號,SUM(銷售數量*銷售價格)銷售額
FROM銷售明細
GROUP BY商品號;
該銷售明細表的建表語句如下:
CREATE TABLE銷售明細(
序列號intIDENTITY(1,1)NOT NULL,
商品號intNOT NULL,
銷售日期datetime NULL,
銷售數量intNOT NULL,
銷售價格intNOT NULL
);
并在銷售明細表上建有如下索引:
CREATE index ix_銷售明細_商品號on銷售明細(商品號);
某技術人員提出通過執行下述語句以提高此查詢的運行效率:
CREATE VIEW商品銷售額視圖
WITH SCHEMABINDING
AS
SELECT商品號,SUM(銷售數量*銷售價格)銷售額,
COUNT_BIG(*)cnt
FROM db0.銷售明細
GROUP BY商品號;
CREATE UNIQUE CLUSTERED INDEX ix_商品銷售額
ON商品銷售額視圖(商品號);
(1)請分析該技術人員給出的語句功能以及對原有查詢語句的性能影響,并給出原因。
(2)此商場的銷售量很大,每天有大量數據插入到銷售明細表中。請從數據庫整體性能角度分析,此技術人員提出的優化方法是否合適,并給出原因。
參考解析:
(1)【解題思路】
該技術人員使用了帶有索引的視圖,將所關心的數據(商品號,銷售額,該商品號在表中出現的次數)從銷售明細表中提取出來建立視圖,并對該視圖建立按商品號排序的聚簇索引,這樣大大減少了在搜索不同商品的銷售額時調用的數據表的規模,從而提高了查詢效率。由于表的數據規模很大,建立該視圖后,同一種商品不會多次出現在表中,而是通過一個計數變量cnt表示,即在檢索時大大減少了檢索規模。創建索引時,UNIQUE關鍵字表明此索引的每一個索引值只對應唯一的數據記錄。CLUSTER表示要建立的索引是聚簇索引(所謂聚簇索引是指索引項的順序與表中記錄的物理順序一致的索引組織)。
【參考答案】
語句功能:建立包含所關心數據(商品號,銷售額,該商品號在表中出現的次數)的帶索引的視圖,并建立按商品號對應銷售額UNIQUE聚簇排序的索引,從而大大縮小了查詢語句的查詢范圍,提高了查詢效率。
原因:視圖問接相關的屬性列(序列號,銷售日期,商品號,銷售數量,銷售價格)轉換成了目標屬性列,減少了搜索空問,同時建立UNIQUE CLUSTERED索引,使查詢商品號的數據記錄唯一,因此降低了搜索范圍,提高了搜索效率。
(2)【解題思路】
由于視圖是不實際存儲數據的虛表,因此對視圖的更新最終要轉換為對基本表的更新。而用戶通過視圖對數據進行增加、刪除、修改時,有意或無意地對不屬于視圖范圍內的基本表數據進行操作,會破壞數據的一致性。而且視圖中的數據本身就是冗余的,每次對表進行修改時,同時也要對相應的視圖進行修改,這大大增加了系統的負擔。
【參考答案】不合適,每天大量的插入操作使得在修改表的同時也要對視圖進行修改,增加了系統的負擔,然而該統計功能一個月才用一次,這樣導致系統的利用率也較為低下。
47設有圖書管理數據庫,包含三張表:
圖書明細表(圖書編號,圖書類別,圖書名稱,作者,出版社,出版日期,定價);
讀者表(借書證號,姓名,系別,辦證日期);
借出信息表(借出編號,借書證號,圖書編號,借書日期);
完成下列操作:
定義一個多語句表值函數,用于查詢學生借書情況,只需提供參數:借書證號,就可以通過調用函數返回此學生的借書情況,若有借書籍,則返回所借書籍的編號、書籍名稱、定價和借書日期;若沒有在借書籍,則返回記錄為空。設函數名為:f_BorrowBook(@jszh char(20))。
參考解析:
【解題思路】
SQL Server 2008多語句表值函數的格式為:
CREATE FUNCTION[schema_name.]function_name
([{@parameter_name[As][type_schema_name.]parameter data_type
[=default]}
[….n]
]
)
RETURNS@return_variable TABLE
[AS]
BEGIN
function_body
RETURN
END
[;]
::=
({I}
[table_constraint][,...n])
采用三表聯合查詢,通過傳入的借書證號查出借出信息表中的圖書編號,然后查出圖書明細表的信息。
【參考答案】
CREATE FUNCTION BorrowBook(@jszh char(20))
RETURNS@jsqkb TABLE(書籍編號char(20),書籍名稱char(50),定價float,借書日期datetime)
AS
BEGIN
INSERT@jsqkb
SELECT圖書明細表.圖書編號,圖書名稱,定價,借出信息表.借書日期FROM借出信息表,圖書明細表
WHERE借出信息表.圖書編號=圖書明細表.圖書編號AND借出信息表.借書證號=@jszh
RETURN
END