導航:首頁 > 源碼編譯 > 分布式資料庫查詢優化演算法

分布式資料庫查詢優化演算法

發布時間:2022-09-26 14:26:36

❶ 資料庫的表不變,通過什麼手段能提高查詢速度

分布式系統就是將系統的應用層,數據層或其它部分構架成分布(物理和邏輯上的都可以)狀(通常是網狀)。分布式系統通常是為了增強系統的可擴展性、穩定性和執行效率。比如在線游戲通常就是分布系統,裡面所謂的「區」就是分布系統里子常式。而分布式資料庫其實也可以稱作分布式系統,數據持久化層是分布的(數據存在不同的資料庫中,可交互,有一套綜管系統來維護數據的完整性和准確性)。所以說分布式系統更准確地說是一種系統構架概念,不是一種技術。

提高查詢速度。

1、用程序中,

保證在實現功能的基礎上,盡量減少對資料庫的訪問次數;

通過搜索參數,盡量減少對表的訪問行數

最小化結果集,從而減輕網路負擔;

夠分開的操作盡量分開處理,提高每次的響應速度;

在數據窗口使用

SQL 時,盡量把使用的索引放在選擇的首列;

演算法的結構盡量簡單;

在查詢時,不要過多地使用通配符如

SELECT * FROM T1 語句,要用到幾列就選擇幾列如:

SELECT COL1,COL2 FROM T1 ;

在可能的情況下盡量限制盡量結果集行數如:

SELECT TOP 300 COL1,COL2,COL3 FROM T1,

因為某些情況下用戶是不需要那麼多的數據的。

不要在應用中使用資料庫游標,游標是非常有用的工具,但比使用常規的、面向集的SQL語句需要更大的開銷;

按照特定順序提取數據的查找。

2、避免使用不兼容的數據類型。例如

float和int、char和varchar、binary和varbinary是不兼容的。數據類型的不兼容可能使優化器無法執行一些本來可以進行的優化操作。
例如: 

SELECT name FROM employee WHERE salary >60000
在這條語句中,如salary欄位是money型的,則優化器很難對其進行優化,因為60000是個整型數。 

我們應當在編程時將整型轉化成為錢幣型,而不要等到運行時轉化。 

3、盡量避免在WHERE子句中對欄位進行函數或表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

SELECT * FROM T1 WHERE F1/2=100 應改為 

SELECT * FROM T1 WHERE F1=100*2 

SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=』5378』

應改為: 

SELECT * FROM RECORD WHERE CARD_NO LIKE 『5378%』

SELECT member_number, first_name, last_name 
FROM members

WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21

應改為: 

SELECT member_number, first_name, last_name 

FROM members

WHERE dateofbirth< DATEADD(yy,-21,GETDATE()) 

即:任何對列的操作都將導致表掃描,它包括資料庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。

4、避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等這樣的操作符因為這會使系統無法使用索引,

而只能直接搜索表中的數據。例如:

SELECT id FROM employee WHERE id != 'B%' 

優化器將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。

5、盡量使用數字型欄位,一部分開發人員和資料庫管理人員喜歡把包含數值信息的欄位設計為字元型, 

這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接回逐個比較字元串中每一個字元,

而對於數字型而言只需要比較一次就夠了。

6、合理使用EXISTS,NOT EXISTS子句。如下所示:

1.SELECT SUM(T1.C1)FROM T1
WHERE( (SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)

2.SELECT SUM(T1.C1) FROM T1 WHERE EXISTS( 

SELECT * FROM T2 WHERE T2.C2=T1.C2) 

兩者產生相同的結果,但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定的表掃描或

是索引掃描。 

如果你想校驗表裡是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費伺服器資源。

可以用EXISTS代替。如:

IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')

可以寫成: 

IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx') 

經常需要寫一個T_SQL語句比較一個父結果集和子結果集,

從而找到是否存在在父結果集中有而在子結果集中沒有的記錄,如: 

1.SELECT a.hdr_key FROM hdr_tbl a

---- tbl a 表示 tbl 用別名a代替

WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key) 

2.SELECTa.hdr_key FROM hdr_tbl a LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key 

WHERE b.hdr_key IS NULL 

