百度數據開發面試題


事后HR回郵件被刷,總結下面試經歷。
面試比較全面,主要是oracle的sql開發,博主傻傻的把數據結構和各種算法看了一上午,下午去完全沒問。
話說面試大叔記憶力真的好,啥都記得清清楚楚的。

一、Oracle開發
1.取差集

not in、not exists不去重(not in() 中有null值則查詢結果為空)
minus去重
集合操作符總結(UNION:由每一個查詢 選擇的 全部不反復的行組成。並集不包括反復值, 默認按第 1 個查詢的第 1 列升序排列。
          UNION ALL: 由每一個查詢 選擇的 全部的行。全然並集包括反復值。 不排序。
          MINUS : 在第一個查詢中。 不在后面查詢中的行。不包括反復。 按第1 個查詢的第 1 列升序排列。
          INTERSECT: 取每一個查詢結果的交集。 不包括反復行。 按第1 個查詢的第 1 列升序排列。)


2.行列轉換

Oracle行列轉換

Oracle行轉列、列轉行的Sql語句總結(轉)

鏈接中的基本都用到。
1)wm_concat、listagg

select listagg(sales,',') within GROUP (order by s_date) ,wm_concat(sales) from sales

  

2)實現split

oracle拆分逗號分隔字符串 實現split

博主這里沒記住正則,開始傻傻的用循環暴力,后來面試的大叔讓我隨便用什么語言
博主就寫了個java的List數組拆分,后來想想完全不同,這里應該是String的split,
用oracle的話就用正則,其他語言支持正則的都可以用正則。這是老夫版的,
面試寫的隨意,使用方法名遞歸,估計面試官替我着急。

 public static List<String> split1(String a) {
		char[] b=(a+",").toCharArray();
		String c="";
		List<String> d = new ArrayLixt<String>();
		for(char x:b) {
			if(x==','){
				d.add(c);
				c="";
			}else {
				c=c+x;
			}
		}
    	return d;
    }

  

3.分析函數

 1)普通分析函數就不說了,博主有些遺忘的關於開窗函數的使用吧,具體要的結果

select distinct to_char(s_date,'yyyymm') 月份, 
sum(sales) over(partition by to_char(s_date,'yyyymm')) 月銷售,
sum(sales) over(partition by to_char(s_date,'yyyy')||to_char(s_date,'Q'))  季銷售,
sum(sales) over(partition by to_char(s_date,'yyyy')) 年銷售 
from sales order by to_char(s_date,'yyyymm')

https://www.jb51.net/article/91232.htm
https://blog.csdn.net/fujiakai/article/details/51066389
 2)博主忘記名字的 Lag和Lead函數(可以在一次查詢中取出某個字段的前N行和后N行的數據)
 
4.start with 和prior組合使用
大致上就是查找樹關系

select*from tab start with id=1 connect by prior id=fid

大致上開發的問題就這些,其他的可能就是些人盡皆知的問題。

二、數據庫優化和相關知識
主要被提及的就是一些優化方面的知識,一般都是程序運行慢了優化的處理過程
吾想面試官君應該想要這類答案 

Oracle數據庫該如何着手優化一個SQL

博主思路
1.看執行計划
怎么看:https://blog.csdn.net/java3344520/article/details/5506718
這里博主說了用plsql和oracle的包。
然后是執行計划給的信息都有什么
https://www.cnblogs.com/Dreamer-1/p/6076440.html
博主說主要看反應時間(這里博主已經陷入混亂狀態,自己攻擊了自己)
然后說了看CPU消耗···(這里估計中年大叔也陷入了混亂狀態,他表示問號,炎熱的下午)

2.sql優化
https://blog.csdn.net/t0404/article/details/51893311
這里博主大概答了不到一半,因為面試大叔反復問我還有呢還有呢···后來大叔的領導中年大叔也問的是這些

3.數據庫優化
這里就是分區分表建立索引,優化redo日志(這里估計不是面試大叔想要的答案,畢竟公司肯定有DBA干這個了)

三、Oracle數據庫相關
這里大叔問了一下存儲架構,然后博主在紙上塗塗畫畫寫出來了,從表空間到塊解釋一遍,后來問了個rowid的問題
這里答主說是物理地址(其實不對,可能不太多人知道),然后大叔問我是rowid是的具體含義(這個N個月前有個老爺爺講過,然鵝...)
廢多看鏈接 https://blog.csdn.net/wxwpxh/article/details/50532464

普通的堆表中的rowid是物理rowid,索引組織表(IOT)的rowid是邏輯rowid;
你可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作;
一旦一行數據插入后,則其對應的ROWID在該行的生命周期內是唯一的,即使發生行遷移,該行的ROWID值也不變。
讓我們再回到 TABLE ACCESS BY ROWID 來:行的ROWID指出了該行所在的數據文件、數據塊以及行在該塊中的位置,所以通過ROWID可以快速定位到目標數據上,這也是Oracle中存取單行數據最快的方法

高水位線問題,解釋存儲架構時一並解釋了下(存儲結構《oracle內核揭秘》講的比較詳細)

Oracle高水位線(HWM)及性能優化

 

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM