㈠ sqlite3到底能支持多大的數據量
你的操作系統,文件系統是什麼版本? 操作系統本身對文件大小的限制是什麼?
還真沒聽說過sqlite支持TB級,它的大小受制於運行時的文件系統。
下面是原文解釋支持的大小:
Every database consists of one or more "pages". Within a single database, every page is the same size, but different database can have page sizes that are powers of two between 512 and 65536, inclusive. The maximum size of a database file is 2147483646 pages. At the maximum page size of 65536 bytes, this translates into a maximum database size of approximately 1.4e+14 bytes (140 terabytes, or 128 tebibytes, or 140,000 gigabytes or 128,000 gibibytes).
㈡ android開發中有沒有可視化的工具對sqlite資料庫進行操作
機頂盒,android,小型電子設備使用的資料庫見到的多是sqlite資料庫。sqlite資料庫,是輕量級的,可以存儲大量數據。包括圖片,音頻,視頻。android使用的內置資料庫,正是sqlite。下面分部講解androidsqlite使用方法。
電腦一台
sqlite資料庫工具
定義連接名字,選擇資料庫類型,建立資料庫文件,點擊ok。此時建立資料庫的准備工作已經完成了。
打開連接,打開資料庫,建立數據表。
建立欄位屬性,可以添加,修改,刪除屬性。同時,還可以設置主屬性。
可以導入其他文本格式創建的db,如表格,html,txt等格式
表內添加數據,進行命令行操作。
關閉連接,關閉資料庫操作。
㈢ sqlite3到底能支持多大的數據量
sqlite版本:sqlite3
操作系統:暫時測試是在window下,部署是在linux下的
磁碟格式:NTFS
資料庫要求:由於sqlite不支持分區,建20000個表,每個表插入86400條數據,需要沒秒對著20000個表中的一條記錄進行修改。這是極限情況,正常使用也就是沒5s對20000個表同時修改一下。
順便再問下:sqlite只能同時存在一個寫的連接嗎?有沒有什麼辦法可以讓它同時多個連接進行寫入。
㈣ SQLite 的讀寫效率很高,有哪些使用其他資料庫的理由
SQLite 的讀寫效率很高,有哪些使用其他資料庫的理由
1、sqlite定位是嵌入式資料庫,只能本地嵌入其它進程來工作,無法被遠程的客戶端訪問,需要上層應用來處理這些事情;
2、sqlite設計上就不是為大數據量考慮的,因此別指望它存海量數據;
3、sqlite適合單線程訪問,對多線程高並發的場景不適用;
4、各種資料庫高級特性它都不支持,比如管理工具、分析工具、維護等等;
所以還是要根據場景選擇合適的資料庫,嵌入式用SQLite是相當不錯的,但絕大多數場景還是要用MySQL/SqlServer/MongoDB這類的資料庫。
㈤ SQLite最多能存多大的數據量
您好,我來為您解答:
sqlite本身最大支持2TB的數據量。
希望我的回答對你有幫助。
㈥ 為什麼我往sqlite的表裡最多隻能存1000條數據是有這樣數量限制還是有需要設置的地方
是可以存的,只是可能你所使用的可視化工具每一頁最多顯示1000條,可以尋找翻頁按鈕查看剩餘數據
㈦ SQLite資料庫,文本最大能是多大謝謝了,大神幫忙啊
理論上只要硬碟夠大…… 沒有必要挑戰最大吧?這是嵌入式資料庫,都不大的。如果你的資料庫超過1G大,我就建議你換用大型資料庫,sqlserver、甲骨文等。
㈧ 在使用sqlite時有什麼需要注意的地方嗎
首先介紹我用Sqlite解決的實際問題是什麼?
問題1:某個功能的數據需要連接一個遠程資料庫查詢速度很慢,查一次數據不容易,希望能夠重復利用之前查過的數據集。
問題2:非常大的數據量比如幾千萬甚至幾億條數據,一次性讀取到DataTable中,會內存溢出的,所以在第一次分析時就是通過Reader的方式,分析完一條後並不在內存中保存,但是緊接著用戶的第二次分析、第三次分析還是要用到的第一次分析的數據,如果我們重新查詢一次遠程伺服器,效率可想而知啊。
結合上面的2個問題,為了解決效率問題和數據重復利用度,減少資料庫伺服器的壓力,我才用Sqlite緩存數據(當然這不是唯一也不是最好的解決方案) 。
優化SQLiteHelper
陸兄的SQLiteHelper類我增加了幾個有用的方法:
第一個方法是GetSchema,得到某個表的表結構。
/// <summary>
/// 查詢資料庫中的所有數據類型信息
/// </summary>
/// <returns></returns>
public DataTable GetSchema()
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
DataTable data = connection.GetSchema("TABLES");
connection.Close();
//foreach (DataColumn column in data.Columns)
//{
// Console.WriteLine(column.ColumnName);
//}
return data;
}
}
第二個方法是IsTableExist,判斷SQLite資料庫重某個表是否存在 。
/// <summary>
/// 判斷SQLite資料庫表是否存在
/// </summary>
/// <param name="dbPath">要創建的SQLite資料庫文件路徑</param>
public bool IsTableExist(string tableName)
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
using (SQLiteCommand command = new SQLiteCommand(connection))
{
command.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tableName + "'";
int iaaa = Convert.ToInt32(command.ExecuteScalar());
if (Convert.ToInt32(command.ExecuteScalar()) == 0)
{
return false;
}
else
{
return true;
}
}
}
}
第三個方法是Query,執行查詢語句,返回DataSet
/// <summary>
/// 執行查詢語句,返回DataSet
/// </summary>
/// <param name="SQLString">查詢語句</param>
/// <returns>DataSet</returns>
public DataSet Query(string SQLString)
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
}
catch (System.Data.SQLite.SQLiteException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
構建緩存對象模型和緩存控制器
每一塊緩存對象,在資料庫中會產生一個表,而表名稱是有緩存控制器自動生成的,訪問緩存的工作全部交由緩存控制器完成,通過緩存項的ID和MoleKey來訪問。
在Sqlite中還需要一個系統表來維護每個緩存項和實際緩存存儲表之間的對應關系,我們稱之為配置表,它將在緩存控制器創建Sqlite緩存資料庫文件時創建。
配置表共有以下幾個欄位,分別和緩存對象模型CdlCacheItem類映射:
列名稱 說明
Id 緩存的唯一數字編號
MoleKey 緩存模塊名稱,一個模塊可以有多個緩存數據,ID可以區分。實際應用時,某個功能時會經常緩存數據的,所以通過MoleKey就可以得到這個功能所有的緩存列表,然後選定其中的部分緩存來進行使用。
Comments 緩存說明
TableName 緩存數據存儲的數據表名稱
AddDate 緩存時間戳
創建資料庫的方法如下:
static void CreateDB()
{
//總共有ID、MoleKey、Comments、AddDate這幾列
string sql = "CREATE TABLE SYSCDLTABLES(ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,MODULEKEY VARCHAR(200),COMMENTS VARCHAR(500),TABLENAME VARCHAR(100),ADDDATE DATETIME)";
SQLiteDBHelper.CreateDB(CACHEFILEPATH, sql);
}
每個緩存項(緩存對象模型)定義如下,和配置表對應:
/// <summary>
/// 緩存項對象
/// </summary>
/// <Author>Tecky Lee</Author>
/// <Date>2011-1-11 15:11</Date>
public class CdlCacheItem
{
int m_id;
public int Id
{
get { return m_id; }
set { m_id = value; }
}
string m_moleKey;
public string MoleKey
{
get { return m_moleKey; }
set { m_moleKey = value; }
}
string m_comments;
public string Comments
{
get { return m_comments; }
set { m_comments = value; }
}
string m_tableName;
public string TableName
{
get { return m_tableName; }
set { m_tableName = value; }
}
DateTime m_timestamp;
public DateTime Timestamp
{
get { return m_timestamp; }
set { m_timestamp = value; }
}
}
下面是控制器的介面定義:
public interface ICdlCacheController
{
void BeginLoadRow();
void EndLoadRow();
System.Collections.Generic.IList<CdlCacheItem> GetCdlCacheItems(string moleKey);
CdlCacheItem GetCdlCacheItems(int id);
void LoadRow(System.Data.DataRow row, string tableName);
void LoadRow(IEnumerable<object> row, string tableName);
string LoadTable(System.Data.DataTable dt, string moleKey, string comments);
System.Data.Common.DbDataReader QueryCdlTableReader(CdlCacheItem item);
System.Data.DataTable QueryCdlTables(CdlCacheItem item);
System.Data.DataTable QueryCdlTables(string sql);
void RemoveAllTables();
void RemoveCdlTables(string moleKey);
void RemoveCdlTables(System.Collections.Generic.IList<CdlCacheItem> items);
void RemoveCdlTables(CdlCacheItem item);
void RemoveCdlTables(int id);
}
上面的函數下面來做個說明:
1、BeginLoadRow、LoadRow和EndLoadRow,三個函數組為了在我們查詢主資料庫時使用Reader方式讀取數據時,可以一條條將數據同時存放在緩存中。
2、RemoveAllTables和RemoveCdlTables是用來刪除緩存項的。
3、GetCdlCacheItems,通過moleKey得到多個緩存項。比如用戶想基於這幾天內保存的某個功能的數據做一次快速分析,那麼我們就可以通過這個函數得到緩存列表,由用戶選擇列表中的一個來繼續。
4、QueryCdlTableReader,得到某個緩存數據的Reader對象,這樣可以一行行的分析,一次讀出大數據量的數據到DataTable中,內存可能會溢出的。
5、QueryCdlTables,將某個緩存項查詢並裝載到DataTable中。
提高緩存數據寫入效率
Sqlite在保存數據的時候,比如一次保存一個億條的數據,一條條插入效率非常低下,網上也有人對其進行討論。
效率低下的主要原因在於IO操作次數過於頻繁,所以在LoadTable或者是使用BeginLoadRow·EndLoadRow的時候,使用了事務來減少數據提交的次數,結果保存的效率非常的高,我測試的結果是400萬條數據查詢,只需要幾十秒鍾,這點時間相對於重新查一次遠程伺服器那是可以忽略了。
下面給出BeginLoadRow和EndLoadRow的具體代碼(只有在EndRow的時候才會提交一次數據):
SQLiteConnection m_connection;
SQLiteCommand m_command;
DbTransaction m_transaction;
public void BeginLoadRow()
{
m_connection = new SQLiteConnection("Data Source=" + CACHEFILEPATH);
m_connection.Open();
m_transaction = m_connection.BeginTransaction();
m_command = new SQLiteCommand(m_connection);
}
public void EndLoadRow()
{
try
{
if (m_command != null)
m_command.Dispose();
if (m_transaction != null)
{
m_transaction.Commit();
}
if (m_connection != null)
{
m_connection.Close();
m_connection.Dispose();
}
}
catch (System.Exception ex)
{
LogHandle.Error(ex);
}
}
LoadTable函數內部也是調用BeginLoadRow·EndLoadRow模式來完成的。
資料庫文件如何創建:
Sqlite資料庫文件如果不存在,在執行sql語句的時候,會自動根據ConnetionString中指定的位置創建資料庫文件,默認創建的空資料庫只有4K。
其他有待討論的問題:
1、我是將所有的緩存做到一個資料庫文件中了,實際應用根據業務的不同,可以一份緩存數據一個文件也是很好管理的,維護也方便,資源管理器中就可以拷貝刪除等。
2、當我們存儲一億條數據到Sqlite的時候,因為Sqlite沒有壓縮數據,結果資料庫文件就可以會有好幾個G(這也不一定,適合資料庫欄位的多少,欄位類型有關的)。
文件太大就消耗了磁碟空間,而且用戶或者程序如果不及時清理的,可能會耗盡磁碟空間。
這里就必須建立一個機制,檢查sqlite的緩存並及時清理,或者設置緩存應用的上限,當達到上限後自動根據時間戳清理歷史緩存。
轉載