3.SELECT hdr_key FROM hdr_tbl WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)

三種寫法都可以得到同樣正確的結果,但是效率依次降低。

7、盡量避免在索引過的字元數據中,使用非打頭字母搜索。這也使得引擎無法利用索引。

見如下例子:SELECT * FROM T1 WHERE NAME LIKE 『%L%』

SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=』L』 

SELECT * FROM T1 WHERE NAME LIKE 『L%』

即使NAME欄位建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所

有數據逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作。 

8、充分利用連接條件,在某種情況下,兩個表之間可能不只一個的連接條件,這時在 

WHERE 子句中將連接條件完整的寫上,有可能大大提高查詢速度。例:

SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO 

SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO 

AND A.ACCOUNT_NO=B.ACCOUNT_NO

第二句將比第一句執行快得多。 

9、消除對大型錶行數據的順序存取,盡管在所有的檢查列上都有索引,但某些形式的

WHERE子句強迫優化器使用順序存取。如: 

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR

order_num=1008 解決辦法可以使用並集來避免順序存取: 

SELECT *FROM orders WHERE customer_num=104 AND order_num>1001

UNION SELECT *FROM orders WHERE order_num=1008 這樣就能利用索引路徑處理查詢。 

10、避免困難的正規表達式。

LIKE關鍵字支持通配符匹配,技術

❷ 分布式資料庫查詢優化寫這個論文的話有推薦的書嗎

Distributed Algorithms An Intuitive Approach.
一個小節的內容就一篇論文至少。作者概括了下演算法細節和給了相關舉例。有人評價很高,我評價一般,結合具體論文看會效果好,不過略吃力,然而直接看也略吃力,因為作者太高度概括,不好理解,沒有大部分原文教材那種怕你不懂的啰嗦的特點。所以書也就挺薄的,才200多頁而已。

Distributed Systems concepts and design.
基本上分布式系統的各基本細節都涵蓋了。系統級別書籍,略硬,算厚。這本我也還在磕。

Introction to Distributed Algorithms second edition.
這本是祖師爺級別的經典教材。不過我還沒讀過,評價略高,某些美帝高校課堂參考教材就是這本。沒有讀是因為網上的pdf都沒有索引,所以先讀上一本了。

Distributed Computing Principle, Algorithms, and Systems.
第一本算師父帶入門,對分布式演算法有大致框架和了解的話。這本可以有助於理解得更深。所以建議先讀第一本,再這本。

Principles of Distributed Database Systems.
這本是我唯一在America Amazon找到的關於分布式資料庫並且評價較高的教材。不過這本還沒排上讓我讀的行程,不知內容如何。

❸ 有哪些常見的資料庫優化方法

MRR 是 MySQL 針對特定查詢的一種優化手段。假設一個查詢有二級索引可用,讀完二級索引後要回表才能查到那些不在當前二級索引上的列值,由於二級索引上引用的主鍵值不一定是有序的,因此就有可能造成大量的隨機 IO,如果回表前把主鍵值給它排一下序,那麼在回表的時候就可以用順序 IO 取代原本的隨機 IO。
如果想關閉 MRR 優化的話,就要把優化器開關 mrr 設置為 off。
默認只有在優化器認為 MRR 可以帶來優化的情況下才會走 MRR,如果你想不管什麼時候能走 MRR 的都走 MRR 的話,你要把 mrr_cost_based 設置為 off,不過最好不要這么干,因為這確實是一個坑,MRR 不一定什麼時候都好,全表掃描有時候會更加快,如果在這種場景下走 MRR 就完成了。
MRR 要把主鍵排個序,這樣之後對磁碟的操作就是由順序讀代替之前的隨機讀。從資源的使用情況上來看就是讓 CPU 和內存多做點事,來換磁碟的順序讀。然而排序是需要內存的,這塊內存的大小就由參數 read_rnd_buffer_size 來控制。

❹ 簡述分布式資料庫的模式結構

