※ 引述《tinlans.bbs@whshs.cs.nccu.edu.tw (汀)》之銘言:
: ※ 引述《meltice.bbs@ptt.cc (三億兩千萬大散戶)》之銘言:
: > SQL我也不是很懂
: > 像是一般資料庫程式寫SELECT
: > 都是下完SELECT然後才用迴圈讀資料
: > 那如果我下完SELECT之後只讀前面幾筆資料
: > 這樣SQL資料庫也是會笨笨的把所有資料傳回到我的AP嗎
: 我也不是很懂 SQL,
: 但是照理說會是全送給你的 AP,
: 不然你的 AP 也無從處理起,
: 除非 SQL 已經進化成可以互動的語言了。
: 如果你的 SELECT 後面帶了一些比較多的條件,
: 就不會這麼暴力的把一堆資料傳來傳去了。
其實是不一定會全部送回來.
一般的資料庫都會有不同的界面來讓 AP 和其溝通, 以 Oracle 為例, 就可以用
OCI interface, 這上面有各種不同的函式可以運用. 例如, 可以應用一個有變數
的 SQL, 如 "Select * from A where b=:x and c=:y", 然後在執行前再 bind
變數實際的值就好, 這對常用且類似的 SQL 執行速度有很大的幫助. 或著是用
Buffer Insert, Buffer Update 等, 一次傳一整個 buffer 給資料庫去執行,
而不需一筆一筆的從 Client 傳給 Server.
至於這個問題, 用 OCI interface 的解決方式, 就是用 OCIStmtExecute() 執行
SQL 後, 用 OCIStmtFetch2() 讀結果時, 記得設定其中的參數來指定你要回傳的
資料範圍, 資料庫就只會傳回你要的個數. 之前遇到有個情況是先處理第一次回傳
的資料, 再由其中算出接下來需要第幾筆到第幾筆的結果, 之後就再用類似的方法傳
回來這些資料, 不必再執行同個或類似 SQL 一次, 也不必回傳中間不需要的資料.
當然, 改進 SQL 本身也是增進效率的重點, 若能再應用這些 interface, 可以讓
整個 AP 的效率大大提升.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 24.6.95.138