精華區beta Programming 關於我們 聯絡資訊
※ 引述《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