分布式資料庫系統是在集中式資料庫系統的基礎上發展來的。是資料庫技術與網路技術結合的產物。什麼是分布式資料庫: 分布式資料庫系統是在集中式資料庫系統的基礎上發展來的。是資料庫技術與網路技術結合的產物。分布式資料庫系統有兩種:一種是物理上分布的,但邏輯上卻是集中的。這種分布式資料庫只適宜用途比較單一的、不大的單位或部門。另一種分布式資料庫系統在物理上和邏輯上都是分布的,也就是所謂聯邦式分布資料庫系統。由於組成聯邦的各個子資料庫系統是相對「自治」的,這種系統可以容納多種不同用途的、差異較大的資料庫,比較適宜於大范圍內資料庫的集成。分布式資料庫系統(DDBS)包含分布式資料庫管理系統(DDBMS)和分布式資料庫(DDB)。在分布式資料庫系統中,一個應用程序可以對資料庫進行透明操作,資料庫中的數據分別在不同的局部資料庫中存儲、由不同的DBMS進行管理、在不同的機器上運行、由不同的操作系統支持、被不同的通信網路連接在一起。一個分布式資料庫在邏輯上是一個統一的整體:即在用戶面前為單個邏輯資料庫,在物理上則是分別存儲在不同的物理節點上。一個應用程序通過網路的連接可以訪問分布在不同地理位置的資料庫。它的分布性表現在資料庫中的數據不是存儲在同一場地。更確切地講,不存儲在同一計算機的存儲設備上。 這就是與集中式資料庫的區別。從用戶的角度看,一個分布式資料庫系統在邏輯上和集中式資料庫系統一樣,用戶可以在任何一個場地執行全局應用。就好那些數據是存儲在同一台計算機上,有單個資料庫管理系統(DBMS)管理一樣,用戶並沒有什麼感覺不一樣。分布式資料庫中每一個資料庫伺服器合作地維護全局資料庫的一致性。分布式資料庫系統是一個客戶/伺服器體系結構。

❺ 資料庫的查詢優化演算法

不要在這里等,等不到的,祝你好運!

❻ 怎麼提高資料庫查詢效率

提高查詢效率首先要想到的就是加索引,那什麼是索引呢?
MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引欄位,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會佔用磁碟空間的索引文件。
如何使用索引呢?
首先索引有窄索引和寬索引兩個概念,窄索引是指索引的列數為1~2,寬索引就是說索引的列數大於2。
因為窄索引的效率要高於寬索引,所以能用窄索引就不要使用寬索引。
那麼對單欄位索引和復合索引應該如何使用?
目錄
單欄位索引的情況:
復合索引的優勢:
兩者的比較:
單欄位索引的情況:
1.表的主鍵,外鍵必須有索引
2.數據量超過300的表應該有索引
3.經常與其他表進行連接的表,在連接欄位上應該建立索引
4.經常出現在where字句中的欄位,特點是大表的欄位,應該建立索引
5.索引應該建在選擇性高的欄位上
6.索引應該建在小欄位上,對於大的文本欄位甚至超長欄位,不要建立索引
7.盡量用單欄位索引代替復合索引,復合索引的建立需要仔細的斟酌
復合索引的優勢:
1.單欄位索引很少甚至沒有
2.復合索引的幾個欄位經常同時以AND的方式出現在where語句
當where語句中的條件是OR時,索引不起作用。
兩者的比較:
以一個sql語句來舉例:SELECT * FROM STUDENT WHERE SEX="男" AND SAGE=18;
若在sex 和 sage 兩個欄位分別創建了單欄位索引,mysql查詢每次只能使用一個索引,雖然對於未添加索引時使用全盤掃描,我們的效率提升了很多,但如果在sex 和 sage兩個欄位添加復合索引,效率會跟高,如: 創建(sex, age,teacher)的復合索引,那麼其實相當於創建了(area,age,teacher)、(area,age)、(area)三個索引,這被稱為最佳左前綴特性。
那對於兩者優缺點的比較:
1.對於具有2個用and連接條件的語句,且2個列之間的關聯度較低的情況下,復合索引有一定優勢。
2.對於具有2個用and連接條件的語句,且2個列之間的關聯度較高的情況下,復合索引有很大優勢。
3.對於具有2個用or連接條件的語句,單索引有一定優勢,因為這種情況下復合索引將會導致全表掃描,而前者可以用到indexmerge的優化。
以上就是如何提高查詢效率的全部內容,如果有幫助到你的話記得點個關注喲

