❶ 對於相同的SQL語句,Statement對象只會對其編譯執行一次嗎
一次編譯,多次執行
❷ sql調優的幾種方式
你好,
SQL優化的一些方法
1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描。
3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描。
5.in 和 not in 也要慎用,否則會導致全表掃描,
6.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'
7.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。
8.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。
9.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
10.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。
❸ SQL注入預編譯是絕對安全的么
沒錯,存儲過程的確能有效解決SQL注入式攻擊!
理由:因為通常的資料庫訪問方法,都是把訪問數據表的權利賦給程序,注入式攻擊者通過你的程序漏洞判斷和獲得更多的信息,並利用你賦給程序的訪問和操作權,輕者破壞本表數據,重者毀壞整個資料庫!
使用存儲過程則完全不同,程序中不必再有SQL語句,因此程序不必擁有訪問和操作數據表的許可權,只把運行存儲過程的許可權交給程序。程序只是把參數和存儲過程名告訴資料庫,然後等待結果就行了,注入式攻擊者要想運行存儲過程,就必需猜對存儲過程名,並且還要猜對參數個數、參數名和參數的順序,同時滿足這些條件太難了,即便所以條件都滿足,那麼攻擊者也只是往數據表裡存了一組合法數據而已,不會導致其它破壞。
因此,通過存儲過程能從根本上解決注入式攻擊。
需要注意的是,使用存儲過程後,應把原來交給程序的操作數據表的許可權收回,否則就象為了防小偷鎖了前門,卻開著後門一樣。
❹ 預編譯SQL語句的使用問題
void setString(int parameterIndex,
String x)
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 對象包含語句 "UPDATE table4 SET m = ? WHERE x = ?",它已發送給DBMS,並為執行作好了准備。
2、傳遞 IN 參數
在執行 PreparedStatement 對象之前,必須設置每個 ? 參數的值。這可通過調用 setXXX 方法來完成,其中 XXX 是與該參數相應的類型。例如,如果參數具有java 類型 long,則使用的方法就是 setLong。setXXX 方法的第一個參數是要設置的參數的序數位置,第二個參數是設置給該參數的值。例如,以下代碼將第一個參數設為 123456789,第二個參數設為 100000000:
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
一旦設置了給定語句的參數值,就可用它多次執行該語句,直到調用clearParameters 方法清除它為止。在連接的預設模式下(啟用自動提交),當語句完成時將自動提交或還原該語句。
如果基本資料庫和驅動程序在語句提交之後仍保持這些語句的打開狀態,則同一個 PreparedStatement 可執行多次。如果這一點不成立,那麼試圖通過使用PreparedStatement 對象代替 Statement 對象來提高性能是沒有意義的。
利用 pstmt(前面創建的 PreparedStatement 對象),以下代碼例示了如何設置兩個參數佔位符的值並執行 pstmt 10 次。如上所述,為做到這一點,資料庫不能關閉 pstmt。在該示例中,第一個參數被設置為 "Hi"並保持為常數。在 for 循環中,每次都將第二個參數設置為不同的值:從 0 開始,到 9 結束。
pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}
❺ 如何進行SQL性能優化
SQL Server資料庫查詢速度慢的原因有很多,常見的有以下幾種:
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樹存放。
❻ Statement和PrepareStatement有什麼區別
Statement用於執行靜態sql語句,在執行時,必須指定一個事先准備好的sql語句。
PrepareStatement是預編譯的sql語句對象,sql語句被預編譯並保存在對象中。被封裝的sql語句代表某一類操作,語句中可以包含動態參數「?」,在執行時可以為「?」動態設置參數值。
使用PrepareStatement對象執行sql時,sql被資料庫進行解析和編譯,然後被放到命令緩沖區,每當執行同一個PrepareStatement對象時,它就會被解析一次,但不會被再次編譯。在緩沖區可以發現預編譯的命令,並且可以重用。
PrepareStatement可以減少編譯次數提高資料庫性能。
❼ sql server 2000預編譯問題
預編譯需要設置c編譯器和引用lib的環境變數。給你一個教程看看。
http://www.ccf-dbs.org.cn/idke/xfmeng/course/Introction%20to%20Database%20System/2005ppt/exp3(3)tian%20chao%20huangwei.doc
❽ SQL注入的防範 使用預編譯語句
預編譯語句PreparedStatement是 java.sql中的一個介面,繼承自Statement 介面。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS,由 DBMS先進行編譯後再執行。而預編譯語句和Statement不同,在創建PreparedStatement對象時就指定了SQL語句,該語句立即發送給DBMS進行編譯,當該編譯語句需要被執行時,DBMS直接運行編譯後的SQL語句,而不需要像其他SQL語句那樣先將其編譯。引發SQL注入的根本原因是惡意用戶將SQL指令偽裝成參數傳遞到後端資料庫執行。作為一種更為安全的動態字元串的構建方法,預編譯語句使用參數佔位符來替代需要動態傳入的參數,這樣攻擊者無法改變SQL語句的結構,SQL語句的語義不會發生改變,即便用戶傳入類似於前面' or '1'='1這樣的字元串,資料庫也會將其作為普通的字元串來處理。
❾ SQL資料庫(簡單)簡答題
Microsoft SQL Server 2000 簡答題及其答案
1.在安裝SQL Server 2000時,「僅客戶端工具」、「伺服器和客戶端工具」及「僅連接」等安裝定義有什麼差別?
答:僅客戶端工具:僅安裝客戶端工具。伺服器和客戶端工具:同時安裝伺服器和客戶端工具。僅連接:僅安裝客戶端連接。
2.一個資料庫中包含哪幾種文件?
答:主資料庫文件,輔助數據文件,事務日誌文件。
3.事務文件和數據文件分開存放有什麼好處?
答:因為利用事務日誌備份可以將資料庫恢復到特定的即時點(如輸入不想要的數據之前的那一點)或故障發生點。在媒體恢復策略中應考慮利用事務日誌備份。
4.什麼是批處理?使用批處理有何限制?
答:包含一個或多個T-SQL語句的組,從應用程序將一次性發送到SQL Server執行,SQL Server批處理語句作為整體編譯成一個可執行單元。
限制:如不能夠在同一個批處理中更改表,然後引用新列。如在一個批處理程序中,有兩條語句。第一條語句用來在一張表中插入一個欄位,如在User表中插入員工的出生年月;第二條語句則用來引用這個列,如根據身份證號碼來推算出這個員工的出身年月並把這個值賦值給這個第一條語句創建的出身年月欄位。
5.數據檢索時,COMPUTE和COMPUTE BY產生的結果有何不同?
答:Compute:第一個為明細行 第二個為聚合函數的合計 Compute by:第一個為明細行第二個為聚合函數的小計
6.什麼是索引?索引分為哪兩種?各有什麼特點?
答:1、資料庫中的索引與書籍中的目錄類似。在一本書中,利用目錄可以快速查找所需信息,無須閱讀整本書。在資料庫中,索引使資料庫程序無須對整個表進行掃描,就可以在其中找到所需數據。 2、聚集索引和非聚集索引。
3、聚集索引的特點:行的物理位置和行在索引中的位置是相同的,每個表只能有一個聚集索引,聚集索引的平均大小大約為表大小的5%左右。
非聚集索引特點:若未指定索引類型,則默認為非聚集索引,葉節點頁的次序和表的物理存儲次序不同,每個表最多可以有249個非聚集索引,在非聚集索引創建之前創建聚集索引。
7.創建索引有什麼優點和缺點?
答:優點:索引在資料庫中的作用類似於目錄在書籍中的作用,用來提高查找信息的速度。
使用索引查找數據,無需對整表進行掃描,可以快速找到所需數據。
缺點:索引需要佔用數據表以外的物理存儲空間。創建索引和維護索引要花費一定的時間。當對表進行更新操作時,索引需要被重建,這樣降低了數據的維護速度。
8.什麼是視圖?使用視圖的優點和缺點是什麼?
答:視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在資料庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
優點:1隱蔽資料庫的復雜性2控制用戶提取數據3簡化資料庫用戶管理 4簡化查詢
缺點:1性能:SQL Server必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由,一個復雜的多表查詢所定義,那麼,即使是視圖的一個簡單查詢,SQL Server也,把它變成一個復雜的結合體,需要花費一定的時間。2修改限制:當用戶試圖修改視圖的某些行時,SQL Server必須把它轉化為對基本,表的某些行的修改。對於簡單視圖來說,這是很方便的,但是,對於比較復雜的,視圖,可能是不可修改的。
9. 修改視圖中的數據會受到哪些限制?
答:1、必須有許可權 2、單表視圖直接改
3、多表可在視圖中定義 instead of 觸發器.
4、對由多表連接成的視圖修改數據時,不能同時影響一個以上的基表,也不能刪除視圖中的數據
5、對視圖上的某些列不能修改,這些列是:計算列,內置函數列和行集合函數列
6、對具有NOT NULL 的列進行修改時可能會出錯。通過視圖修改或者插入數據時,必須保證未顯示的具有NOT NULL 屬性的列有值,可以是默認值,IDENTITY 等,否則不能像視圖中插入數據行。
7、如果某些列因為規則或者約束的限制不能接受從視圖插入的數據時,則插入數據可能會失敗
8、刪除基表並不刪除視圖,建議採用與表明顯不同的名字命名規則
10. 什麼是數據完整性?如果資料庫不實施數據完整性會產生什麼結果?
答:數據完整性是指數據的精確性和可靠性。它是應防止資料庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。
11.數據完整性有哪幾類?如何實施?
答:1、數據完整性分為四類:實體完整性、域完整性、參照完整性、用戶定義的完整性。
2、資料庫採用多種方法來保證數據完整性,包括外鍵、束約、規則和觸發器。系統很好地處理了這四者的關系,並針對不同的具體情況用不同的方法進行,相互交叉使用,相補缺點。
12. 什麼是主鍵約束?什麼是惟一約束?兩者有什麼區別?
答:主鍵約束:有一列或列的組合,其值能唯一的標識表中的每一行。
唯一約束:不允許資料庫表在指定列上具有相同的值,但允許有空值。
區別:一個表可以定義多個唯一約束,只能定義一個主鍵約束;空值得列上可以定義唯一約束,不能定義主鍵約束。
13.什麼是外鍵,怎樣建立外鍵約束?
答:外鍵是用於建立和加強兩個表數據之間的鏈接的一列或多列。通過將保存表中主鍵值的一列或多列添加到另一個表中,可創建兩個表之間的鏈接。這個列就成為第二個表的外鍵。
14.什麼是存儲過程?使用存儲過程有什麼好處?
答:1、是存儲在伺服器上的 Transact-SQL 語句的命名集合,是封裝重復性任務的方法,支持用戶聲明變數、條件執行以及其他強有力的編程特性。
2、存儲過程封裝了商務邏輯,確保一致的數據訪問和修改。若規則或策略有變化,則只需要修改伺服器上的存儲過程,所有的客戶端就可以直接使用
屏蔽資料庫模式的詳細資料。用戶不需要訪問底層的資料庫和資料庫內的對象
提供了安全性機制。用戶可以被賦予執行存儲過程的許可權,而不必在存儲過程引用的所有對象上都有許可權
改善性能。預編譯的 Transact-SQL 語句,可以根據條件決定執行哪一部分
減少網路通信量。客戶端用一條語句調用存儲過程,就可以完成可能需要大量語句才能完成的任務,這樣減少了客戶端和伺服器之間的請求/回答包
15.什麼是觸發器?觸發器分有什麼作用?
答:觸發器是一類特殊的存儲過程,不能被直接調用,也不傳遞或接受參數
作用:1、維護不可能在表創建時刻通過聲明性約束進行的復雜的完整性約束限制。
2、通過記錄所進行的修改以及誰進行了修改來審計表中的信息。
3、當表被修改的時候,自動給其他需要執行操作的程序發信號。
❿ 動態表名組裝的sql,還能預編譯嗎
當然可以,就和你正常的一樣
sql = "select sms_mt_send_detail"+day+" detail inner join .... where detail.user_mobile = ? and ...."
PreparedStatement stat = con.prepareStatement(sql);
stat.setString(1,table); -- 設置參數
...