【发布时间】:2019-10-30 03:36:29
【问题描述】:
我创建了一个应用程序,允许用户浏览我的数据库中的数据。该代码有效,但唯一的问题是加载搜索结果需要花费大量时间。这是因为我的 Access 数据库的每个表中大约有 100 万行数据。加载窗口表单也需要一些时间......有谁知道我怎样才能缩短数据搜索的时间?
Private Sub MovieBrowser_Load(sender As Object, e As EventArgs) Handles MyBase.Load
conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=1MDb.accdb;Persist Security Info=False;")
strSQL = "SELECT m.primaryTitle AS MovieTitle, m.startYear AS StartYear, m.runtimeMinutes AS Runtime, m.genres AS Genre, d.primaryName AS Director, c.writers AS Writer, r.averageRating AS Rating, d.primaryProfession AS Profession, ('www.imdb.com/title/' + m.tconst) AS URL From Movie m, Director d, Crew c, Rating r WHERE m.tconst=c.tconst AND d.nconst = c.directors AND r.tconst=m.tconst"
conn.Open()
da = New OleDbDataAdapter(strSQL, conn)
Dim ds As New DataSet("Movies1")
'fills the dataset with data
da.Fill(ds, "Movies1")
'assign the datasource to the DataGridView
DataGridView1.DataSource = ds.Tables("Movies1")
conn.Close()
txtSrchbar.Focus()
End Sub
【问题讨论】:
-
不要存储/尝试重用连接。在需要时创建一个新的并就地处理。可能将其声明包含在
Using块中。包括 DataAdapter 和 Command(如果存在)。 -
看起来你的应用程序的瓶颈可能是数据量。获取一百万组数据并将它们放入数据网格确实需要一些时间。您可能可以通过优化数据库(通过使用正确的索引)来加快获取速度,但恐怕大部分时间都会从 UI 中提取来呈现数据。也许您可以将代码更改为仅在点击次数少于(假设)1000 次时才显示搜索结果。否则,您可能会显示“搜索结果过多”之类的内容。
-
您知道 2GB 的限制吗?迁移到 Sql-Server(Express Edition 是免费的)或 MySQL、MariaDB 或 Postgre。数据库的查询时间与正确的索引和数据量密切相关。 Where-Clause 中的所有字段都被索引了吗?您应该使用 Where-Clause 在 SQL-Query 中进行搜索,首先获取所有数据,然后再搜索它们。
-
顺便说一句,我注意到您在这里的最后一个问题,您是否尝试过
MS-Accessas Front-End?这比 .Net 更容易与数据库一起使用(具有绑定字段的表单可以在更短的时间内创建,因为您需要的几乎所有东西都可以从头开始使用。)。我不喜欢 MS-Access 作为 backend-db(尝试在使用 db 时备份数据,没有 EXPLAIN,没有存储过程,多用户性能差等),但没有 Front-End 更 RAD!跨度> -
添加索引,避免类似查询过滤器,使用查询分解。不要将所有数据加载到数据网格中,但可能只加载前 1000 个。