當前位置:首頁 » 編程語言 » sql形象分析
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql形象分析

發布時間: 2023-05-22 22:21:55

1. sql SERVER 資料庫到底有什麼具體作用

作用如下:

一、系統表存儲SQL所有的系統信息。

存儲有關資料庫服務中的元數據所謂元數據即(比如數據伺服器有哪些用戶資料庫、資料庫伺服器有哪些登陸賬號,資料庫中都有哪些表,每個表都有哪些欄位 每個資料庫有哪些存儲過程、視圖等等的數據),系統表一般sys開頭。

二、了解資料庫中系統表,可以編寫sql語句或編程的時候用到。

在創建資料庫的時候選判斷資料庫是否存在;創建資料庫中對象(表、視圖、存儲過程、索引等)是否存在,存在返回,不存在則執行創建語句。批量刪除資料庫中對象,比如一次性刪除某個具體資料庫中的所有用戶創建的表、視圖、索引等對象。

三、重要的幾個系統表

Sysxlogins:存在與Master資料庫中,(所有資料庫中用戶和角色),記錄著所有能登陸到Sql server 的帳號。要重啟服務或reconfigure with override,sysdatabases:記錄著當前系統所有的資料庫。只有Master數據中有此系統表。


(1)sql形象分析擴展閱讀:

一、資料庫優點:

1、易於維護:都是使用表結構,格式一致;

2、使用方便:SQL語言通用,可用於復雜查詢;

3、復雜操作:支持SQL,可用於一個表以及多個表之間非常復雜的查詢。

二、資料庫缺點:

1、讀寫性能比較差,尤其是海量數據的高效率讀寫;

2、固定的表結構,靈活度稍欠;

3、高並發讀寫需求,傳統關系型資料庫來說,硬碟I/O是一個很大的瓶頸。

2. oracle sql是怎麼解析的

導讀:Oracle的後台運作原理是什麼?我們的一條命令是如何被執行的?今天我們就從一條簡單的Select語句開始,看看Oracle資料庫後台的運作機制。

Select語句可以說是DBA和資料庫開發者在工作中使用最多的語句之一,但這條語句是如何執行?在Oracle資料庫中又是如何運作的呢?今天我們就從一條簡單的Select語句開始,看看Oracle資料庫後台的運作機制。這對於我們之後的系統管理與故障排除非常有幫助。

第一步:客戶端把語句發給伺服器端執行

當我們在客戶端執行select語句時,客戶端會把這條SQL語句發送給伺服器端,讓伺服器端的進程來處理這語句。也就是說,Oracle客戶端是不會做任何的操作,他的主要任務就是把客戶端產生的一些SQL語句發送給伺服器端。雖然在客戶端也有一個資料庫進程,但是,這個進程的作用跟伺服器上的進程作用事不相同的。伺服器上的資料庫進程才會對SQL語句進行相關的處理。不過,有個問題需要說明,就是客戶端的進程跟伺服器的進程是一一對應的。也就是說,在客戶端連接上伺服器後,在客戶端與伺服器端都會形成一個進程,客戶端上的我們叫做客戶端進程;而伺服器上的我們叫做伺服器進程。所以,由於所有的SQL語句都是伺服器進程執行的,所以,有些人把伺服器進程形象地比喻成客戶端進程的「影子」。

第二步:語句解析

當客戶端把SQL語句傳送到伺服器後,伺服器進程會對該語句進行解析。同理,這個解析的工作,也是在伺服器端所進行的。雖然這只是一個解析的動作,但是,其會做很多「小動作」。

1. 查詢高速緩存。伺服器進程在接到客戶端傳送過來的SQL語句時,不會直接去資料庫查詢。而是會先在資料庫的高速緩存中去查找,是否存在相同語句的執行計劃。如果在數據高速緩存中,剛好有其他人使用這個查詢語句的話,則伺服器進程就會直接執行這個SQL語句,省去後續的工作。所以,採用高速數據緩存的話,可以提高SQL語句的查詢效率。一方面是從內存中讀取數據要比從硬碟中的數據文件中讀取數據效率要高,另一方面,也是因為這個語句解析的原因。

不過這里要注意一點,這個數據緩存跟有些客戶端軟體的數據緩存是兩碼事。有些客戶端軟體為了提高查詢效率,會在應用軟體的客戶端設置數據緩存。由於這些數據緩存的存在,可以提高客戶端應用軟體的查詢效率。但是,若其他人在伺服器進行了相關的修改,由於應用軟體數據緩存的存在,導致修改的數據不能及時反映到客戶端上。從這也可以看出,應用軟體的數據緩存跟資料庫伺服器的高速數據緩存不是一碼事。

