當前位置:首頁 » 操作系統 » 資料庫考題

資料庫考題

發布時間: 2023-09-15 20:00:41

A. 計算機二級MS OFFICE高級應用考試試題

計算機網路是這樣定義的:存在著一個能為用戶自動管理的網路操作系統。由它調用完成用戶所調用的資源,而整個網路像一個大的計算機系統一樣,對用戶是透明的。下面是關於計算機二級MS OFFICE高級應用考試試題,歡迎大家參考!

一、選擇題

1、下列數據結構中,屬於非線性結構的是().

A.循環隊列

B.帶鏈隊列

C.二叉樹

D.帶鏈棧

2、下列數據結構中,能夠按照“先進後出”原則存取數據的是().

A.循環隊列

B.棧

C.隊列

D.二叉樹

3、對於循環隊列,下列敘述中正確的是().

A.隊頭指針是固定不變的

B.隊頭指針一定大於隊尾指針

C.隊頭指針一定小於隊尾指針

D.隊頭指針可以大於隊尾指針,也可以小於隊尾指針

4、演算法的空間復雜度是指().

A.演算法在執行過程中所需要的計算機存儲空間

B.演算法所處理的數據量

C.演算法程序中的語句或指令條數

D.演算法在執行過程中所需要的臨時工作單元數

5、軟體設計中劃分模塊的一個准則是().

A.低內聚低耦合

B.高內聚低耦合

C.低內聚高耦合

D.高內聚高耦合

6、下列選項中不屬於結構化程序設計原則的是().

A.可封裝

B.自頂向下

C.模塊化

D.逐步求精

7、資料庫管理系統是().

A.操作系統的一部分

B.在操作系統支持下的系統軟體

C.一種編譯系統

D.一種操作系統

8、在E-R圖中,用來表示實體聯系的圖形是().

A.橢圓形

B.矩形

C.菱形

D.三角形

9、 20GB的硬碟表示容量約為().

A.20億個位元組

B.20億個二進制位

C.200億個位元組

D.200億個二進制位

10、 計算機安全是指計算機資產安全,即().

A.計算機信息系統資源不受自然有害因素的威脅和危害

B.信息資源不受自然和人為有害因素的威脅和危害

C.計算機硬體系統不受人為有害因素的威脅和危害

D.計算機信息系統資源和信息資源不受自然和人為有害因素的威脅和危害

二,操作題

1、請在【答題】菜單下選擇【進入考生文件夾】命令,並按照題目要求完成下面的操作.

注意:以下的文件必須都保存在考生文件夾下.

文檔“北京政府統計工作年報.docx”是一篇從互聯網上獲取的文字資料,請打開該文檔並按下列要求進行排版及保存操作:

(1)將文檔中的西文空格全部刪除.

(2)將紙張大小設為16開,上邊距設為3.2cm、下邊距設為3cm,左右頁邊距均設為2.5cm.

(3)利用素材前三行內容為文檔製作一個封面頁,令其獨佔一頁(參考樣例見文件“封面樣例.png”).

(4)將標題“(三)咨詢情況”下用藍色標出的段落部分轉換為表格,為表格套用一種表格樣式使其更加

美觀.基於該表格數據,在表格下方插入一個餅圖,用於反映各種咨詢形式所佔比例,要求在餅圖中僅顯示百分比.

(5)將文檔中以“一、”、“二、”……開頭的段落設為“標題l”樣式;以“(一)”、“(二)”……開頭的段落設為“標題2”樣式;以“l、”、“2、”……開頭的段落設為“標題3”樣式.

(6)為正文第2段中用紅色標出的文字“統計局隊政府網站”添加超鏈接,鏈接地址為“http://www.bjstats.gov.cn/”.同時在“統計局隊政府網站”後添加腳注,內容為“http://www.bjstats.gov.cn”.

(7)將除封面頁外的所有內容分為兩欄顯示,但是前述表格及相關圖表仍需跨欄居中顯示,無需分欄.

(8)在封面頁與正文之間插入目錄,目錄要求包含標題第1-3級及對應頁號.目錄單獨佔用一頁,且無須分欄.

(9)除封面頁和目錄頁外,在正文頁上添加頁眉,內容為文檔標題“北京市政府信息公開工作年度報告”和頁碼,要求正文頁碼從第l頁開始,其中奇數頁眉居右顯示,頁碼在標題右側,偶數頁眉居左顯示,頁碼在標題左側.

(10)將完成排版的分檔先以原word格式及文件名“北京政府統計工作年報.docx”進行保存,再另行生成一份同名的PDF文檔進行保存.

