當前位置:首頁 » 編程語言 » 與編譯生成的sql語句不夠靈活
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

與編譯生成的sql語句不夠靈活

發布時間: 2022-07-11 20:05:31

A. sql語句優化

1. 繼續你的思路,將
("select [class] from [class] where name='"&Trim(rs("cs"))&"'")
改成帶參數的語句,每次傳遞參數即可,這樣可以避免每次重新編譯你的sql語句。

2. 改寫你的sql語句,一次查詢出所有數據(不過這樣,似乎用不了別的列信息了):
select [class] from [class] where name in(select top 50 cs from fangchan order by id DESC)

B. 如何進行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樹存放。

C. SQL查詢語句性能優化建議

1對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0

3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

4.應盡量避免在 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

5.in 和 not in 也要慎用,否則會導致全表掃描,如:

select id from t where num in(1,2,3)

對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

6.下面的查詢也將導致全表掃描:

select id from t where name like '«c%'

若要提高效率,可以考慮全文檢索。

7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

select id可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

8.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2=100

應改為:

select id from t where num=100*2

9.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where substring(name,1,3)='abc'--name以abc開頭的id

select id from t where datediff(day,createdate,'2005-11-30')=0--『2005-11-30』生成的id

應改為:

select id from t where name like 'abc%'

select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

11.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:

select col1,col2 into #t from t where 1=0

這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:

create table #t(...)

13.很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(selectnum from b)

用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)

14.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

15.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。

17.盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。

18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。

19.任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。

20.盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。

21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

22.臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。

23.在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。

24.如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

25.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。

26.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

27.與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

28.在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。

29.盡量避免大事務操作,提高系統並發能力。

30.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

D. 預編譯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();
}

E. 怎麼樣寫SQL語句可以提高資料庫的執行速度應該注意那些

這個范圍太大了,一下子是很難說清楚的,如果用sql server 的話,可以使用它自帶的優化器來優化,然後看看它給你的建議去優化。要注意規范化編程。而且要抓住一個原則來寫,就是進可能縮小查詢出來的結果集,哪怕多次查詢都沒所謂,要一步一步把大數據量縮小。很多隻是還是得在時間中優化。SET STATISTICS TIME ON;SQL 語句SET STATISTICS TIME OFF;這個是sqlserver ,可以測出執行時間。編寫的時候要時刻想著:縮小結果集、減少連接次數和表數。大數據量不要用update,可以用臨時表作為過度來實現update操作。

F. java預編譯的問題,其中sql語句執行不了,其他插入什麼的都正常,望指點~

pstmt.setString(1,user.getId()+"");
pstmt.setString(2,user.getName());
pstmt.setString(3,user.getPwd());
這是以佔位符方式設置 sql的參數值。
你的sql語句String sql = "select id,name,pwd from userinfo where id=10007";
沒有用到,所以這幾句刪了就行了。或者改為:
String sql = "select id,name,pwd from userinfo where id=?";
pstmt.setString(1,user.getId()+"");

G. sql預編譯語句就是不執行,怪怪的,求解,急~~

DataSource dataSource = new DataSource(); // 實例化Datasource
QueryRunner runQuery = new QueryRunner(dataSource);
runQuery.batch(sql,object); // sql : "DELETE FROM english WHERE id = ? " 預編譯
Object 是一個二維數組 對應你要刪除的值希望有幫助!可以到CSDN,IT實驗室,365testing

H. sql語句問題,請問如何提高運行效率和速度

其實你的效率低的原因不是用SQL語句還是存儲過程的問題。看你的描述以及代碼,如果是多次循環上述代碼的話,確實效率會比較低,原因是有一次循環就會和資料庫產生一次查詢和更新通訊,希望增加效率應該從盡量減少和資料庫通訊方面來考慮解決,因為是這里出現了效率瓶頸。

下面是具體的代碼分析:
首先更新和插入操作是無法減少的,必須一條紀錄一條紀錄更新,一條紀錄一條紀錄的插入,但是查詢完全可減低為一次查詢。
下面是偽代碼:
strsql="select * from "&tabl&" where id+idd in ('所有要循環的id+idd,他們之間用逗號分開')"
rs.open strsql,conn,3,3
do while not rs.eof
rs("degree")=rs("degree")+1
tempstr=tempstr&id&idd&"|" '這里是將資料庫中存在的id,idd記錄保存下來,存入一個臨時變數中,用|符號分割開。
rs.update
rs.movenext
loop
'上面的代碼是更新了資料庫中存在的紀錄,並記錄下了存在的記錄ID+IDD
下面將所有存在的已update的id+idd的值從所有的id+idd的值中剔除掉,取到所有需要insert的id+idd紀錄,然後一起insert進資料庫即可。代碼我不再寫了,這樣的字元串對比操作並不難,因為這樣都是內存操作,速度會很快。僅提供一個思路。希望對你有用。

I. 如何提高SQL語句的能力

不建議在工作中寫很復雜的sql語句 這樣會讓代碼復用率降低很多 而且不易後期維護和擴展 建議把復雜的sql語句拆分成多個簡單的語句 封裝成存儲過程 這樣會比較好 而且大量的多表查詢會讓系統延遲很高 容易死鎖
如有疑問追問,如滿意記得採納,
如果有其他問題也可點我名字向我求助
答題不易,
如果沒有回答完全,請您諒解,

請採納最快回答的正確答案!!謝謝!

J. sql運行問題

sql運行問題?
資料庫運行過程中常見的故障有3類:事物故障、系統故障、介質故障。

恢復策略:
1、事物故障:
發生事務故障時,被迫中斷的事務可能已對資料庫進行丁修改,為了消除該事務對資料庫的影響,要利用日誌文件中所記載的信息,強行回滾該事務,將資料庫恢復到修改前的初始狀態。
為此,要檢查日誌文件中由這些事務所引起的發生變化的記錄,取消這些沒有完成的事務所做的一切改變,這類恢復操作稱為事務撤銷。
2、系統故障:
系統故障的恢復要完成兩方面的工作,既要撤銷所有末完成的事務,還要重做所有已提交的事務,這樣才能將資料庫真正恢復到一致的狀態。

3、介質故障:
介質故障比事務故障和系統故障發生的可能性要小,但這是最嚴重的一種故障,破壞性很大,磁碟上的物理數據和日誌文件可能被破壞,這需要裝入發生介質故障前最新的後備資料庫副本,然後利用日誌文件重做該副本後所運行的所有事務。
「數據故障恢復」和「完整性約束」、「並發控制」一樣,都是資料庫數據保護機制中的一種完整性控制。所有的系統都免不了會發生故障,有可能是硬體失靈,有可能是軟體系統崩潰,也有可能是其他外界的原因,比如斷電等等。
資料庫運行的突然中斷會使資料庫處在一個錯誤的狀態,而且故障排除後沒有辦法讓系統精確地從斷點繼續執行下去。這就要求DBMS要有一套故障後的數據恢復機構,保證資料庫能夠回復到一致的、正確地狀態去。