2. 語句合法性檢查。當在高速緩存中找不到對應的SQL語句時,則資料庫伺服器進程就會開始檢查這條語句的合法性。這里主要是對SQL語句的語法進行檢查,看看其是否合乎語法規則。如果伺服器進程認為這條SQL語句不符合語法規則的時候,就會把這個錯誤信息,反饋給客戶端。在這個語法檢查的過程中,不會對SQL語句中所包含的表名、列名等等進行SQL他只是語法上的檢查。

3. 語言含義檢查。若SQL語句符合語法上的定義的話,則伺服器進程接下去會對語句中的欄位、表等內容進行檢查。看看這些欄位、表是否在資料庫中。如果表名與列名不準確的話,則資料庫會就會反饋錯誤信息給客戶端。

所以,有時候我們寫select語句的時候,若語法與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後,再提示說列名或表名錯誤。若能夠掌握這個順序的話,則在應用程序排錯的時候,可以節省時間。

4. 獲得對象解析鎖。當語法、語義都正確後,系統就會對我們需要查詢的對象加鎖。這主要是為了保障數據的一致性,防止我們在查詢的過程中,其他用戶對這個對象的結構發生改變。對於加鎖的原理與方法,我在其他文章中已經有專門敘述,在這里就略過不談了。

5. 數據訪問許可權的核對。當語法、語義通過檢查之後,客戶端還不一定能夠取得數據。伺服器進程還會檢查,你所連接的用戶是否有這個數據訪問的許可權。若你連接上伺服器的用戶不具有數據訪問許可權的話,則客戶端就不能夠取得這些數據。故,有時候我們查詢數據的時候,辛辛苦苦地把SQL語句寫好、編譯通過,但是,最後系統返回個 「沒有許可權訪問數據」的錯誤信息,讓我們氣半死。這在前端應用軟體開發調試的過程中,可能會碰到。所以,要注意這個問題,資料庫伺服器進程先檢查語法與語義,然後才會檢查訪問許可權。

6. 確定最佳執行計劃。當語句與語法都沒有問題,許可權也匹配的話,伺服器進程還是不會直接對資料庫文件進行查詢。伺服器進程會根據一定的規則,對這條語句進行優化。不過要注意,這個優化是有限的。一般在應用軟體開發的過程中,需要對資料庫的sql語言進行優化,這個優化的作用要大大地大於伺服器進程的自我優化。所以,一般在應用軟體開發的時候,資料庫的優化是少不了的。

當伺服器進程的優化器確定這條查詢語句的最佳執行計劃後,就會將這條SQL語句與執行計劃保存到數據高速緩存。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,而直接執行SQL語句,提高SQL語句處理效率。

第三步:語句執行

語句解析只是對SQL語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意思。等到語句解析完成之後,資料庫伺服器進程才會真正的執行這條SQL語句。

這個語句執行也分兩種情況。一是若被選擇行所在的數據塊已經被讀取到數據緩沖區的話,則伺服器進程會直接把這個數據傳遞給客戶端,而不是從資料庫文件中去查詢數據。若數據不在緩沖區中,則伺服器進程將從資料庫文件中查詢相關數據,並把這些數據放入到數據緩沖區中。

這里仍然要注意一點,就是Oracle資料庫中,定義了很多種類的高速緩存。像上面所說的SQL語句緩存與現在講的數據緩存。我們在學習資料庫的時候,需要對這些緩存有一個清晰的認識,並了解各個種類緩存的作用。這對於我們後續資料庫維護與資料庫優化是非常有用的。

第四步:提取數據

當語句執行完成之後,查詢到的數據還是在伺服器進程中,還沒有被傳送到客戶端的用戶進程。所以,在伺服器端的進程中,有一個專門負責數據提取的一段代碼。他的作用就是把查詢到的數據結果返回給用戶端進程,從而完成整個查詢動作。

從這整個查詢處理過程中,我們在資料庫開發或者應用軟體開發過程中,需要注意以下幾點:

