多表連接查詢和多次單表查詢哪個效率高?為什麼?

碼農的搬磚生涯


如果數據量小的表,這樣的設計意義不大,而且當然是單錶速度快。若在大數據量情況下,設計非常有意義。在多表連接中注意數據的條目和外健,避免出行大量冗餘數據導致性能下降。下面我以Oracle講講數據查詢的整個過程技術。

由於數據分佈到數據塊,在大量數據設計中可以將數據存儲於多個數據塊,在高併發進程的隨機訪問的情況下,能有效減少塊衝突 同樣的數據需要更多的數據塊來存儲,由於數據塊的塊頭元信息大小固定,所以需要更多的空間來存儲塊頭元信息。行長度過大容易導致行連接,從而導致Oracle獲取數據塊的效率降低 ,在行長度固定的前提下,單塊能夠存儲更多的數據行,也就意味著Oracle一次I/O能讀取更多的數據行。適合連續順序讀或者存放大對象數據(如LOB數據) 由於大數據塊可以存放更多的索引葉節點信息,容易引起爭用,所以大數據塊不適合存放索引葉節點信息。

大量數據表的數據庫參數設置DB_FILE_MULTIBLOCK_READ_COUNT表示Oracle一次順序I/O讀操作最多能讀取的數據塊塊數。該參數的默認值隨操作系統的不同而不同。在全表掃描或者索引快速掃描比較多的系統中(如DSS系統),建議將該值設置得較大。但是DB_FILE_MULTIBLOCK_READ_COUNT參數受操作最大單次I/O大小的限制,大多數操作系統單次讀操作的大小不能超過1MB,這也就意味著在8KB數據塊大小的情況下,該參數最大值為128。值得一提的是,該參數的大小還會影響Oracle CBO對執行計劃的評估,如果設成較大值,Oracle的執行計劃傾向於全表掃描。當該參數設置為0或者保持默認時,CBO假設全表掃描時最多能連續讀取8個數據塊。從Oracle 11R2開始,DB_FILE_MULTIBLOCK_READ_COUNT的取值算法如下:

db_file_multiblock_read_count = min(1048576/db_block_size , db_cache_size/

(sessions * db_block_size))

注意 數據庫參數BLOCK_SIZE在設定之後,在數據庫生命週期內不可更改。

當執行SELECT語句時,如果在內存裡找不到相應的數據,就會從磁盤讀取進而緩存至LRU末端(冷端),這個過程就叫物理讀。當相應數據已在內存,就會邏輯讀。我物理讀是磁盤讀,邏輯讀是內存讀;內存讀的速度遠比磁盤讀來得快。

下面將本人大數據分區設計截圖,為大家參考學習。


科技與生活知識庫


是做表連接查詢還是做分解查詢要具體情況具體分析。

如果數據庫的結構合理,索引設計得當,表連接的效率要高於分解查詢。比如,在有外鍵的時候,數據庫可以為外鍵建表並建立索引從而提升多個表連接查詢的效率。另外,多表連接查詢不需要把數據傳輸到應用程序中,直接在數據庫端執行,這在很大程度上提升了效率。

但是多表連接也有一些缺點。多表連接對錶結構的依存度很高,只要表結構出現變更就會同時對數據庫檢索和應用處理兩個部分產生較大影響。另外,多表連接的兼容性不好,數據庫不同SQL文也多少有些差異。而且採用分散數據庫的時候,實現多表連接即麻煩又沒有什麼好處。因此,一些大型系統或者是支持多種類數據庫的系統一般不會使用多表連接,而傾向於採用分解查詢。


日衝信息 黃


做java的,在orm框架下,分解查詢是最符合面向對象操作的,挺支持分解查詢的(拙見)


分享到:


相關文章: