姚曦
(福建衛(wèi)生職業(yè)技術(shù)學(xué)院公共基礎(chǔ)部,福建 福州 350101)
SQL數(shù)據(jù)庫(kù)查詢效率的研究
姚曦
(福建衛(wèi)生職業(yè)技術(shù)學(xué)院公共基礎(chǔ)部,福建 福州 350101)
本文介紹了SQL中連接的種類,連接的操作步驟,連接的語(yǔ)法。重點(diǎn)解析了在基于多表連接的查詢中如何提高效率,并通過(guò)學(xué)生數(shù)據(jù)庫(kù)的實(shí)例進(jìn)一步說(shuō)明。
連接;多表;優(yōu)化查詢
數(shù)據(jù)庫(kù)性能問(wèn)題一直是決策者及技術(shù)人員共同關(guān)注的焦點(diǎn),影響數(shù)據(jù)庫(kù)性能的一個(gè)重要因素就是SQL查詢語(yǔ)句的效率。SQL是結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)的縮寫,SQL語(yǔ)言的功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制等部分,主要應(yīng)用于關(guān)系數(shù)據(jù)庫(kù),實(shí)現(xiàn)了關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)檢索。數(shù)據(jù)庫(kù)一般是由多張表來(lái)實(shí)現(xiàn)存儲(chǔ),并通過(guò)多張表之間的連接關(guān)系建立完整有效的數(shù)據(jù)查詢。作為數(shù)據(jù)查詢語(yǔ)言SQL,提供了功能強(qiáng)大的數(shù)據(jù)表連接查詢功能。那么如何將這些表高效地有機(jī)地聯(lián)系起來(lái),就成為設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù)的一個(gè)重要指標(biāo)。
在關(guān)系數(shù)據(jù)庫(kù)應(yīng)用中,由于需要經(jīng)常對(duì)多個(gè)關(guān)聯(lián)表進(jìn)行操作,可以通過(guò)同時(shí)檢索多個(gè)表來(lái)獲取所需的數(shù)據(jù)。一般分為三種連接的模式:內(nèi)連接(INNER JOIN),外連接(OUTER JOIN),交叉連接(CROSS JOIN)。語(yǔ)法的連接格式如下:
<連接>::=
{
<表名>[{INNER
|{{LEFT|RIGHT|FULL}[OUTER]}
|CROSS
}]
JOIN<表名>
ON<連接條件>
}
2.1 內(nèi)連接(INNER JOIN)
內(nèi)連接使用比較運(yùn)算符進(jìn)行表間某(些)列數(shù)據(jù)的比較操作,并列出與連接條件相匹配的數(shù)據(jù)行。根據(jù)所使用的比較方式的不同,內(nèi)連接又分為等值連接、不等連接和自然連接三種。
等值連接:在連接條件中使用等于號(hào)(=)運(yùn)算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,也包括重復(fù)列。
不等連接:在連接條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接列的列值。這些運(yùn)算符包括>、>=、< =、<、!>、!<和<>。
自然連接:在連接條件中使用等于(=)運(yùn)算符比較被連接列的列值,但它使用選擇列表指出查詢結(jié)果集合中所包括的列,查詢結(jié)果不包括重復(fù)列。
2.2 外連接(OUTER JOIN)
內(nèi)連接返回滿足查詢條件的數(shù)據(jù),不滿足的數(shù)據(jù)不會(huì)保留。而外連接則返回查詢條件中一個(gè)表或視圖的所有數(shù)據(jù)行。
外連接包括三種模式:左外連接(LEFT OUTER JOIN)、右外連接(RIGHT OUTER JOIN)和全連接(FULL OUTER JOIN)。
左外連接:保留左表中的所有數(shù)據(jù),如果左表與右表的某些數(shù)據(jù)不匹配,則在結(jié)果集中右表不匹配的數(shù)據(jù)列均為空值。
右外連接:同左外連接相反,右外連接保留右表中的所有數(shù)據(jù),如果左表與右表的某些數(shù)據(jù)不匹配,則在結(jié)果集中左表不匹配的數(shù)據(jù)列為空值。
全連接:也稱完整外連接,返回左表與右表中的所有數(shù)
據(jù)行,如果左表與右表達(dá)某些數(shù)據(jù)不匹配,則在結(jié)果集中的對(duì)應(yīng)列均為空值。
2.3 交叉連接(CROSS JOIN)
交叉連接不使用WHERE子句,返回涉及表的笛卡兒積。如查詢表1及表2,表1有m行,表2有n行,查詢結(jié)果集有m×n行。
聯(lián)接查詢操作的前提是笛卡兒積,從中找出符合條件的記錄,所以我們?cè)谧鰞?yōu)化時(shí)盡量避免聯(lián)接查詢。如果避免不了的聯(lián)接操作要遵循以下2個(gè)原則從而達(dá)到優(yōu)化時(shí)間和空間的目的。
給定三個(gè)關(guān)系模式:(以下實(shí)例均以此為例)
s(sno,sname,sex,birthday,email)
c(cno,cname,creadit)
sc(sno,cno,score)
3.1 選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效)
在進(jìn)行多表連接查詢時(shí),解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表將被優(yōu)先處理。因此在FROM子句中含多個(gè)表的情況下,須選擇元組數(shù)最少的表作為基礎(chǔ)表。例如s表有1000條數(shù)據(jù),c表有10條數(shù)據(jù)。語(yǔ)句select*from s,c(選擇c為基礎(chǔ)表)比語(yǔ)句select*from c,s(選擇s為基礎(chǔ)表)更高效。
如果有3個(gè)以上的表連接查詢,那就需要選擇交叉表作為基礎(chǔ)表,交叉表是指那個(gè)被其他表所引用的表。例如sc表的sno和cno列分別在s表和c表中出現(xiàn),sc表是s表和c表的交叉表。因此SQL語(yǔ)句
SELECT*FROM S,C,SNO
WHERE SC.CNO=C.CNOAND SC.SNO=S.SNO
將比下列語(yǔ)句更高效
SELECT*FROM SNO,S,C
WHERE SC.CNO=C.CNOAND SC.SNO=S.SNO
3.2 注意WHERE子句中的連接順序
SQL采用自下而上的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾。如果需要查詢成績(jī)?yōu)?0分以上的學(xué)生信息。
SQL語(yǔ)句1:SELECT*FROM S,SC WHERE SCORE> 90 AND S.SNO=SC.SNO因?yàn)镾QL自右向左進(jìn)行執(zhí)行,因此查詢語(yǔ)句先將兩張表按照學(xué)號(hào)進(jìn)行連接,然后篩選出符合條件的記錄,表的連接是基于表的笛卡爾運(yùn)算,消耗的時(shí)間會(huì)隨著記錄個(gè)數(shù)的增加很快地增長(zhǎng),因此SQL語(yǔ)句1是低效語(yǔ)句。
SQL語(yǔ)句2:SELECT*FROM S,SC WHERE S.SNO= SC.SNOAND SCORE>90此連接查詢語(yǔ)句克服了SQL語(yǔ)句1的缺點(diǎn),首先篩選出符合條件的記錄,減少了進(jìn)行聯(lián)接的記錄個(gè)數(shù),然后再執(zhí)行連接查詢,大大提高了查詢效率,是高效語(yǔ)句。
本文介紹在數(shù)據(jù)庫(kù)的開(kāi)發(fā)和維護(hù)過(guò)程中,多表連接查詢的優(yōu)化設(shè)計(jì)可以提高系統(tǒng)性能,對(duì)于數(shù)據(jù)量大的數(shù)據(jù)庫(kù)系統(tǒng)更為重要。本文介紹了的幾種優(yōu)化策略,在時(shí)間和空間上提高了系統(tǒng)的性能,在一定程度上提高了查詢效率。
[1]李丹.SQL Server2005數(shù)據(jù)庫(kù)管理與開(kāi)發(fā)實(shí)用教程[M].北京:機(jī)械工業(yè)出版社,2010.
[2]吳潔明,周錦.基于Oracle數(shù)據(jù)庫(kù)SQL查詢語(yǔ)句優(yōu)化規(guī)則的研究[J].陜西理工學(xué)院學(xué)報(bào)(自然科學(xué)版),2013(4):34-38.
Research on the Query Efficiency of SQL Database
Yao Xi
(Fujian Medical College,Fuzhou 350101,Fujian)
This paper introduces the type of connections,the operation steps of connections,and the connection syntax in SQL. It analyzes how to improve the query efficiency based on the multi-table connection,and further explains with the examples of the student database.
connections;multi-table;optimized query
TP311.13
A
1008-6609(2016)07-0108-02
姚曦,女,福建福州人,本科,講師,研究方向:計(jì)算機(jī)應(yīng)用技術(shù)。