一是要了解資料庫緩存跟應用軟體緩存是兩碼事情。資料庫緩存只有在資料庫伺服器端才存在,在客戶端是不存在的。只有如此,才能夠保證資料庫緩存中的內容跟資料庫文件的內容一致。才能夠根據相關的規則,防止數據臟讀、錯讀的發生。而應用軟體所涉及的數據緩存,由於跟資料庫緩存不是一碼事情,所以,應用軟體的數據緩存雖然可以提高數據的查詢效率,但是,卻打破了數據一致性的要求,有時候會發生臟讀、錯讀等情況的發生。所以,有時候,在應用軟體上有專門一個功能,用來在必要的時候清除數據緩存。不過,這個數據緩存的清除,也只是清除本機上的數據緩存,或者說,只是清除這個應用程序的數據緩存,而不會清除資料庫的數據緩存。

二是絕大部分SQL語句都是按照這個處理過程處理的。我們DBA或者基於Oracle資料庫的開發人員了解這些語句的處理過程,對於我們進行涉及到SQL語句的開發與調試,是非常有幫助的。有時候,掌握這些處理原則,可以減少我們排錯的時間。特別要注意,資料庫是把數據查詢許可權的審查放在語法語義的後面進行檢查的。所以,有時會若光用資料庫的許可權控制原則,可能還不能滿足應用軟體許可權控制的需要。此時,就需要應用軟體的前台設置,實現許可權管理的要求。而且,有時應用資料庫的許可權管理,也有點顯得繁瑣,會增加伺服器處理的工作量。因此,對於記錄、欄位等的查詢許可權控制,大部分程序涉及人員喜歡在應用程序中實現,而不是在資料庫上實現。

3. sql server2000裡面主碼和外碼 可不可以形象的解釋一下

主鍵和外鍵最重要的是保證數據的完整性和一致性。主鍵是本表的標識欄位,是唯一非空的,外鍵是描述了與其他表的關聯關系,有了這兩個約束條件可以使得資料庫的表有機的整合起來。主鍵應該比較要理解,可以是組合的也可以是單一欄位的,根據它就能篩選出唯一一條記錄,主鍵一般建議都需要。外鍵可以有也可以沒有,主要根據業務需求而定,如果不建立,對編程一般不會有什麼影響,但相應的錄入數據的時候就不對錄入的數據進行「參照完整性」檢查了。例如:
例如有兩個表
A(a,b) :a為主鍵,b為外鍵(來自於B.b)
B(b,c,d) :b為主鍵
如果我把欄位b的外鍵屬性去掉,對編程沒什麼影響。
如上面,A中的b要麼為空,要麼是在B的b中存在的值,有外鍵的時候,資料庫會自動幫你檢查A的b是否在B的b中存在。
建立外鍵原則:
1、 為關聯欄位創建外鍵。
2、 所有的鍵都必須唯一。
3、避免使用復合鍵。
4、外鍵總是關聯唯一的鍵欄位。

4. 資料庫的形象比喻。。剛學資料庫,很多都不懂。

猶如一個大倉庫, 資料庫管理者就像倉庫管理員, 你可以對倉庫就行調度啊, 資料庫表就像倉庫里的倉房, 而表裡的信息, 就像倉庫里存放的仔判坦物品,念桐 表與表之間的關系,沖慎 就像倉房之間的關系。

5. SQL SERVER 索引的工作原理

