2010-06-12 10 views
2

我在C++窗口中使用sqlite,并且我有一个大约60M的db大小,当我打开sqlite数据库时,大约需要13秒。SQLite DB的开放时间真的很长

sqlite3* mpDB; 
nRet = sqlite3_open16(szFile, &mpDB); 

如果我关闭了我的应用程序并重新打开它。它只有不到1秒的时间。

首先,我以为这是因为磁盘缓存。因此,我在sqlite打开之前预先加载了60M的db文件,然后使用CFile读取文件,但是在预加载之后,第一次仍然很慢。

BOOL CQFilePro::PreLoad(const CString& strPath) 
    { 
     boost::shared_array<BYTE> temp = boost::shared_array<BYTE>(new BYTE[PRE_LOAD_BUFFER_LENGTH]); 
     int nReadLength; 
     try 
     { 
      CFile file; 
      if (file.Open(strPath, CFile::modeRead) == FALSE) 
      { 
       return FALSE; 
      } 
      do 
      { 
       nReadLength = file.Read(temp.get(), PRE_LOAD_BUFFER_LENGTH); 
      } while (nReadLength == PRE_LOAD_BUFFER_LENGTH); 
     file.Close(); 
     } 
     catch(...) 
     { 

     } 
     return TRUE; 
     } 

我的问题是第一次打开和第二次打开的区别是什么。 我该如何加速sqlite的开放过程。

+0

尝试用SQLite的命令行工具(sqlite3.exe)打开数据库,看看它是否也需要这么长时间。 – Unknown 2010-06-12 12:35:33

回答

0

其实,我不认为这会是一个缓存问题。我相当确定SQLite在打开它时并不会将整个数据库加载到内存中 - 它只是获得一些相对较少的磁盘结构。

但是,有一种可能性是,如果它没有用SQLITE_OMIT_AUTOINIT预处理器定义进行编译。在这种情况下,致电sqlite3_open16将致电sqlite3_initialize()

尽管我不确定需要多少时间,但在该功能中还是有一点发生。 sqlite3_initialize()函数维护一个标志,指示它之前被调用,然后在随后的调用中,它将立即退出(几乎)。这就是为什么我提到它是第一次和随后打开之间差异的可能罪魁祸首。

我建议从改变你的代码:

sqlite3* mpDB; 
nRet = sqlite3_open16(szFile, &mpDB); 

到:

sqlite3* mpDB; 
nRet = sqlite3_initialize(); 
if (nRet == SQLITE_OK) 
    nRet = sqlite3_open16(szFile, &mpDB); 

和计时两个功能独立调用。这可能是它占用时间的初始化。