在某些情況下,sqlite3_step 可以從磁盤流式傳輸查詢結果,而無需一次性將它們全部加載到記憶體中嗎?
例如
SELECT * FROM my_table ORDER BY rowid
這會在第一次呼叫 sqlite3_step 回傳之前將所有結果加載到記憶體中嗎?
即使沒有,是否還有其他情況將所有結果一次加載到記憶體中?這怎么能提前預測呢?
我的目標是了解 SQLite 如何在內部使用記憶體,以期在記憶體受限的環境中使用它
uj5u.com熱心網友回復:
經過一些測驗,我認為答案是肯定的,它可以流式傳輸結果。
在https://github.com/michalc/sqlite-s3-query/ 中,sqlite3_step在后臺使用,通過對 S3 的范圍 HTTP 請求從 SQLite 檔案中獲取結果。在https://github.com/michalc/sqlite-s3-query/pull/25/files中,設定了一個自定義 HTTP 客戶端來存盤每次發出 HTTP 請求時獲取的結果行數。
在上面,查詢
SELECT my_col_a FROM my_table
允許斷言通過
self.assertEqual(rows_yielded_at_request, [
(0, None),
(0, 'bytes=0-99'),
(0, 'bytes=0-4095'),
(0, 'bytes=24-39'),
(0, 'bytes=4096-8191'),
(0, 'bytes=8192-12287'),
(140, 'bytes=12288-16383'),
(276, 'bytes=16384-20479'),
(412, 'bytes=20480-24575'),
])
顯示向客戶端代碼生成行與從 SQLite 檔案中獲取原始資料混合在一起。
在https://github.com/michalc/sqlite-s3-query/pull/27/files 中,查詢
SELECT my_col_a FROM my_table ORDER BY my_col_a
使斷言通過
self.assertEqual(rows_yielded_at_request, [
(0, None),
(0, 'bytes=0-99'),
(0, 'bytes=0-4095'),
(0, 'bytes=24-39'),
(0, 'bytes=4096-8191'),
(0, 'bytes=8192-12287'),
(0, 'bytes=12288-16383'),
(0, 'bytes=16384-20479'),
(0, 'bytes=20480-24575'),
])
表明在這種情況下它不是流式傳輸。在這種情況下, column 上沒有索引my_col_a,因此 SQLite 必須先獲取所有行,然后才能知道哪一行可能是第一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394262.html