SQL 當一個新表被創建之時,系統將在磁碟中分配一段以8K為單位的連續空間,當欄位的值從內存寫入磁碟時,就在這一既定空間隨機保存,當一個8K用完的時候, SQLS指針會自動分配一個8K的空間。這里,每個8K空間被稱為一個數據頁(Page),又名頁面或數據頁面,並分配從0-7的頁號,每個文件的第0頁記錄引導信息,叫文件頭(File header);每8個數據頁(64K)的組合形成擴展區(Extent),稱為擴展。全部數據頁的組合形成堆(Heap)。
SQLS 規定行不能跨越數據頁,所以,每行記錄的最大數據量只能為8K。這就是char和varchar這兩種字元串類型容量要限制在8K以內的原因,存儲超過 8K的數據應使用text類型,實際上,text類型的欄位值不能直接錄入和保存,它只是存儲一個指針,指向由若干8K的文本數據頁所組成的擴展區,真正的數據正是放在這些數據頁中。
頁面有空間頁面和數據頁面之分。當一個擴展區的8個數據頁中既包含了空間頁面又包括了數據或索引頁面時,稱為混合擴展(Mixed Extent),每張表都以混合擴展開始;反之,稱為一致擴展專門保存數據及索引信息。表被創建之時,SQLS在混合擴展中為其分配至少一個數據頁面,隨著數據量的增長,SQLS可即時在混合擴展中分配出7個頁面,當數據超過8個頁面時,則從一致擴展中分配數據頁面。
空間頁面專門負責數據空間的分配和管理,包括:PFS頁面(Page free space):記錄一個頁面是否已分配、位於混合擴展還是一致擴展以及頁面上還有多少可用空間等信息;GAM頁面(Global allocation map)和SGAM頁面(Secodary global allocation map):用來記錄空閑的擴展或含有空閑頁面的混合擴展的位置。SQLS綜合利用這三種類型的頁面文件
在必要時為數據表創建新空間;數據頁或索引頁則專門保存數據及索引信息,SQLS使用4種類型的數據頁面來管理表或索引:它們是IAM頁、數據頁、文本/圖像頁和索引頁。
在WINDOWS 中,我們對文件執行的每一步操作,在磁碟上的物理位置只有系統(system)才知道;SQL SERVER沿襲了這種工作方式,在插入數據的過程中,不但每個欄位值在數據頁面中的保存位置是隨機的,而且每個數據頁面在「堆」中的排列位置也只有系統(system)才知道。這是為什麼呢?眾所周知,OS 之所以能管理DISK,是因為在系統啟動時首先載入了文件分配表:FAT(File Allocation Table),正是由它管理文件系統並記錄對文件的一切操作,系統才得以正常運行;同理,作為管理系統級的SQL
SERVER,也有這樣一張類似FAT的表存在,它就是索引分布映像頁:IAM(Index Allocation Map)。
IAM的存在,使SQLS對數據表的物理管理有了可能。
IAM 頁從混合擴展中分配,記錄了8個初始頁面的位置和該擴展區的位置,每個IAM頁面能管理512,000個數據頁面,如
果數據量太大,SQLS也可以增加更多的IAM頁,可以位於文件的任何位置。第一個IAM頁被稱為FirstIAM,其中記錄了以
後的IAM頁的位置。
數據頁和文本/圖像頁互反,前者保存非文本/圖像類型的數據,因為它們都不超過8K的容量,後者則只保存超過8K容
量的文本或圖像類型數據。而索引頁顧名思義,保存的是與索引結構相關的數據信息。了解頁面的問題有助我們下
一步准確理解SQLS維護索引的方式,如頁拆分、填充因子等。

二、索引的基本概念
什麼是索引呢?索引是一種特殊類型的資料庫對象,它與表有著密切的聯系。
索引是為檢索而存在的。如一些書籍的末尾就專門附有索引,指明了某個關鍵字在正文中的出現的頁碼位置,方便我們查找,但大多數的書籍只有目錄,目錄不是索引,只是書中內容的排序,並不提供真正的檢索功能。可見建立索引要單獨佔用空間;索引也並不是必須要建立的,它們只是為更好、更快的檢索和定位關鍵字而存在。
再進一步說,我們要在圖書館中查閱圖書,該怎麼辦呢?圖書館的前台有很多叫做索引卡片櫃的小櫃子,裡面分了若乾的類別供我們檢索圖書,比如你可以用書名的筆畫順序或者拼音順序作為查找的依據,你還可以從作者名的筆畫順序或拼音順序去查詢想要的圖書,反正有許多檢索方式,但有一點很明白,書庫中的書並沒有按照這些卡片櫃中的順序排列——雖然理論上可以這樣做,事實上,所有圖書的脊背上都人工的粘貼了一個特定的編號①,它們是以這個順序在排列。索引卡片中並沒有指明這本書擺放在書庫中的第幾個書架的第幾本,僅僅指明了這個特定的編號。管理員則根據這一編號將請求的圖書返回到讀者手中。這是很形象的例子,以下的講解將會反復用到它。
SQLS 在安裝完成之後,安裝程序會自動創建master、model、tempdb等幾個特殊的系統資料庫,其中master是SQLS的
主資料庫,用於保存和管理其它系統資料庫、用戶資料庫以及SQLS的系統信息,它在SQLS中的地位與WINDOWS下的注冊表相當。
master中有一個名為sysindexes的系統表,專門管理索引。SQLS查詢數據表的操作都必須用到它,毫無疑義,它是本文主角之一。查看一張表的索引屬性,可以在查詢分析器中使用以下命令:select * from sysindexes where id=object_id(『tablename』);而要查看錶的索引所佔空間的大小,可以使用系統存儲過程命令:sp_spaceused tablename,其中參數tablename為被索引的表名。