22、請在【答題】菜單下選擇【進入考生文件夾】命令,並按照題目要求完成下面的操作.

注意:以下的文件必須都保存在考生文件夾下.

中國的人口發展形勢非常嚴峻,為此國家統計局每l0年進行一次全國人口普查,以掌握全國人口的增長速度及規模.按照下列要求完成對第五次、第六次人口普查數據的統計分析:

(1)新建一個空白Excel文檔,將工作表sheet1更名為“第五次普查數據”,將sheet2更名為“第六次普查數據”,將該文檔以“全國人口普查數據分析.xlsx”為文件名進行保存.

(2)瀏覽網頁“第五次全國人口普查公報.htm”,將其中的“2000年第五次全國人口普查主要數據”表格導入到工作表“第五次普查數據”中;瀏覽網頁“第六次全國人口普查公報.htm”,將其中的“2010年第六次全國人口普查主要數據”表格導入到工作表“第六次普查數據”中(要求均從Al單元格開始導入,不得對兩個工作表中的數據進行排序).

(3)對兩個工作表中的數據區域套用合適的表格樣式,要求至少四周有邊框、且偶數行有底紋,並將所有人口數列的`數字格式設為帶千分位分隔符的整數.

(4)將兩個工作表內容合並,合並後的工作表放置在新工作表“比較數據”中(自A1單元格開始),且保持最左列仍為地區名稱、Al單元格中的列標題為“地區”,對合並後的工作表適當的調整行高列寬、字體字型大小、邊框底紋等,使其便於閱讀.以“地區”為關鍵字對工作表“比較數據”進行升序排列.

(5)在合並後的工作表“比較數據”中的數據區域最右邊依次增加“人口增長數”和“比重變化”兩列,計算這兩列的值,並設置合適的格式.其中:人口增長數=2010年人口數-2000年人口數;比重變化=2010年比重-2000年比重.

(6)打開工作簿“統計指標.xlsx”,將工作表“統計數據”插入到正在編輯的文檔“全國人口普查數據分析.xlsx”中工作表“比較數據”的右側.

(7)在工作簿“全國人口普查數據分析.xlsx”的工作表“比較數據”中的相應單元格內填人統計結果.

(8)基於工作表“比較數據”創建一個數據透視表,將其單獨存放在一個名為“透視分析”的工作表中.透視表中要求篩選出2010年人口數超過5000萬的地區及其人口數、2010年所佔比重、人口增長數,並按人口數從多到少排序.最後適當調整透視表中的數字格式.(提示:行標簽為“地區”,數值項依次為2010年人口數、2010年比重、人口增長數).

B. sql Server期末考試試題

3、查詢出課程號為『002』,分數最高的學生學號

三、查詢設計

1、SELECT學號,姓名FROM學生
WHERE班級='軟體041'
2、SELECT*FROM課程
WHERE課程名稱LIKE'%語言%'
3、SELECTD.學號,D.姓名,D.班級
FROM(
SELECTTOP5學號
FROM選課A
LEFTJOIN課程B
ONA.課程號=B.課程號
WHEREB.課程名稱='C語言'
ORDERBYA.成績DESC
)C
LEFTJOIN學生D
ONC.學號=D.學號
4、SELECT班級,COUNT(班級)
FROM學生
GROUPBY班級
5、DECLARE@zhangsanchengjiFLOAT
SELECT@zhangsanchengji=A.成績
FROM選課A
LEFTJOIN課程B
ONA.課程號=B.課程號
LEFTJOIN學生C
ONA.學號=C.學號
WHEREB.課程名稱='計算機應用基礎'
ANDA.姓名='張三'

SELECTD.學號,D.姓名
FROM(
SELECTA.學號,A.成績
FROM選課A
LEFTJOIN課程B
ONA.課程號=B.課程號
WHEREB.課程名稱='計算機應用基礎'
)C
LEFTJOIN學生D
ONC.學號=D.學號
WHERE成績>@zhangsanchengji

五、操作題,這里自己查相關的操作吧,不好描述,sqlserver軟體操作起來還是挺方便的。

3、A

break:是跳出本次循環,也就是當@n = 1,循環終止並跳出begin-end執行外部的代碼,此時@n = 1。

continue:重新開始循環,但是continue後的代碼不執行的,這里直到@n = 0時。

return:過程中無條件退出,後續的所有代碼都不執行,所以不會有輸出。

C. IBM認證資料庫考試試題

(1)已知表T1中有2行數據,T2中有3行數據,執行SQL語句

“select a.* from T1 a,T2 b”後,返回的行數為______

A、2行

B、3行

C、5行

D、6行

多表查詢沒有指定連接條件,會導致笛卡爾積的出現,返回行數等於2張表的行數乘積,返回6行記錄

考察:對多表連接、笛卡爾積的理解

答案:A

(2)、已知表T1和T2的欄位定義完全相同,T1,T2中各有5條不同的數據,其中T1有2條數據存在於表T2中,語句“select * from T1 union select * from T2”

返回的行數為_______

A、8行

B、10行

C、3行

D、12行

第二題? UNION在進行表鏈接後會篩選掉重復的記錄,所以在表鏈接後會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。

考察:UNION 的理解

答案: A

(3)、 已知表T1含有欄位ID、CourseID和Score,且數據為

ID CourseID Score

3 1 90

2 1 85

2 2 90

3 2 80

則語句“select id,sum(ScorE) from T1 group by ID”的執行結果為_________

A、 ID sum(ScorE)

—– ? ———-

3 ? 170

2 ? 175

B、 ID sum(ScorE)

—– ? ———-

2 ? 175

3 ? 170

C、 ID sum(ScorE)

—– ? ———-

2 ? 170

3 ? 175

D、 ID sum(ScorE)

—– ? ———-

3 ? 175

2 170

第三題 GROUP BY 對按照ID欄位進行分組,同時對ID相同欄位的ScorE進行求和,GROUP by 會自動對結果集進行排序所以答案選B

考察:group by 的理解

答案: B

(4)、電話號碼表t_phonebook中含有100萬條數據,其中號碼欄位PhoneNo上創建了唯一索引,且電話號碼全部由數字組成,要統計號碼頭為321的.電話號碼的數量,下面寫法執行速度最慢的是_________

A、 select count(*) from t_phonebook where phoneno >= ‘321’ and phoneno < ‘321A’

B、 select count(*) from t_phonebook where phoneno like ‘321%’

C、 select count(*) from t_phonebook where substring(phoneno,1,3) = ‘321’

A>或者<操作符會採用索引查找

B:LIKE通配符在XXX%情況下會應用索引,如果在%xxx%等情況下不會應用索引

答案: C:採用函數處理的欄位不能利用索引,例如substr()? 這個題好像寫成java的函數了

答案: C

(5)、已知表tbl中欄位land_ID建有索引,欄位cust_id建有唯一索引,下列語句查詢邏輯相同,其中執行效率最優的是

A、 SELECT * FROM tbl

WHERE land_id > 750

or (cust_id=180 or cust_id=560)

B、 SELECT * FROM tbl

WHERE (cust_id=180 or cust_id=560)

or land_id > 750

C、 SELECT * FROM tbl WHERE land_id > 750

UNION

SELECT * FROM tbl WHERE cust_id = 180

UNION

SELECT * FROM tbl WHERE cust_id = 560

D、 SELECT * FROM tbl WHERE land_id > 750

UNION

( SELECT * FROM tbl WHERE cust_id = 180

UNION ALL

SELECT * FROM tbl WHERE cust_id = 560

)

C/D相比較而言,D的執行效率更高一些

UNION在進行表鏈接後會篩選掉重復的記錄,所以在表鏈接後會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。實際大部分應用中是不會產生重復的記錄

採用UNION ALL操作符替代UNION,因為UNION ALL操作只是簡單的將兩個結果合並後就返回。

(6)、員工技能表Staffskill結構如下,Staff和Skill欄位建有唯一約束

staff VARCHAR2(10),

skill VARCHAR2(10)

哪條語句可以查詢同時擁有技能A和技能B的員工

A、 select staff from Staffskill where skill=’A’ OR skill=’B’

B、 select staff from Staffskill where skill=’A’ AND skill=’B’

C、 select staff from Staffskill where skill=’A’ OR skill=’B’ group by staff

D、 select staff from Staffskill where skill=’A’ OR skill=’B’ group by staff having count(*)>1

答案:D

(7)員工表staff表結構如下

staffNo varchar2(10),

Email varchar2(50)

哪一個SQL語句查詢出沒有E_mail地址的員工號

A、select staffno from Staff where Email = NULL

B、select staffno from Staff where Email <> NULL

C、select staffno from Staff where Email is null

D、select staffno from Staff where Email is not null

答案: C

(8)Oracle資料庫啟動步驟的順序為

1.Mount? 2.Open? 3.Nomount

A、3-1-2

B、2-3-1

C、2-1-3

D、3-2-1

答案:A

(9)存在兩個結構相同的資料庫表T1(col1,col2,col3)、T2(col1,col2,col3),寫出一SQL語句將所有T1數據導入到T2表

A、select col1,col2,col3 from T1 INTO T2 (col1,col2,col3)

B、INSERT T1 (col1,col2,col3) INTO T2(col1,col2,col3)

C、insert into T2 (col1,col2,col3) AS select col1,col2,col3 from T1;

D、insert into T2 (col1,col2,col3) select col1,col2,col3 from T1;

答案: D

10)一個表的欄位為varchar2,如果建表時沒有指定長度,則默認長度為:

A、1

B、25

C、38

D、255

E、4000

F、建表時varchar2類型欄位必須指定長度

答案:F

(11)用TRUNCATE和DELETE語句刪除表中數據的區別?

A、TRUNCATE命令不記錄日誌

B、TRUNCATE命令記錄日誌

C、DELETE命令不記錄日誌

答案:A

(12)如下查詢語句SELECT id_number,100/quantity from inventory如果quantity為空,則查詢語句的第二個欄位將返回

A、 a space

B、 a null value

C、 a value of 0

D、 a value of 100

E、 the keywork null

答案:B

(13)如下語句:SELECT i.id_number,m.id_number FROM inventory i,manufacturer m

WHERE i.manufacturer_id = m.id_number

Order by inventory.description

執行時是錯誤的,請問以下措施哪個能夠改正這個錯誤?

A 在order by的子句中使用表的別名

B 在where子句中去掉表的別名

C 在where子句中用表名代替表的別名

D 在order by子句中去掉表名,只要欄位名稱即可

(如果2張表中,不同時存在欄位名為description的話,D答案也是正確的)

答案:A

14)A表欄位a 類型int中有100條記錄,值分別為1至100。如下語句

SELECT a FROM A

WHERE A BETWEEN 1 AND 50

OR (A IN (25,70,95)

AND A BETWEEN 25 AND 75)

則如下哪個值在這個sql語句返回的結果集中

A、30? B、51? C、75? D、95

答案:A

15) 變數v_time = ‘23-MAY-00’,如下那條語句返回值為‘01-JAN-00’?

A SELECT ROUND(V_TIME,’DAY’) FROM DUAL;

B SELECT ROUND(V_TIME,’YEAR’) FROM DUAL;

C SELECT ROUND(V_TIME,’MONTH’) FROM DUAL;

D SELECT ROUND(TO_CHAR(V_TIME,’YYYY’)) FROM DUAL;

答案:B

16)關於索引(index)的說法哪些是錯誤?

A、創建索引能提高數據插入的性能

B、索引應該根據具體的檢索需求來創建,在選擇性好的列上創建索引

C、索引並非越多越好

D、建立索引可使檢索操作更迅速

答案: A

(17)指出下面sql語句的錯誤之處:

select id_number “Part Number”,sum(price) “price” from inventory

where price > 50

group by “Part Number”

order by 2;

A、order by 2

B、from inventory

C、 where price > 50

D、group by “Part Number”

答案:D

(18)如下語句

if v_num > 5 then

v_example := 1;

elsif v_num > 10 then

v_example := 2;

elsif v_num < 20 then

v_example := 3;

elsif v_num < 39 then

v_example := 4;

else? v_example := 5;

如果v_num = 37,則v_example的值是多少?

A、1 ? B、2 C、3 D、4 E、5

答案:A

D. 求資料庫應用題

資料庫語言的目標

要說清這個目標,先要理解資料庫是做什麼的。

資料庫這個軟體,名字中有個「庫」字,會讓人覺得它主要是為了存儲的。其實不然,資料庫實現的重要功能有兩條:計算、事務!也就是我們常說的 OLAP 和 OLTP,資料庫的存儲都是為這兩件事服務的,單純的存儲並不是資料庫的目標。

我們知道,SQL 是目前資料庫的主流語言。那麼,用 SQL 做這兩件事是不是很方便呢?

事務類功能主要解決數據在寫入和讀出時要保持的一致性,實現這件事的難度並不小,但對於應用程序的介面卻非常簡單,用於操縱資料庫讀寫的代碼也很簡單。如果假定目前關系資料庫的邏輯存儲模式是合理的(也就是用數據表和記錄來存儲數據,其合理性與否是另一個復雜問題,不在這里展開了),那麼 SQL 在描述事務類功能時沒什麼大問題,因為並不需要描述多復雜的動作,復雜性都在資料庫內部解決了。

但計算類功能卻不一樣了。

這里說的計算是個更廣泛的概念,並不只是簡單的加加減減,查找、關聯都可以看成是某種計算。

什麼樣的計算體系才算好呢?

還是兩條:寫著簡單、跑得快。

寫著簡單,很好理解,就是讓程序員很快能寫出來代碼來,這樣單位時間內可以完成更多的工作;跑得快就更容易理解,我們當然希望更短時間內獲得計算結果。

其實 SQL 中的 Q 就是查詢的意思,發明它的初衷主要是為了做查詢(也就是計算),這才是 SQL 的主要目標。然而,SQL 在描述計算任務時,卻很難說是很勝任的。

SQL為什麼不行

先看寫著簡單的問題。

SQL 寫出來很象英語,有些查詢可以當英語來讀和寫(網上多得很,就不舉例了),這應當算是滿足寫著簡單這一條了吧。

且慢!我們在教科書上看到的 SQL 經常只有兩三行,這些 SQL 確實算是寫著簡單的,但如果我們嘗試一些稍復雜化的問題呢?

這是一個其實還不算很復雜的例子:計算一支股票最長連續上漲了多少天?用 SQL 寫出來是這樣的:


  • selectmax(consecutive_day)from(selectcount(*) (consecutive_dayfrom(selectsum(rise_mark) over(orderbytrade_date) days_no_gainfrom(selecttrade_date,case when closing_price>lag(closing_price) over(order by trade_date)then 0 else 1 END rise_markfrom stock_price ) )group by days\_no\_gain)

  • 這個語句的工作原理就不解釋了,反正有點繞,同學們可以自己嘗試一下。

    這是潤乾公司的招聘考題,通過率不足 20%;因為太難,後來被改成另一種方式:把 SQL 語句寫出來讓應聘者解釋它在算什麼,通過率依然不高。

    這說明什麼?說明情況稍有復雜,SQL 就變得即難懂又難寫!

    再看跑得快的問題,還是一個經常拿出來的簡單例子:1 億條數據中取前 10 名。這個任務用 SQL 寫出來並不復雜:

  • SELECTTOP 10x FROMT ORDERBYx DESC

  • 但是,這個語句對應的執行邏輯是先對所有數據進行大排序,然後再取出前 10 個,後面的不要了。大家知道,排序是一個很慢的動作,會多次遍歷數據,如果數據量大到內存裝不下,那還需要外存做緩存,性能還會進一步急劇下降。如果嚴格按這句 SQL 體現的邏輯去執行,這個運算無論如何是跑不快的。然而,很多程序員都知道這個運算並不需要大排序,也用不著外存緩存,一次遍歷用一點點內存就可以完成,也就是存在更高性能的演算法。可惜的是,用 SQL 卻寫不出這樣的演算法,只能寄希望於資料庫的優化器足夠聰明,能把這句 SQL 轉換成高性能演算法執行,但情況復雜時資料庫的優化器也未必靠譜。

    看樣子,SQL 在這兩方面做得都不夠好。這兩個並不復雜的問題都是這樣,現實中數千行的 SQL 代碼中,這種難寫且跑不快的情況比比皆是。

    為什麼 SQL 不行呢?

    要回答這個問題,我們要分析一下用程序代碼實現計算到底是在干什麼。

    本質上講,編寫程序的過程,就是把解決問題的思路翻譯成計算機可執行的精確化形式語言的過程。舉例來說,就象小學生解應用題,分析問題想出解法之後,還要列出四則運算表達式。用程序計算也是一樣,不僅要想出解決問題的方法,還要把解法翻譯成計算機能理解執行的動作才算完成。

    用於描述計算方法的形式語言,其核心在於所採用的代數體系。所謂代數體系,簡單說就是一些數據類型和其上的運算規則,比如小學學到的算術,就是整數和加減乘除運算。有了這套東西,我們就能把想做的運算用這個代數體系約定的符號寫出來,也就是代碼,然後計算機就可以執行了。

    如果這個代數體系設計時考慮不周到,提供的數據類型和運算不方便,那就會導致描述演算法非常困難。這時候會發生一個怪現象:翻譯解法到代碼的難度遠遠超過解決問題本身。

    舉個例子,我們從小學慣用阿拉伯數字做日常計算,做加減乘除都很方便,所有人都天經地義認為數值運算就該是這樣的。其實未必!估計很多人都知道還有一種叫做羅馬數字的東西,你知道用羅馬數字該怎麼做加減乘除嗎?古羅馬人又是如何上街買菜的?

    代碼難寫很大程度是代數的問題。

    再看跑不快的原因。

    軟體沒辦法改變硬體的性能,CPU 和硬碟該多快就是多快。不過,我們可以設計出低復雜度的演算法,也就是計算量更小的演算法,這樣計算機執行的動作變少,自然也就會快了。但是,光想出演算法還不夠,還要把這個演算法用某種形式語言寫得出來才行,否則計算機不會執行。而且,寫起來還要比較簡單,都要寫很長很麻煩,也沒有人會去用。所以呢,對於程序來講,跑得快和寫著簡單其實是同一個問題,背後還是這個形式語言採用的代數的問題。如果這個代數不好,就會導致高性能演算法很難實現甚至實現不了,也就沒辦法跑得快了。就象上面說的,用 SQL 寫不出我們期望的小內存單次遍歷演算法,能不能跑得快就只能寄希望於優化器。

    我們再做個類比:

    上過小學的同學大概都知道高斯計算 1+2+3+…+100 的小故事。普通人就是一步步地硬加 100 次,高斯小朋友很聰明,發現 1+100=101、2+99=101、…、50+51=101,結果是 50 乘 101,很快算完回家午飯了。

    聽過這個故事,我們都會感慨高斯很聰明,能想到這么巧妙的辦法,即簡單又迅速。這沒有錯,但是,大家容易忽略一點:在高斯的時代,人類的算術體系(也是一個代數)中已經有了乘法!象前面所說,我們從小學習四則運算,會覺得乘法是理所當然的,然而並不是!乘法是後於加法被發明出來的。如果高斯的年代還沒有乘法,即使有聰明的高斯,也沒辦法快速解決這個問題。

    目前主流資料庫是關系資料庫,之所以這么叫,是因為它的數學基礎被稱為關系代數,SQL 也就是關系代數理論上發展出來的形式語言。

    現在我們能回答,為什麼 SQL 在期望的兩個方面做得不夠好?問題出在關系代數上,關系代數就像一個只有加法還沒發明乘法的算術體系,很多事做不好是必然的。

    關系代數已經發明五十年了,五十年前的應用需求以及硬體環境,和今天比的差異是很巨大了,繼續延用五十年前的理論來解決今天的問題,聽著就感覺太陳舊了?然而現實就是這樣,由於存量用戶太多,而且也還沒有成熟的新技術出現,基於關系代數的 SQL,今天仍然是最重要的資料庫語言。雖然這幾十年來也有一些改進完善,但根子並沒有變,面對當代的復雜需求和硬體環境,SQL 不勝任也是情理之中的事。

    而且,不幸的是,這個問題是理論上的,在工程上無論如何優化也無濟於事,只能有限改善,不能根除。不過,絕大部分的資料庫開發者並不會想到這一層,或者說為了照顧存量用戶的兼容性,也沒打算想到這一層。於是,主流資料庫界一直在這個圈圈裡打轉轉。

    SPL為什麼能行

    那麼該怎樣讓計算寫著更簡單、跑得更快呢?

    發明新的代數!有「乘法」的代數。在其基礎上再設計新的語言。

    這就是 SPL 的由來。它的理論基礎不再是關系代數,稱為離散數據集。基於這個新代數設計的形式語言,起名為SPL(Structured Process Language)。

    SPL 針對 SQL 的不足(更確切地說法是,離散數據集針對關系代數的各種缺陷)進行了革新。SPL 重新定義了並擴展許多結構化數據中的運算,增加了離散性、強化了有序計算、實現了徹底的集合化、支持對象引用、提倡分步運算。

    限於篇幅,這里不能介紹 SPL(離散數據集)的全貌。我們在這里列舉 SPL(離散數據集)針對 SQL(關系代數)的部分差異化改進:

    游離記錄

    離散數據集中的記錄是一種基本數據類型,它可以不依賴於數據表而獨立存在。數據表是記錄構成的集合,而構成某個數據表的記錄還可以用於構成其它數據表。比如過濾運算就是用原數據表中滿足條件的記錄構成新數據表,這樣,無論空間佔用還是運算性能都更有優勢。

    關系代數沒有可運算的數據類型來表示記錄,單記錄實際上是只有一行的數據表,不同數據表中的記錄也不能共享。比如,過濾運算時會復制出新記錄來構成新數據表,空間和時間成本都變大。

    特別地,因為有游離記錄,離散數據集允許記錄的欄位取值是某個記錄,這樣可以更方便地實現外鍵連接。

    有序性

    關系代數是基於無序集合設計的,集合成員沒有序號的概念,也沒有提供定位計算以及相鄰引用的機制。SQL 實踐時在工程上做了一些局部完善,使得現代 SQL 能方便地進行一部分有序運算。

    離散數據集中的集合是有序的,集合成員都有序號的概念,可以用序號訪問成員,並定義了定位運算以返回成員在集合中的序號。離散數據集提供了符號以在集合運算中實現相鄰引用,並支持針對集合中某個序號位置進行計算。

    有序運算很常見,卻一直是 SQL 的困難問題,即使在有了窗口函數後仍然很繁瑣。SPL 則大大改善了這個局面,前面那個股票上漲的例子就能說明問題。

    離散性與集合化

    關系代數中定義了豐富的集合運算,即能將集合作為整體參加運算,比如聚合、分組等。這是 SQL 比 Java 等高級語言更為方便的地方。

    但關系代數的離散性非常差,沒有游離記錄。而 Java 等高級語言在這方面則沒有問題。

    離散數據集則相當於將離散性和集合化結合起來了,既有集合數據類型及相關的運算,也有集合成員游離在集合之外單獨運算或再組成其它集合。可以說 SPL 集中了 SQL 和 Java 兩者的優勢。

    有序運算是典型的離散性與集合化的結合場景。次序的概念只有在集合中才有意義,單個成員無所謂次序,這里體現了集合化;而有序計算又需要針對某個成員及其相鄰成員進行計算,需要離散性。

    在離散性的支持下才能獲得更徹底的集合化,才能解決諸如有序計算類型的問題。

    離散數據集是即有離散性又有集合化的代數體系,關系代數只有集合化。

    分組理解

    分組運算的本意是將一個大集合按某種規則拆成若干個子集合,關系代數中沒有數據類型能夠表示集合的集合,於是強迫在分組後做聚合運算。

    離散數據集中允許集合的集合,可以表示合理的分組運算結果,分組和分組後的聚合被拆分成相互獨立的兩步運算,這樣可以針對分組子集再進行更復雜的運算。

    關系代數中只有一種等值分組,即按分組鍵值劃分集合,等值分組是個完全劃分。

    離散數據集認為任何拆分大集合的方法都是分組運算,除了常規的等值分組外,還提供了與有序性結合的有序分組,以及可能得到不完全劃分結果的對位分組。

    聚合理解

    關系代數中沒有顯式的集合數據類型,聚合計算的結果都是單值,分組後的聚合運算也是這樣,只有 SUM、COUNT、MAX、MIN 等幾種。特別地,關系代數無法把 TOPN 運算看成是聚合,針對全集的 TOPN 只能在輸出結果集時排序後取前 N 條,而針對分組子集則很難做到 TOPN,需要轉變思路拼出序號才能完成。

    離散數據集提倡普遍集合,聚合運算的結果不一定是單值,仍然可能是個集合。在離散數據集中,TOPN 運算和 SUM、COUNT 這些是地位等同的,即可以針對全集也可以針對分組子集。

    SPL 把 TOPN 理解成聚合運算後,在工程實現時還可以避免全量數據的排序,從而獲得高性能。而 SQL 的 TOPN 總是伴隨 ORDER BY 動作,理論上需要大排序才能實現,需要寄希望於資料庫在工程實現時做優化。

    有序支持的高性能

    離散數據集特別強調有序集合,利用有序的特徵可以實施很多高性能演算法。這是基於無序集合的關系代數無能為力的,只能寄希望於工程上的優化。

    下面是部分利用有序特徵後可以實施的低復雜度運算:

    1) 數據表對主鍵有序,相當於天然有一個索引。對鍵欄位的過濾經常可以快速定位,以減少外存遍歷量。隨機按鍵值取數時也可以用二分法定位,在同時針對多個鍵值取數時還能重復利用索引信息。

    2) 通常的分組運算是用 HASH 演算法實現的,如果我們確定地知道數據對分組鍵值有序,則可以只做相鄰對比,避免計算 HASH 值,也不會有 HASH 沖突的問題,而且非常容易並行。

    3) 數據表對鍵有序,兩個大表之間對位連接可以執行更高性能的歸並演算法,只要對數據遍歷一次,不必緩存,對內存佔用很小;而傳統的 HASH 值分堆方法不僅比較復雜度高,需要較大內存並做外部緩存,還可能因 HASH 函數不當而造成二次 HASH 再緩存。

    4) 大表作為外鍵表的連接。事實表小時,可以利用外鍵表有序,快速從中取出關聯鍵值對應的數據實現連接,不需要做 HASH 分堆動作。事實表也很大時,可以將外鍵表用分位點分成多個邏輯段,再將事實表按邏輯段進行分堆,這樣只需要對一個表做分堆,而且分堆過程中不會出現 HASH 分堆時的可能出現的二次分堆,計算復雜度能大幅下降。

    其中 3 和 4 利用了離散數據集對連接運算的改造,如果仍然延用關系代數的定義(可能產生多對多),則很難實現這種低復雜的演算法。

    除了理論上的差異, SPL 還有許多工程層面的優勢,比如更易於編寫並行代碼、大內存預關聯提高外鍵連接性能等、特有的列存機制以支持隨意分段並行等。

    再把前面的問題用 SPL 重寫一遍有個直接感受。

    一支股票最長連續上漲多少天:

  • stock_price.sort(trade_date).group@o(closing_price

  • 計算思路和前面的 SQL 相同,但因為引入了有序性後,表達起來容易多了,不再繞了。

    1 億條數據中取前 10 名:

  • T.groups(;top(-10,x))

  • SPL 有更豐富的集合數據類型,容易描述單次遍歷上實施簡單聚合的高效演算法,不涉及大排序動作。

    這里還有更多 SPL 代碼以體現其思路及大數據演算法:

    重磅!開源SPL交流群成立了

    簡單好用的SPL開源啦!

    為了給感興趣的小夥伴們提供一個相互交流的平台,

    特地開通了交流群(群完全免費,不廣告不賣課)

    需要進群的朋友,可長按掃描下方二維碼

E. 資料庫系統工程師考試的考試試題

●假設某硬碟由5個碟片構成(共有8個記錄面),盤面有效記錄區域的外直徑為30cm,內直徑為10cm,記錄位密度為250位/mm,磁軌密度為16道/mm,每磁軌分16個扇區,每扇區512位元組,則該硬碟的格式化容量約為(2)MB。
● (3)是指按內容訪問的存儲器。
(3)A.虛擬存儲器B.相聯存儲器
C. 高速緩存(Cache) D. 隨機訪問存儲器 閱讀下列說明,回答問題1和問題2,將解答填入答題紙的對應欄內。
【說明】
假設某大型商業企業由商品配送中心和連鎖超市組成,其中商品配送中心包括采購、財務、配送等部門。為實現高效管理,設計了商品配送中心信息管理系統,其主要功能描述如下:
1. 系統接收由連鎖超市提出的供貨請求,並將其記錄到供貨請求記錄文件。
2. 在接到供貨請求後,從商品庫存記錄文件中進行商品庫存信息查詢。如果庫存滿足供貨請求,則給配送處理發送配送通知;否則,向采購部門發出缺貨通知。
3. 配送處理接到配送通知後,查詢供貨請求記錄文件,更新商品庫存記錄文件,並向配送部門發送配送單,在配送貨品的同時記錄配送信息至商品配送記錄文件。
4. 采購部門接到缺貨通知後,與供貨商洽談,進行商品采購處理,合格商品入庫,並記錄采購清單至采購清單記錄文件、向配送處理發出配送通知,同時通知財務部門給供貨商支付貨款。該系統採用結構化方法進行開發,得到待修改的數據流圖(如圖1-1所示)。
【問題1】(8分)
使用【說明】中的詞語,給出圖 1-1 中外部實體 E1 至 E4 的名稱和數據存儲 D1 至D4的名稱。
【問題2】(7分)
圖 1-1 中存在四處錯誤數據流,請指出各自的起點和終點;若將上述四條錯誤數據流刪除,為保證數據流圖的正確性,應補充三條數據流,請給出所補充數據流的起點和終點。(起點和終點請採用數據流圖1-1中的符號或名稱) 資料庫系統工程師2009年上半年軟考真題,詳情請參見參考資料 。

熱點內容
cvr網路存儲 發布:2025-01-24 17:24:52 瀏覽:415
腿套壓縮襪 發布:2025-01-24 17:05:16 瀏覽:458
電腦如何將安卓軟體卸載干凈 發布:2025-01-24 17:03:06 瀏覽:489
hello密碼怎麼破解 發布:2025-01-24 17:03:06 瀏覽:73
pspfifa無緩存 發布:2025-01-24 16:45:13 瀏覽:165
androidhandler機制 發布:2025-01-24 16:41:10 瀏覽:936
安卓系統如何下載aov 發布:2025-01-24 16:29:53 瀏覽:573
iptables允許ip訪問 發布:2025-01-24 16:19:58 瀏覽:932
安卓80如何識別存儲卡許可權 發布:2025-01-24 16:19:54 瀏覽:232
存儲介質價格 發布:2025-01-24 16:19:18 瀏覽:151