㈠ 分布式資料庫的查詢優化
指在執行分布式查詢時選擇查詢執行計劃的方法和關系運算符的實現演算法。根據系統環境的不同,查詢優化所使用的演算法也有所不同,通常分為遠程廣域網環境和高速區域網環境,其區別主要在網路的帶寬。對於一元運算符可以採用集中式資料庫中的查詢優化方法。而對於二元運算符,由於涉及場地間的數據傳輸,因此必須考慮通信代價。分布式查詢中常見的連接運算執行策略包括:
(1)半連接方法:利用半連接運算的轉換方法R∞S=(RµS)∞S。假設場地1和場地2上分別有關系R和關系S,首先在S上執行連接屬性上的投影並將結果傳輸至場地1,在場地1上執行關系R與投影的連接操作,再將結果傳輸至場地2與關系S執行連接操作。這種方法能夠降低執行連接運算時的網路通信代價,主要適用於帶寬較低的遠程廣域網路。
(2)枚舉法方法:指枚舉關系運算符的物理執行計劃,通過對比執行計劃的代價選擇執行演算法的方法。其中,連接運算符的物理執行計劃包括嵌套循環方法、哈希連接法和歸並連接法。枚舉法主要適用於以磁碟IO代價為主的高速區域網環境。
㈡ 資料庫的多表大數據查詢應如何優化
資料庫的多表大數據查詢應如何優化?
1.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
2.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。優化器簡悉將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。
3.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
4.in 和 not in 也要慎用,因為IN會使系統無法使用索引,而只能直接搜索表中的數據。如:
select id from t where num in(1,2,3)
對於連續的數值,能用 beeen 就不要用 in 了:
select id from t where num beeen 1 and 3
5.盡量避免在索引過的字元數據中,使用非打頭字母搜索。這也使得引擎無法利用索引。
見如下例子:
SELECT * FROM T1 WHERE NAME LIKE 『%L%』
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=』L』
SELECT * FROM T1 WHERE NAME LIKE 『L%』
即使NAME欄位建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所有數據逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作。
6.必要時強制查詢優化器使用某個索引,如在 where 子句中使用參數,也會導致全表掃描。因為sql只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未散罩知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
7.應盡量避免在 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())
即:任何對列的操作都將導致表掃描,它包括資料庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。
8.應盡量避免在where子句中對欄位進行沖咐鬧函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
select id from t where datediff(day,createdate,-11-30')=0--『2005-11-30』生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>=-11-30' and createdate<-12-1'
9.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
10.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。
11.很多時候用 exists是一個好的選擇:
elect num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
兩者產生相同的結果,但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定的表掃描或是索引掃描。
Java怎麼把資料庫的數據查詢
Statement stmt = null;
ResultSet rs = null;
String query = "select 列名 from 表名 where id=11 and fname='xx' order by 列名 desc limit 1";
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
if (rs.next()) {
result = rs.getInt("列名");
}
資料庫表內數據查詢
樓上的 拼寫錯誤,我來修正 ^^
select count(*) from 表名
如何查詢大資料庫數據存在
傳統資料庫處理大數據很困難吧,不建議使用傳統資料庫來處理大數據。
建議研究下,Hadoop,Hive等,可處理大數據。
如果有預算,可以使用一些商業大數據產品,國內的譬如永洪科技的大數據BI產品,不僅能高性能處理大數據,還可做數據分析。
當然如果是簡單的查詢,傳統資料庫如果做好索引,可能可以提高性能。
如何實現不同資料庫的數據查詢分頁
有兩種方法
方法1:
select 100 * from tbllendlist where fldserialNo not in ( select 300100 fldserialNo from tbllendlist order by fldserialNo ) order by fldserialNo
方法2:
SELECT TOP 100 * FROM tbllendlist WHERE (fldserialNo > (SELECT MAX(fldserialNo) FROM (SELECT TOP 300100 fldserialNo FROM tbllendlist ORDER BY fldserialNo) AS T)) ORDER BY fldserialNo
如何提高Oracle資料庫數據查詢的命中率
影響命中率的因素有四種:字典表活動、臨時段活動、回滾段活動、表掃描, 應用DBA可以對這四種因素進行分析,找出資料庫命中率低的症結所在。 1)字典表活動 當一個SQL語句第一次到達Oracle內核時資料庫對SQL語句進行分析,包含在查詢中的數據字典對象被分解,產生SQL執行路徑。如果SQL語句指向一個不在SGA中的對象?表或視圖,Oracle執行SQL語句到數據典中查詢有關對象的信息。數據塊從數據字典表被讀取到SGA的數據緩存中。由於每個數據字典都很小,因此,我們可緩存這些表以提高對這些表的命中率。但是由於數據字典表的數據塊在SGA中占據空間,當增加全部的命中率時,它們會降低表數據塊的可用空間, 所以若查詢所需的時間字典信息已經在SGA緩存中,那麼就沒有必要遞歸調用。 2)臨時段的活動 當用戶執行一個需要排序的查詢時,Oracle設法對內存中排序區內的所有行進行排序,排序區的大小由資料庫的init.ora文件的數確定。如果排序區域不夠大,資料庫就會在排序操作期間開辟臨時段。臨時段會人為地降低OLTP(online transaction processing)應用命中率,也會降低查詢進行排序的性能。如果能在內存中完成全部排序操作,就可以消除向臨時段寫數據的開銷。所以應將SORT_AREA_SIZE設置得足夠大,以避免對臨時段的需要。這個參數的具體調整方法是:查詢相關數據,以確定這個參數的調整。 select * from v$sysstat where name='sorts(disk)'or name='sorts(memory); 大部分排序是在內存中進行的,但還有小部分發生在臨時段, 需要調整 值,查看init.ora文件的 SORT_AREA_SIZE值,參數為:SORT_AREA_SIZE=65536;將其調整到SORT_AREA_SIZE=131072、這個值調整後,重啟ORACLE資料庫即可生效。 3)回滾段的活動 回滾段活動分為回滾活動和回滾段頭活動。對回滾段頭塊的訪問會降低應用的命中率, 對OLTP系統命中率的影響最大。為確認是否因為回滾段影響了命中率,可以查看監控輸出報表中的「數據塊相容性讀一重寫記錄應用」 的統計值,這些統計值是用來確定用戶從回滾段中訪問數據的發生次數。 4)表掃描 通過大掃描讀得的塊在數據塊緩存中不會保持很長時間, 因此表掃描會降低命中率。為了避免不必要的全表掃描,首先是根據需要建立索引,合理的索引設計要建立人對各種查詢的分析和預測上,筆者會在SQL優化中詳細談及;其次是將經常用到的表放在內存中,以降低磁碟讀寫次數。
如何優化資料庫提高資料庫的效率
1. SQL優化的原則是:將一次操作需要讀取的BLOCK數減到最低,即在最短的時間達到最大的數據吞吐量。
調整不良SQL通常可以從以下幾點切入:
? 檢查不良的SQL,考慮其寫法是否還有可優化內容
? 檢查子查詢 考慮SQL子查詢是否可以用簡單連接的方式進行重新書寫
? 檢查優化索引的使用
? 考慮資料庫的優化器
2. 避免出現SELECT * FROM table 語句,要明確查出的欄位。
3. 在一個SQL語句中,如果一個where條件過濾的資料庫記錄越多,定位越准確,則該where條件越應該前移。
4. 查詢時盡可能使用索引覆蓋。即對SELECT的欄位建立復合索引,這樣查詢時只進行索引掃描,不讀取數據塊。
5. 在判斷有無符合條件的記錄時建議不要用SELECT COUNT (*)和select 1 語句。
6. 使用內層限定原則,在拼寫SQL語句時,將查詢條件分解、分類,並盡量在SQL語句的最里層進行限定,以減少數據的處理量。
7. 應絕對避免在order by子句中使用表達式。
8. 如果需要從關聯表讀數據,關聯的表一般不要超過7個。
9. 小心使用 IN 和 OR,需要注意In集合中的數據量。建議集合中的數據不超過200個。
10. <> 用 < 、 > 代替,>用>=代替,<用<=代替,這樣可以有效的利用索引。
11. 在查詢時盡量減少對多餘數據的讀取包括多餘的列與多餘的行。
12. 對於復合索引要注意,例如在建立復合索引時列的順序是F1,F2,F3,則在where或order by子句中這些欄位出現的順序要與建立索引時的欄位順序一致,且必須包含第一列。只能是F1或F1,F2或F1,F2,F3。否則不會用到該索引。
13. 多表關聯查詢時,寫法必須遵循以下原則,這樣做有利於建立索引,提高查詢效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值條件(=)) and (table1的非等值條件) and (table2與table1的關聯條件) and (table2的等值條件) and (table2的非等值條件) and (table3與table2的關聯條件) and (table3的等值條件) and (table3的非等值條件)。
注:關於多表查詢時from 後面表的出現順序對效率的影響還有待研究。
14. 子查詢問題。對於能用連接方式或者視圖方式實現的功能,不要用子查詢。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。應該用如下語句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。
15. 在WHERE 子句中,避免對列的四則運算,特別是where 條件的左邊,嚴禁使用運算與函數對列進行處理。比如有些地方 substring 可以用like代替。
16. 如果在語句中有not in(in)操作,應考慮用not exists(exists)來重寫,最好的辦法是使用外連接實現。
17. 對一個業務過程的處理,應該使事物的開始與結束之間的時間間隔越短越好,原則上做到資料庫的讀操作在前面完成,資料庫寫操作在後面完成,避免交叉。
18. 請小心不要對過多的列使用列函數和order by,group by等,謹慎使用disti軟體開發t。
19. 用union all 代替 union,資料庫執行union操作,首先先分別執行union兩端的查詢,將其放在臨時表中,然後在對其進行排序,過濾重復的記錄。
當已知的業務邏輯決定query A和query B中不會有重復記錄時,應該用union all代替union,以提高查詢效率。
數據更新的效率
1. 在一個事物中,對同一個表的多個insert語句應該集中在一起執行。
2. 在一個業務過程中,盡量的使insert,update,delete語句在業務結束前執行,以減少死鎖的可能性。
資料庫物理規劃的效率
為了避免I/O的沖突,我們在設計資料庫物理規劃時應該遵循幾條基本的原則(以ORACLE舉例):
?? table和index分離:table和index應該分別放在不同的tablespace中。
?? Rollback Segment的分離:Rollback Segment應該放在獨立的Tablespace中。
?? System Tablespace的分離:System Tablespace中不允許放置任何用戶的object。(mssql中primary filegroup中不允許放置任何用戶的object)
?? Temp Tablesace的分離:建立單獨的Temp Tablespace,並為每個user指定default Temp Tablespace
??避免碎片:但segment中出現大量的碎片時,會導致讀數據時需要訪問的block數量的增加。對經常發生DML操作的segemeng來說,碎片是不能完全避免的。所以,我們應該將經常做DML操作的表和很少發生變化的表分離在不同的Tablespace中。
當我們遵循了以上原則後,仍然發現有I/O沖突存在,我們可以用數據分離的方法來解決。
?? 連接Table的分離:在實際應用中經常做連接查詢的Table,可以將其分離在不同的Taclespace中,以減少I/O沖突。
?? 使用分區:對數據量很大的Table和Index使用分區,放在不同的Tablespace中。
在實際的物理存儲中,建議使用RAID。日誌文件應放在單獨的磁碟中。
資料庫的查詢優化演算法
給出你的查詢,然後才可以對其進行優化
如何優化SQL Server資料庫查詢
如果你的查詢比較固定,並且查詢的條件區別度較高,可以建立相應的索引。
其他的一些規則,比如使用exists代替 in都可以試試
查詢速度慢的原因很多,常見如下幾種:
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應。
3、沒有創建計算列導致查詢不優化。
4、內存不足
5、網路速度慢
6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷)
8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優化
可以通過如下方法來優化查詢 :
1、把數據、日誌、索引放到不同的I/O設備上,增加讀取速度,以前可以將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提高I/O越重要.
2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)
3、升級硬體
4、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該盡量小,使用位元組數小的列建索引好(參照索引的創建),不要對有限的幾個值的欄位建單一索引如性別欄位
5、提高網速;
6、擴大伺服器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。配置虛擬內存:虛擬內存大小應基於計算機上並發運行的服務進行配置。運行 Microsoft SQL Server? 2000 時,可考慮將虛擬內存大小設置為計算機中安裝的物理內存的 1.5 倍。如果另外安裝了全文檢索功能,並打算運行 Microsoft 搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置為至少是計算機中安裝的物理內存的 3 倍。將 SQL Server max server memory 伺服器配置選項配置為物理內存的 1.5 倍(虛擬內存大小設置的一半)。
7、增加伺服器 CPU個數; 但是必須明白並行處理串列處理更需要資源例如內存。使用並行還是串列程是MsSQL自動評估選擇的。單個任務分解成多個任務,就可以在處理器上運行。例如耽擱查詢的排序、連接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載情況決定最優的並行等級,復雜的需要消耗大量的CPU的查詢最適合並行處理。但是更新操作Update,Insert, Delete還不能並行處理。
8、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查詢時,查詢耗時和欄位值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對於欄位的值很長的建全文索引。
9、DB Server 和APPLication Server 分離;OLTP和OLAP分離
10、分布式分區視圖可用於實現資料庫伺服器聯合體。聯合體是一組分開管理的伺服器,但它們相互協作分擔系統的處理負荷。這種通過分區數據形成資料庫伺服器聯合體的機制能夠擴大一組伺服器,以支持大型的多層 Web 站點的處理需要。有關更多信息,參見設計聯合資料庫伺服器。(參照SQL幫助文件'分區視圖')
a、在實現分區視圖之前,必須先水平分區表
b、在創建成員表後,在每個成員伺服器上定義一個分布式分區視圖,並且每個視圖具有相同的名稱。這樣,引用分布式分區視圖名的查詢可以在任何一個成員伺服器上運行。系統操作如同每個成員伺服器上都有一個原始表的復本一樣,但其實每個伺服器上只有一個成員表和一個分布式分區視圖。數據的位置對應用程序是透明的。
11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的資料庫不要設置資料庫自動增長,它會降低伺服器的性能。在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查詢計劃的過程是這樣的:
1、 查詢語句的詞法、語法檢查
2、 將語句提交給DBMS的查詢優化器
3、 優化器做代數優化和存取路徑的優化
4、 由預編譯模塊生成查詢規劃
5、 然後在合適的時間提交給系統處理執行
6、 最後將執行結果返回給用戶其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小為8K(8060)位元組,8個頁面為一個盤區,按照B樹存放。
12、Commit和rollback的區別 Rollback:回滾所有的事物。 Commit:提交當前的事物. 沒有必要在動態SQL里寫事物,如果要寫請寫在外面如: begin tran exec(@s) mit trans 或者將動態SQL 寫成函數或者存儲過程。
13、在查詢Select語句中用Where字句限制返回的行數,避免表掃描,如果返回不必要的數據,浪費了伺服器的I/O資源,加重了網路的負擔降低性能。如果表很大,在表掃描的期間將表鎖住,禁止其他的聯接訪問表,後果嚴重。
14、SQL的注釋申明對執行沒有任何影響
15、盡可能不使用游標,它佔用大量的資源。如果需要row-by-row地執行,盡量採用非游標技術,如:在客戶端循環,用臨時表,Table變數,用子查詢,用Case語句等等。游標可以按照它所支持的提取選項進行分類: 只進 必須按照從第一行到最後一行的順序提取行。FETCH NEXT 是唯一允許的提取操作,也是默認方式。可滾動性可以在游標中任何地方隨機提取任意行。游標的技術在SQL2000下變得功能很強大,他的目的是支持循環。有四個並發選項 READ_ONLY:不允許通過游標定位更新(Update),且在組成結果集的行中沒有鎖。 OPTIMISTIC WITH valueS:樂觀並發控制是事務控制理論的一個標准部分。樂觀並發控制用於這樣的情形,即在打開游標及更新行的間隔中,只有很小的機會讓第二個用戶更新某一行。當某個游標以此選項打開時,沒有鎖控制其中的行,這將有助於最大化其處理能力。如果用戶試圖修改某一行,則此行的當前值會與最後一次提取此行時獲取的值進行比較。如果任何值發生改變,則伺服器就會知道其他人已更新了此行,並會返回一個錯誤。如果值是一樣的,伺服器就執行修改。選擇這個並發選項OPTIMISTIC WITH ROW VERSIONING:此樂觀並發控制選項基於行版本控制。使用行版本控制,其中的表必須具有某種版本標識符,伺服器可用它來確定該行在讀入游標後是否有所更改。在 SQL Server 中,這個性能由 timestamp 數據類型提供,它是一個二進制數字,表示資料庫中更改的相對順序。每個資料庫都有一個全局當前時間戳值:@@DBTS。每次以任何方式更改帶有 timestamp 列的行時,SQL Server 先在時間戳列中存儲當前的 @@DBTS 值,然後增加 @@DBTS 的值。如果某 個表具有 timestamp 列,則時間戳會被記到行級。伺服器就可以比較某行的當前時間戳值和上次提取時所存儲的時間戳值,從而確定該行是否已更新。伺服器不必比較所有列的值,只需比較 timestamp 列即可。如果應用程序對沒有 timestamp 列的表要求基於行版本控制的樂觀並發,則游標默認為基於數值的樂觀並發控制。 SCROLL LOCKS 這個選項實現悲觀並發控制。在悲觀並發控制中,在把資料庫的行讀入游標結果集時,應用程序將試圖鎖定資料庫行。在使用伺服器游標時,將行讀入游標時會在其上放置一個更新鎖。如果在事務內打開游標,則該事務更新鎖將一直保持到事務被提交或回滾;當提取下一行時,將除去游標鎖。如果在事務外打開游標,則提取下一行時,鎖就被丟棄。因此,每當用戶需要完全的悲觀並發控制時,游標都應在事務內打開。更新鎖將阻止任何其它任務獲取更新鎖或排它鎖,從而阻止其它任務更新該行。然而,更新鎖並不阻止共享鎖,所以它不會阻止其它任務讀取行,除非第二個任務也在要求帶更新鎖的讀取。滾動鎖根據在游標定義的 Select 語句中指定的鎖提示,這些游標並發選項可以生成滾動鎖。滾動鎖在提取時在每行上獲取,並保持到下次提取或者游標關閉,以先發生者為准。下次提取時,伺服器為新提取中的行獲取滾動鎖,並釋放上次提取中行的滾動鎖。滾動鎖獨立於事務鎖,並可以保持到一個提交或回滾操作之後。如果提交時關閉游標的選項為關,則 COMMIT 語句並不關閉任何打開的游標,而且滾動鎖被保留到提交之後,以維護對所提取數據的隔離。所獲取滾動鎖的類型取決於游標並發選項和游標 Select 語句中的鎖提示。鎖提示 只讀 樂觀數值 樂觀行版本控制 鎖定無提示 未鎖定 未鎖定 未鎖定 更新 NOLOCK 未鎖定 未鎖定未鎖定 未鎖定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 錯誤 更新 更新 更新 TABLOCKX 錯誤 未鎖定 未鎖定更新其它 未鎖定 未鎖定 未鎖定 更新 *指定 NOLOCK 提示將使指定了該提示的表在游標內是只讀的。
16、用Profiler來跟蹤查詢,得到查詢所需的時間,找出SQL的問題所在; 用索引優化器優化索引
17、注意UNion和UNion all 的區別。UNION all好
18、注意使用DISTINCT,在沒有必要時不要用,它同UNION一樣會使查詢變慢。重復的記錄在查詢里是沒有問題的
19、查詢時不要返回不需要的行、列
20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT來限制查詢消耗的資源。當評估查詢消耗的資源超出限制時,伺服器自動取消查詢,在查詢之前就扼殺掉。 SET LOCKTIME設置鎖的時間
21、用select 100 / 10 Percent 來限制用戶返回的行數或者SET ROWCOUNT來限制操作的行
22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因為他們不走索引全是表掃描。也不要在Where字句中的列名加函數,如Convert,substring等,如果必須用函數的時候,創建計算列再創建索引來替代.還可以變通寫法:Where SUBSTRING(firstname,1,1) = 'm'改為Where firstname like 'm%'(索引掃描),一定要將函數和列名分開。並且索引不能建得太多和太大。NOT IN會多次掃描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 來替代,特別是左連接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,現在2000的優化器能夠處理了。相同的是IS NULL,"NOT", "NOT EXISTS", "NOT IN"能優化她,而"<>"等還是不能優化,用不到索引。
23、使用Query Analyzer,查看SQL語句的查詢計劃和評估分析是否是優化的SQL。一般的20%的代碼占據了80%的資源,我們優化的重點是這些慢的地方。
24、如果使用了IN或者OR等時發現查詢沒有走索引,使用顯示申明指定索引: Select * FROM PersonMember (INDEX = IX_Title) Where processid IN ('男','女')
25、將需要查詢的結果預先計算好放在表中,查詢的時候再Select。這在SQL7.0以前是最重要的手段。例如醫院的住院費計算。
26、MIN() 和 MAX()能使用到合適的索引。
27、資料庫有一個原則是代碼離數據越近越好,所以優先選擇Default,依次為Rules,Triggers, Constraint(約束如外健主健CheckUNIQUE……,數據類型的最大長度等等都是約束),Procere.這樣不僅維護工作小,編寫程序質量高,並且執行的速度快。
28、如果要插入大的二進制值到Image列,使用存儲過程,千萬不要用內嵌Insert來插入(不知JAVA是否)。因為這樣應用程序首先將二進制值轉換成字元串(尺寸是它的兩倍),伺服器受到字元後又將他轉換成二進制值.存儲過程就沒有這些動作: 方法:Create procere p_insert as insert into table(Fimage) values (@image), 在前台調用這個存儲過程傳入二進制參數,這樣處理速度明顯改善
㈢ 大數據的分布式資料庫的發展趨勢如何(分布式資料庫的優點)
現在大數據是一個十分火熱的技術,這也使得很多人都開始關注大數據的任何動態,因為大數據在某種程度上來說能夠影響我們的生活。在這篇文章中我們就給大家介紹一下大數據的分布式資料庫的發展趨勢,希望這篇文章能夠幫助大家更好理解大數據的分布式資料庫的發展趨勢。
其實不論是Hadoop還是分布式資料庫,技術體繫上兩者都已經向著計算存儲層分離的方式演進。對於Hadoop來說這一趨勢非常明顯,HDFS存儲與YARN調度計算的分離,使得計算與存儲均可以按需橫向擴展。而分布式資料庫近年來也在遵循類似的趨勢,很多資料庫已經將底層存儲與上層的SQL引擎進粗芹行剝離。傳統的XML資料庫、OO資料庫、與pre-RDBMS正在消亡;新興領域文檔類資料庫、圖資料庫、Table-Style資料庫與Multi-Model資料庫正在擴大自身影響;傳統關系型資料庫、列存儲資料庫、內存分析型資料庫正在考慮轉型。可以看到,從技術完整性與成熟度來看,Hadoop確實還處於相對早期的形態。直到今天,很多技術在很多企業應用中需要大量的手工調優才能夠勉強運行。同時,Hadoop的主要應用場景一直以來面向批處理分析型業務,傳統資料庫在線聯機處理部分不是其主要的發展方向。同時Hadoop技術由於開源生態體系過於龐大,同時參與改造的廠商太多,使得用戶很難完全熟悉整個體系,這一方面大大增加了開發的復雜度,提升了用戶使用的難度,另一方面則是各個廠商之間維護不同版本,使得產品的發展方向可能與開源版本差別逐漸加大。
而分布式資料庫領域經歷了幾十年的磨練,傳統RDBMS的MPP技術早已經爐火純青,在分類眾多的分布式資料庫中,其主要發展方向基本可以分為「分布式聯機資料庫」與「分布式分析型資料庫」兩種。對比Hadoop與分布式資料庫可以看出,Hadoop的產品發展方向定位,與分布式資料庫中列存儲數據戚棗庫相當重疊而在高並發聯機交易場景,在Hadoop中除了HBase能夠勉強沾邊以外,分布式資料庫則占據絕對的優勢。目前,從Hadoop行業的發展來看,很多廠商而是將其定位改變為數據科學與機器學習服務商。因此,從商業模式上看以Hadoop分銷的商業模式基本已經宣告結束,用戶已經體驗到維護整個Hadoop平台的困難而不願被強迫購買整個平台。大量用戶更願意把原來Hadoop的部件拆開靈活使用,為使用場景岩仔畢和結果買單,而非平台本身買單。另外一個細分市場——非結構化小文件存儲,一直以來都是對象存儲、塊存儲,與分布式文件系統的主戰場。如今,一些新一代資料庫也開始進入該領域,可以預見在未來的幾年中,小型非結構化文件存儲也可能成為具備多模數據處理能力的分布式資料庫的戰場之一。
我們在這篇文章中給大家介紹了很多有關大數據分布資料庫的發展前景,通過這篇文章我們不難發現資料庫的發展是一個極其重要的內容,只有搭建分布式資料庫,大數據才能夠更好地為我們服務。
㈣ 50種方法巧妙優化你的SQLServer資料庫(一)
查詢速度慢的原因很多,常見如下幾種:
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應。
3、沒有創建計算列導致查詢不優化。
4、內存不足
5、網路速度慢
6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷)
8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優化
可以通過如下方法來優化查詢 :
1、把數據、日誌、索引放到不同的I/O設備上,增加讀取速度,以前可以將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提高I/O越重要.
2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)
3、升級硬體
4、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(是使用默認值0)。索引應該盡量小,使用位元組數小的列建索引好(參照索引的創建),不要對有限的幾個值的欄位建單一索引如性別欄位
5、提高網速;
6、擴大伺服器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。配置虛擬內存:虛擬內存大小應基於計算機上並發運行的服務進行配置。運行 Microsoft SQL Server? 2000 時,可考慮將虛擬內存大小設置為計算機中安裝的物理內存的 1.5 倍。如果另外安裝了全文檢索功能,並打算運行 Microsoft 搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置為至少是計算機中安裝的物理內存的 3 倍。將 SQL Server max server memory 伺服器配置選項配置為物理內存的 1.5 倍(虛擬內存大小設置的一半)。
7、增加伺服器CPU個戚鎮陵數;但是必須明白並行處理串列處理更需要資源例如內存。使用並行還是串列程是MsSQL自動評估選擇的。單個任務分解成多個任務,就可以在處理器上運行。例如耽擱查詢的排序、連接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載情況決定的並行等級,復雜的需要消耗大量的CPU的查詢最適合並行處理。但是更新操作UPDATE,INSERT,DELETE還不能並行處理。
8、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全旅手文索引,耗空間。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查詢時,查詢耗時和欄位值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對於欄位的值很長的建全文索引。
9、DB Server 和APPLication Server 分離;OLTP和OLAP分離
10、分布式分區視圖可用於實現資料庫伺服器聯合體。聯合體是一組分開管理的伺服器,但它們相互協作分擔系統的處理負荷。這種通過分區數據形成資料庫伺服器聯合體的機制能夠擴大一組伺服器,以支持大型的多層 Web 站點的處理需要。有關更多信息,參見設計聯合資料庫伺服器。(參照SQL幫助文件'分區視圖')
a、在實現分區視圖之前,必須先水平分區表
b、在創建成員表後,在每個成員伺服器上定義一個分布式分區視圖,並且每個視圖具有相同的名稱。這樣,引用分布式分區視圖名的查詢可以在任何一個成員伺服器上運行。系統操作如同每個成員伺服器上都有一個原始表的復本一樣,但其實每個伺服器上只有一個成員表和一個分布式分區視圖。數據的位置對應用程高戚序是透明的。
11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的資料庫不要設置資料庫自動增長,它會降低伺服器的性能。 在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查詢計劃的過程是這樣的:
1、 查詢語句的詞法、語法檢查
2、 將語句提交給DBMS的查詢優化器
3、 優化器做代數優化和存取路徑的優化
4、 由預編譯模塊生成查詢規劃
5、 然後在合適的時間提交給系統處理執行
6、 最後將執行結果返回給用戶其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小為8K(8060)位元組,8個頁面為一個盤區,按照B樹存放。
12、Commit和rollback的區別 Rollback:回滾所有的事物。 Commit:提交當前的事物. 沒有必要在動態SQL里寫事物,如果要寫請寫在外面如: begin tran exec(@s) commit trans 或者將動態SQL 寫成函數或者存儲過程。
13、在查詢Select語句中用Where字句限制返回的行數,避免表掃描,如果返回不必要的數據,浪費了伺服器的I/O資源,加重了網路的負擔降低性能。如果表很大,在表掃描的期間將表鎖住,禁止其他的聯接訪問表,後果嚴重。
14、SQL的注釋申明對執行沒有任何影響
㈤ NewSQL分布式資料庫發展策略討論
作者 石默研
本文對新一代NewSQL分布式資料庫發展策略中的普遍困擾進行討論,包括雲原生(Cloud Native)與本地部署(On Premise)、HTAP進展方向、分布式與單機需求等分布式資料庫商業與技術發展中難以決策的問題。
1. 困擾
分布式NewSQL資料庫近年來蓬勃興起,其原因顯而易見:切中了業務與數據量不斷增長的用戶對關系型資料庫RDBMS需求,這在傳統RDBMS到大數據的發展階段中,有相當一段時間是空白。同時,隨著互聯網技術的不斷發展與普及,用雲計算模式滿足IT需求似乎已經成為未來 社會 產業互聯網發展的明確趨勢,也就是說,有一種共識:不久的將來,絕大多數產業的IT服務是從公共的、行業的或者私有的、混合的雲計算中心提供的。這一共識又帶來了雲原生(Cloud Native)概念與技術的興起,而分布式NewSQL資料庫自然也應該是雲原生的,這決定了其相當多的產品設計決策應以符合這一趨勢為原則。然而,在當今的現實中,滿足業務與數據量不斷增長的RDBMS需求的用戶,與雲原生的用戶,除了互聯網企業外,大多數情況下,並不重合,需要On-Premise部署的用戶仍然佔有很大比重,這就帶來了第一個困擾:雲原生(Cloud Native)與本地部署(On Premise)對產品發展要求的矛盾。
另一個困擾,是關於HTAP,即交易與分析混合負載。HTAP是當今非常火的一個概念與技術,在交易庫上直接進行分析,而不再是將「數據從交易庫搬下來,挪到另一個資料庫中去」這樣的繁瑣過程。可以毫不誇張的說: 歷史 上規模性企業IT復雜度的相當一部分,都來自於「搬數據」,這導致了數據採集、實時採集、全增量合並、數據傳輸、數據載入、數據建模、數據質量、數據標准、企業級元數據管理等繁雜多樣的技術環節的產生,導致了企業數據分布、數據流向、數據模型、主數據、基礎數據平台、ODS/數據倉庫/數據集市、數據治理等復雜的數據架構設計優化領域,導致了由於多系統大規模數據搬遷而帶來的如數據交換平台之類的復雜調度工程......。咋眼一看,感覺該企業的數據技術好厲害,相關各領域的技術產品好豐富,技術人員的相關技能也好受歡迎。但如果在交易庫就能直接滿足分析需求而不影響生產效能的話,這些復雜高級的技術環節不都成了「自己給自己造了一座山,還說自己爬的好辛苦」?然而,現實卻是,問題並不這么簡單,除了在交易庫中進行分析會影響業務效能外,還有很多原因導致這一現象產生:交易庫並不需要存儲那麼長的 歷史 數據,而分析往往是需要建立在大量 歷史 數據之上的;交易庫的模型往往並不適合分析需求,多數情況下需要重要建模,如非常流行且價值不菲的各行業數倉主題模型;用於交易的OLTP資料庫與用於分析的OLAP資料庫,其技術體系完全不同;以及大型企業已固化的內部業務結構並沒有留給交易/分析整合可實施的可行空間......等等。由於, 歷史 積累的企業級數據體系相當復雜,HTAP的發明者迄今為止都沒有系統表達完全替代數據分析需求、自頂而下重構企業數據體系的架構級策略,而是將產品重點定位在技術優化層面:在交易庫上直接完成實時統計分析,滿足高並發需求且不影響業務效能;或者是為實時分析統計/查詢而建設的數據服務中間平台。然而,即使是暫時沒有這種策略性的意向,在面向AP的產品具體研發中,又會發現明確的界限確實不好把握,隨著一個個具體功能的不斷完善,似乎假以時日,技術上也不是沒有完全替代純OLAP平台的可能性。那麼,HTAP究竟如何定位呢?
再者就是規模化的分布式需求,與小規模的單機資料庫需求(這里指邏輯上的單機)之間的矛盾:分布式資料庫,自然而然是要應對規模化的數據管理需求的,長尾的小規模需求當然不應在產品設計考慮之列,同時,大炮轟蒼蠅經常還打不好;然而,分布式NewSQL資料庫又應該是雲原生的,如果把雲原生的業務含義理解為「全自助」,它應該以支持什麼樣的需求為主呢?現實看來,小規模長尾業務對雲原生資料庫的需求最起碼應該是占據相當大的比重的。顯而易見,如果是大規模的數據管理需求,即使是部署在雲上,DBPaaS的「全自助」是其核心需求嗎?這種規模化的業務,如果是雲上的On-Premise又需要做出哪些方面的改變?從互聯網與雲計算發展的 歷史 來看,「雲自助」,其最核心的商業動機當然包括給用戶側的運維帶來了方便,但更重要的可能是給雲服務運營商應對海量長尾客戶的安裝與運維帶來了極大的成本優勢。這正如銀行的小微及個人消費貸款都要走互聯網線上模式,而重客、大客甚至中小企業信貸仍然是以線下為主的策略一樣,本質是成本問題,而不是客戶方便性問題。於是,矛盾顯而易見:分布式是面向規模客戶的,起碼是中、大型客戶,而雲原生卻有可能、最起碼相當一段時間內是要以長尾客戶為主要服務對象的。
以上困擾實質上,都涉及到了NewSQL分布式資料庫的產品發展策略問題。
2. 討論
問題是客觀而又普遍的,但分析與應對策略往往包含主觀因素:人們的一個決定與決策,很多情況下並不由嚴格推理而來,而是心中已經有一個答案,再來找理由支持它。這里的討論或許也並不能例外。
首先,來看看Cloud Native與On Premise。雲原生本應是資料庫即服務,然而目前真正有規模化數據增長需求的NewSQL應用相當多的情況下卻是付費On Premise與免費On Premise區別,很多互聯網企業的應用也可能只是部署在雲基礎設施上而已,真正的雲原生更多是一些實驗性、嘗試性的需求。但雲原生資料庫在公有雲、行業雲以及大型私有雲上已經逐漸在形成一種意識上的共識,其商業前景不可限量。也就是說,未來的數字化轉型進程中,產業互聯網的資料庫部署,會逐漸向雲基礎設施遷移,長在雲上。它可能是公有雲,也可能是行業雲,也可能是私有雲,它們都是被定義為雲原生NewSQL資料庫的市場范圍。當然,肯定還會有相當一部分資料庫長在雲下,這也不用糾結,將其排除在雲原生市場戰略目標之外即可,就是說,不需要考慮這部分客戶需求對產品規劃的影響,因為前一部分的份額已經足夠大了。這樣看來,以雲原生為目標進行產品規劃的邏輯沒有問題,不過,還是要明確一點:長在雲上的資料庫是不是一定符合我們對「雲原生」的既有理解?這里認為,即使未來,在雲上形成了產業互聯網資料庫市場的主體,需要「全自助」的資料庫即服務可能也是以面向長尾客戶最為迫切、必不可少並且是核心本質,而對中大型以上的需求,「全自助」的意義相對有限,同時比較而言商業模式的轉變或者更關鍵些。那麼,如果是以「長在雲上」為市場目標,似乎可以將其定義為「廣義的雲原生」,同時,只要是「長在雲上」,那麼「雲原生」概念中高彈性、高可用、低成本、快速迭代、存算分離等技術優勢也都能方便獲得。而對「雲原生」策略中「雲原生」一詞的理解不同,對產品規劃決策的影響也應該有所不同:一是目前被認為是On Premise的客戶需求,或許也就是未來「雲原生」主體市場的需求;二是NewSQL資料庫關於雲原生服務的產品策劃,對用戶側「自助」水平的決策或許可以更靈活實用。高水平自助確實可以減輕客戶對IT的依賴程度,但這里認為,雲原生與用戶自行在雲上購買資源進行On-Premise部署相比,最關鍵的價值在於商業模式的改變,能自助多少,不一定是最重要的,因為成為雲服務商後,運營運維的工作只會更多,責任可能會更大,甚至有時連IaaS的運維也需要PaaS服務商兜底。但從一個個客戶的本地服務,變成集中化雲服務,就已經是本質性的模式轉變了。總之,需要就事論事,回到原點,仔細分析後決策,而不是用概念教條的判斷,因為概念本身的定義並不見得准確對應實際的業務需求。
再來看看HTAP,對這個問題,正如在其它文章中表達過的一樣,本文的觀點較為明確。一是隨著計算能力與架構的升級,從技術上講,AP與TP的界限會越來越模糊;另外特別是在雲原生的新世界裡,資料庫的這一特性又猶為重要,因為雲原生的重要作用之一就是要讓客戶盡量擺脫對IT運維的依賴,將越來越多的精力集中到自己的業務發展上來;同時端到端的能力提升對雲原生商業模式的貫徹也至關重要(需要仔細分析下目前DBPaaS的技術要求是否完全符合這一原點的、本質性的動力),過去與純OLAP資料庫的優勢比較糾結在這里也可以得到正面支持;再者,既然架構上已經走向了AP,就很難做到在產品規劃上時刻釐清純AP與混合負載的需求後,再將前者排除在外。於是,以「混合負載滿足部分AP需求」應該是由於投入與階段性市場策略導致的階段性產品規劃,而長遠來講,以一套技術架構滿足大多數需求,應該是雲原生NewSQL資料庫的追求。
接下來,就是關於規模化分布式與小規模單機需求的矛盾了。現在看來,經過上面的討論,這一點已經不是什麼問題了:因為「長在雲上」、從分散服務向集中服務的商業模式轉變就是指廣義的雲原生,而不一定要以小微的、迫切需要全自助的長尾為主流,那麼,雲原生NewSQL資料庫仍然應以規模化分布式為其主體的需求方向,而小規模單機則暫時可以不做為重點來考慮。
最後指出一點,希望也能引發進一步的思考:我們所批判的主機,也聲稱自己是分布式架構,暫且不論其是否客觀,但在現實中主機需要被替代的核心問題並不是有沒有分布式,而是:一、擴展不靈活帶來成本問題:「我只需要擴展一個節點,你卻讓我再買一台主機」;二、不自主可控;三、往往是軟硬體結合的設計策略,包括內存、網路、存儲與IO上的軟硬融合設計,而這一點,是否需要雲原生資料庫從廣義的定義出發進行學習參考,也是需要進一步討論的。
㈥ 分布式資料庫查詢優化寫這個論文的話有推薦的書嗎
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找到的關於分布式資料庫並且評價較高的教材。不過這本還沒排上讓我讀的行程,不知內容如何。