❼ 如何在分布式資料庫中查詢數據

分布式資料庫的目錄中存放了系統為保證正確而有效地訪問數據而要使用的全部信息。一般應包括各級模式的描述、訪問方法的描述、關於資料庫的統計數據和一致性信息等。系統根據這些信息將用戶查詢轉換為物理資料庫上的查詢,並進行查詢優化選擇一條最佳的存取路徑,進行事務管理,進行安全性和完整性檢查等。
分布式查詢處理負責將用戶查詢轉換為各站點上的物理查詢,並負責合並各子查詢結果以得到最後結果

❽ 資料庫查詢性能優化方式有哪些

1、1、調整數據結構的設計。這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。

2、2、調整應用程序結構設計。這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的資料庫資源是不同的。

3、3、調整資料庫SQL語句。應用程序的執行最終將歸結為資料庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE資料庫的性能。ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。

4、4、調整伺服器內存分配。內存分配是在信息系統運行過程中優化配置的,資料庫管理員可以根據資料庫運行狀況調整資料庫系統全局區(SGA區)的數據緩沖區、日誌緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要注意的是,SGA區不是越大越好,SGA區過大會佔用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。

5、5、調整硬碟I/O,這一步是在信息系統開發之前完成的。資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上,做到硬碟之間I/O負載均衡。

6、6、調整操作系統參數,例如:運行在UNIX操作系統上的ORACLE資料庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。

實際上,上述資料庫優化措施之間是相互聯系的。ORACLE資料庫性能惡化表現基本上都是用戶響應時間比較長,需要用戶長時間的等待。但性能惡化的原因卻是多種多樣的,有時是多個因素共同造成了性能惡化的結果,這就需要資料庫管理員有比較全面的計算機知識,能夠敏感地察覺到影響資料庫性能的主要原因所在。另外,良好的資料庫管理工具對於優化資料庫性能也是很重要的。

ORACLE資料庫性能優化工具

常用的資料庫性能優化工具有:

1、1、ORACLE資料庫在線數據字典,ORACLE在線數據字典能夠反映出ORACLE動態運行情況,對於調整資料庫性能是很有幫助的。

2、2、操作系統工具,例如UNIX操作系統的vmstat,iostat等命令可以查看到系統系統級內存和硬碟I/O的使用情況,這些工具對於管理員弄清出系統瓶頸出現在什麼地方有時候很有用。

3、3、SQL語言跟蹤工具(SQL TRACE FACILITY),SQL語言跟蹤工具可以記錄SQL語句的執行情況,管理員可以使用虛擬表來調整實例,使用SQL語句跟蹤文件調整應用程序性能。SQL語言跟蹤工具將結果輸出成一個操作系統的文件,管理員可以使用TKPROF工具查看這些文件。

4、4、ORACLE Enterprise Manager(OEM),這是一個圖形的用戶管理界面,用戶可以使用它方便地進行資料庫管理而不必記住復雜的ORACLE資料庫管理的命令。

5、5、EXPLAIN PLAN——SQL語言優化命令,使用這個命令可以幫助程序員寫出高效的SQL語言。

ORACLE資料庫的系統性能評估

信息系統的類型不同,需要關注的資料庫參數也是不同的。資料庫管理員需要根據自己的信息系統的類型著重考慮不同的資料庫參數。

1、1、在線事務處理信息系統(OLTP),這種類型的信息系統一般需要有大量的Insert、Update操作,典型的系統包括民航機票發售系統、銀行儲蓄系統等。OLTP系統需要保證資料庫的並發性、可靠性和最終用戶的速度,這類系統使用的ORACLE資料庫需要主要考慮下述參數:

l l 資料庫回滾段是否足夠?

l l 是否需要建立ORACLE資料庫索引、聚集、散列?

l l 系統全局區(SGA)大小是否足夠?

l l SQL語句是否高效?

2、2、數據倉庫系統(Data Warehousing),這種信息系統的主要任務是從ORACLE的海量數據中進行查詢,得到數據之間的某些規律。資料庫管理員需要為這種類型的ORACLE資料庫著重考慮下述參數:

l l 是否採用B*-索引或者bitmap索引?

l l 是否採用並行SQL查詢以提高查詢效率?

l l 是否採用PL/SQL函數編寫存儲過程?

l l 有必要的話,需要建立並行資料庫提高資料庫的查詢效率

SQL語句的調整原則

SQL語言是一種靈活的語言,相同的功能可以使用不同的語句來實現,但是語句的執行效率是很不相同的。程序員可以使用EXPLAIN PLAN語句來比較各種實現方案,並選出最優的實現方案。總得來講,程序員寫SQL語句需要滿足考慮如下規則:

1、1、盡量使用索引。試比較下面兩條SQL語句:

語句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN

(SELECT deptno FROM emp);

語句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS

(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);

這兩條查詢語句實現的結果是相同的,但是執行語句A的時候,ORACLE會對整個emp表進行掃描,沒有使用建立在emp表上的deptno索引,執行語句B的時候,由於在子查詢中使用了聯合查詢,ORACLE只是對emp表進行的部分數據掃描,並利用了deptno列的索引,所以語句B的效率要比語句A的效率高一些。

2、2、選擇聯合查詢的聯合次序。考慮下面的例子:

SELECT stuff FROM taba a, tabb b, tabc c

WHERE a.acol between :alow and :ahigh

AND b.bcol between :blow and :bhigh

AND c.ccol between :clow and :chigh

AND a.key1 = b.key1

AMD a.key2 = c.key2;

這個SQL例子中,程序員首先需要選擇要查詢的主表,因為主表要進行整個表數據的掃描,所以主表應該數據量最小,所以例子中表A的acol列的范圍應該比表B和表C相應列的范圍小。

3、3、在子查詢中慎重使用IN或者NOT IN語句,使用where (NOT) exists的效果要好的多。

4、4、慎重使用視圖的聯合查詢,尤其是比較復雜的視圖之間的聯合查詢。一般對視圖的查詢最好都分解為對數據表的直接查詢效果要好一些。

5、5、可以在參數文件中設置SHARED_POOL_RESERVED_SIZE參數,這個參數在SGA共享池中保留一個連續的內存空間,連續的內存空間有益於存放大的SQL程序包。

6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以幫助程序員將某些經常使用的存儲過程「釘」在SQL區中而不被換出內存,程序員對於經常使用並且佔用內存很多的存儲過程「釘」到內存中有利於提高最終用戶的響應時間。

CPU參數的調整

CPU是伺服器的一項重要資源,伺服器良好的工作狀態是在工作高峰時CPU的使用率在90%以上。如果空閑時間CPU使用率就在90%以上,說明伺服器缺乏CPU資源,如果工作高峰時CPU使用率仍然很低,說明伺服器CPU資源還比較富餘。

使用操作相同命令可以看到CPU的使用情況,一般UNIX操作系統的伺服器,可以使用sar –u命令查看CPU的使用率,NT操作系統的伺服器,可以使用NT的性能管理器來查看CPU的使用率。

資料庫管理員可以通過查看v$sysstat數據字典中「CPU used by this session」統計項得知ORACLE資料庫使用的CPU時間,查看「OS User level CPU time」統計項得知操作系統用戶態下的CPU時間,查看「OS System call CPU time」統計項得知操作系統系統態下的CPU時間,操作系統總的CPU時間就是用戶態和系統態時間之和,如果ORACLE資料庫使用的CPU時間占操作系統總的CPU時間90%以上,說明伺服器CPU基本上被ORACLE資料庫使用著,這是合理,反之,說明伺服器CPU被其它程序佔用過多,ORACLE資料庫無法得到更多的CPU時間。

資料庫管理員還可以通過查看v$sesstat數據字典來獲得當前連接ORACLE資料庫各個會話佔用的CPU時間,從而得知什麼會話耗用伺服器CPU比較多。

出現CPU資源不足的情況是很多的:SQL語句的重解析、低效率的SQL語句、鎖沖突都會引起CPU資源不足。

1、資料庫管理員可以執行下述語句來查看SQL語句的解析情況:

SELECT * FROM V$SYSSTAT

WHERE NAME IN

('parse time cpu', 'parse time elapsed', 'parse count (hard)');

這里parse time cpu是系統服務時間,parse time elapsed是響應時間,用戶等待時間

