【问题标题】:Long Browsing Time for Data Searching数据搜索的浏览时间长
【发布时间】: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 个。

标签: vb.net winforms ms-access


【解决方案1】:

拉整张桌子没有意义。

银行机器不会加载每个帐户,然后让您搜索。

网络浏览器不会加载整个互联网,然后让您搜索。

100 万行对于 Access 来说并不是很多数据。

简单地将一些文本框或一些类似的东西放在表单的顶部。

让用户输入发票编号或其他一些条件,然后加载网格。

您不想使用网格进行搜索,而只是用于显示数据。

因此,假设我们正在搜索给定年份的电影。

您可能在顶部有一个名为部件号的文本框。 usr 输入部件号,或者说电影年份,那么你的 sql 就变成了:

strSQL = "your sql”

strSQL = strSQL & " AND MovieYear = " & me.txtMyear

' code to fill the grid.

现在网格将只加载当年的电影。您可以添加其他搜索框。

确保您搜索的任何列都存在索引。

即使有 100 万行,拉取和限制发送到网格的结果也应该非常快。对于此类操作,访问数据引擎非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多