三、平衡樹
如果你通過書後的索引知道了一個關鍵字所在的頁碼,你有可能通過隨機的翻尋,最終到達正確的頁碼。但更科學更快捷的方法是:首先把書翻到大概二分之一的位置,如果要找的頁碼比該頁的頁碼小,就把書向前翻到四分之一處,否則,就把書向後翻到四分之三的地方,依此類推,把書頁續分成更小的部分,直至正確的頁碼。這叫「兩分法」,微軟在官方教程MOC里另有一種說法:叫B樹(B-Tree,Balance Tree),即平衡樹。
一個表索引由若干頁面組成,這些頁面構成了一個樹形結構。B 樹由「根」(root)開始,稱為根級節點,它通過指向另外兩個頁,把一個表的記錄從邏輯上分成兩個部分:「枝」—--非葉級節點(Non-Leaf Level);而非葉級節點又分別指向更小的部分:「葉」——葉級節點(Leaf Level)。根節點、非葉級節點和葉級節點都位於索引頁中,統稱為索引節點,屬於索引頁的范籌。這些「枝」、「葉」最終指向了具體的數據頁(Page)。在根級節點和葉級節點之間的葉又叫數據中間頁。
「根」(root)對應了sysindexes表的Root欄位,其中記載了非葉級節點的物理位置(即指針);非葉級節點位於根
節點和葉節點之間,記載了指向葉級節點的指針;而葉級節點則最終指向數據頁。這就是「平衡樹」。

四、聚集索引和非聚集索引
從形式上而言,索引分為聚集索引(Clustered Indexes)和非聚集索引(NonClustered Indexes)。
聚集索引相當於書籍脊背上那個特定的編號。如果對一張表建立了聚集索引,其索引頁中就包含著建立索引的列的值(下稱索引鍵值),那麼表中的記錄將按照該索引鍵值進行排序。比如,我們如果在「姓名」這一欄位上建立了聚集索引,則表中的記錄將按照姓名進行排列;如果建立了聚集索引的列是數值類型的,那麼記錄將按照該鍵值的數值大小來進行排列。
非聚集索引用於指定數據的邏輯順序,也就是說,表中的數據並沒有按照索引鍵值指定的順序排列,而仍然按照插入記錄時的順序存放。其索引頁中包含著索引鍵值和它所指向該行記錄在數據頁中的物理位置,叫做行定位符(RID:Row ID)。好似書後面的的索引表,索引表中的順序與實際的頁碼順序也是不一致的。而且一本書也許有多個索引。比如主題索引和作者索引。
SQL Server在默認的情況下建立的索引是非聚集索引,由於非聚集索引不對表中的數據進行重組,而只是存儲索引鍵
值並用一個指針指向數據所在的頁面。一個表如果沒有聚集索引時,理論上可以建立249個非聚集索引。每個非聚集索引提供訪問數據的不同排序順序。

6. SQL server 中的@,@@、#,##分別代表什麼

@ 表示局部變數

@@ 表示全局變數

# 表示本地臨時表的名稱,以單個數字元號打頭;它們僅對當前的用戶連接是可見的

## 表示全局臨時表

使用事例如下圖所示:

(6)sql形象分析擴展閱讀:

本地臨時表

以一個井號 (#) 開頭的表名。只有在創建本地臨時表連接是才能看得到,連接斷開時臨時表立馬被刪除,也就是到貨本地臨時表為創建它的該鏈接的會話所獨有,或者說局部臨時表是有當前用戶創建的,並且只有當前用戶的會話才可以訪問。

全局臨時表

以兩個井號 (##) 開頭的表名。在所有連接上都能看到全局臨時表,也就是說只要全局臨時表存在,那麼對所有創建用戶的會話後都是可見的。如果在創建全局臨時表的連接斷開前沒有顯式地除去全局臨時表,那麼只能等到其它所有任務都停止引用,這些表才會被刪除。

當創建全局臨時表的連接斷開後,新的任務不能再引用它們,也就是說舊的任務才可以引用。當前的語句一執行完,任務與表之間的關聯即被除去;因此通常情況下,只要創建全局臨時表的連接斷開,全局臨時表也會同時被刪除。

7. sql 語句where和 select有什麼區別

SQL語言中,select子句確定輸出記錄行中哪些欄位;而where子句則指定篩選條件,確定哪些符合條件的記錄行可被輸出。前者決定輸出欄位、後者決定可被輸出的記錄行,兩者交叉結合從而得到檢索出來最終的記錄集。

形象一點來講,select子句在二維表中橫向取值,where子句在二維表中縱向取值,SQL語句中如果沒有指定where條件,則默認在二維表中縱向取所有行。