waite time = parse time elapsed – parse time cpu

由此可以得到用戶SQL語句平均解析等待時間=waite time / parse count。這個平均等待時間應該接近於0,如果平均解析等待時間過長,資料庫管理員可以通過下述語句

SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA

ORDER BY PARSE_CALLS;

來發現是什麼SQL語句解析效率比較低。程序員可以優化這些語句,或者增加ORACLE參數SESSION_CACHED_CURSORS的值。

2、資料庫管理員還可以通過下述語句:

SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA;

查看低效率的SQL語句,優化這些語句也有助於提高CPU的利用率。

3、3、資料庫管理員可以通過v$system_event數據字典中的「latch free」統計項查看ORACLE資料庫的沖突情況,如果沒有沖突的話,latch free查詢出來沒有結果。如果沖突太大的話,資料庫管理員可以降低spin_count參數值,來消除高的CPU使用率。

內存參數的調整

內存參數的調整主要是指ORACLE資料庫的系統全局區(SGA)的調整。SGA主要由三部分構成:共享池、數據緩沖區、日誌緩沖區。

1、 1、 共享池由兩部分構成:共享SQL區和數據字典緩沖區,共享SQL區是存放用戶SQL命令的區域,數據字典緩沖區存放資料庫運行的動態信息。資料庫管理員通過執行下述語句:

select (sum(pins - reloads)) / sum(pins) "Lib Cache" from v$librarycache;

來查看共享SQL區的使用率。這個使用率應該在90%以上,否則需要增加共享池的大小。資料庫管理員還可以執行下述語句:

select (sum(gets - getmisses - usage - fixed)) / sum(gets) "Row Cache" from v$rowcache;

查看數據字典緩沖區的使用率,這個使用率也應該在90%以上,否則需要增加共享池的大小。

2、 2、 數據緩沖區。資料庫管理員可以通過下述語句:

SELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets','physical reads');

來查看資料庫數據緩沖區的使用情況。查詢出來的結果可以計算出來數據緩沖區的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。

這個命中率應該在90%以上,否則需要增加數據緩沖區的大小。

3、 3、 日誌緩沖區。資料庫管理員可以通過執行下述語句:

select name,value from v$sysstat where name in ('redo entries','redo log space requests');查看日誌緩沖區的使用情況。查詢出的結果可以計算出日誌緩沖區的申請失敗率:

申請失敗率=requests/entries,申請失敗率應該接近於0,否則說明日誌緩沖區開設太小,需要增加ORACLE資料庫的日誌緩沖區。

❾ 分布式中基於關系代數等價變換的查詢優化處理是什麼

基於關系代數等價變換查詢優化處理的基本原理和實現方法
基本原理:把查詢問題轉變為關系代數表達式,分析得到查詢樹(語法樹),進行從全局到片段的變換得到基於片段的查詢樹,然後利用關系代數變換規則的優化演算法,盡可能先執行選擇和投影操作.這樣,一方面可以減少其後操作的操作量,另一方面可以減少操作次數.對該查詢樹進行優化,從而達到查詢優化的目的.

❿ 分布式資料庫片段查詢是什麼

一些多機查詢計算場景下,要求合並多機數據源,假設某個需求需要將數據再次計算。

計算的列不在select查詢中,拿回來的多機數據源因為沒有需要計算的列,就無法計算。

通過記錄原來select的列數,將需要再次計算的列附加到select列中,待計算完畢後,按照原來的select列數將數據發送給客戶端。

本方案應用於多機查詢處理中(分布式資料庫),結合數據定義配置,使用本方法能夠獲取到查詢需要的額外列是否真實有效,結合數據散列方法優化本方法的使用。

Original query:原始查詢,一般是用戶發給資料庫的查詢語句;Sytax tree:語法樹,用戶發送給資料庫的查詢語句,通過解析器生成的一個可供代碼處理的邏輯結構;Fetch select list:這個動作是獲取SELECT查詢語句中的查詢列。

Have group:這個動作是檢查SELECT查詢語句中是否存在GROUP關鍵字。Have order:這個動作是檢查SELECT查詢語句中是否存在ORDER關鍵字。Select list:一個存儲SELECT語句中查詢列的數據結構。

Select list, [group list, order list]:修改後的查詢語句格式,括弧裡面的新增列,是附加到原始列後面的。

原始SQL解析成語法樹結構,該語法樹能夠提供一個代碼結構,後續處理流程會使用到這個代碼結構。首先掃描SELECT查詢的列,將SELECT的列存儲到SELECT LIST結構中。

掃描語法樹查看是否有GROUP(分組)關鍵字存在,如果存在,需要判斷GROUP分組的列在SELECT LIST中是否已經存在,如果不存在,則將GROUP分組列增加到SELECT LIST中,並將GROUP分組列附加到原查詢語句的查詢列尾部,並且記錄下分組列在查詢列中的位置。

掃描語法樹查看是否有ORDER(排序)關鍵字存在,如果存在,需要判斷SELECT LIST是否已經存在ORDER排序列,如果ORDER排序列沒有包含在SELECT LIST中,則將ORDER排序列放入SELECT LIST中,並且將ORDER排序列附加到查詢語句尾部,標記ORDER排序列在查詢語句中的位置。

經過處理流程1,2,3,4就將客戶端發送給資料庫的原始查詢語句改寫為新的查詢語句,下面使用一個具體例子來說明實際處理過程。

例:Original query(原始查詢語句,客戶端發送給資料庫的查詢語句):SELECT email FROM userInfo WHERE create_time > 『2011-11-11』 GROUP BY name order by id desc。

syntax tree:SQL解析後的語法樹(略,這是其他獨立模塊提供的),Fetch select list:掃描語法樹,可以發現SELECT查詢的列有email,因此,將email存放到SELECT LIST。

Have group:掃描語法樹,發現有GROUP關鍵字,分組列name不存在與SELECT LIST中,因將name放入SELECT LIST中,並且將name附加到查詢列後面。

這時候SQL語句為SELECT email, name FROM…,標記分組列name在查詢中的位置為1(從左到右,從0開始,email位置為0,name為1)。

Have order掃描語法樹,發現有ORDER關鍵字,排序列為id,該列不在SELECT LIST中,因此將排序列ID附加到查詢語句中,查詢語句變為SELECT email, name, id FROM … ,標記排序列在查詢中的位置為2。

經過一系列處理流程,那麼為了實現這次查詢,已經將查詢重寫改寫為形成一個新的查詢:SELECT email,name, id FROM userInfo WHERE create_time > 『2011-11-11』 GROUP BY name ORDER BY id DESC。

所得到的信息有:原始查詢的列數,改寫後的列數,分組列位置,排序列的位置。使用處理後的SQL語句從數據存放點取回數據,根據所得到的信息,依次執行分組,排序,然後再發送的時候,按照原始查詢的列數發送數據到客戶端。

分庫分表後能夠支持復雜查詢,如GROUP、ORDER等等;數據存儲節點參與計算,相比直接把數據全部查詢到應用程序中進行計算,具有更小的網路開銷,更快的計算速度。

在多機查詢中,不需要應用程序參與查詢計算;通過關系代數等價變化的方式,重寫查詢語句,讓數據節點參與查詢計算的方式,相比常規方案性價比要高。



閱讀全文

與分布式資料庫查詢優化演算法相關的資料

熱點內容
程序員用得到數字區嗎 瀏覽:174
python求商 瀏覽:477
ipad能用c語言編譯器嗎 瀏覽:561
軟泥解壓球最新版 瀏覽:998
4萬程序員辭職創業 瀏覽:759
thinkingphp 瀏覽:597
安卓相冊移動文件夾 瀏覽:6
耳朵清潔解壓聲控99的人都睡得著 瀏覽:205
叉車出租網站源碼 瀏覽:874
共享單車的app是什麼 瀏覽:408
不帶gui的伺服器什麼意思 瀏覽:373
金剛經及PDF 瀏覽:102
php中冒號 瀏覽:358
php5432 瀏覽:352
命令在哪使用 瀏覽:172
php獲取網頁元素 瀏覽:708
為什麼需要硬體驅動編譯 瀏覽:885
pm編程怎樣看導柱孔對不對稱 瀏覽:138
農業大學選課找不到伺服器怎麼辦 瀏覽:659
路由配置網關命令 瀏覽:935