SQL Server CE 读取速度慢(1000 行需要 36 秒?)

Posted

技术标签:

【中文标题】SQL Server CE 读取速度慢(1000 行需要 36 秒?)【英文标题】:SQL Server CE slow at reading (36 seconds for 1000 rows?) 【发布时间】:2016-07-08 02:50:54 【问题描述】:

我有一个表 PartNumbers,其中包含 10 列混合数据类型和超过 100,000 行。

这是我的测试:

我在 ID 列上放了一个索引:

CREATE UNIQUE INDEX IndexName ON [PartNumbers] (ID)

我得到一个包含 1000 个随机选择的 ID (Random_ID_List) 的列表,并遍历每个 ID 以从表中获取描述:

 Dim Stop_Watch As New Stopwatch
  Stop_Watch.Start()

  Dim Results As New List(Of String)
  LocalDB.SQLCe_Connection.Open()
  For Each ID As Integer In Random_ID_List
   Dim sqlcmd = LocalDB.SQLCe_Connection.CreateCommand()
   sqlcmd.CommandText = "SELECT Description FROM PartNumbers WHERE ID = " & ID
   Results.Add(sqlcmd.ExecuteScalar)
  Next
  LocalDB.SQLCe_Connection.Close()

  Stop_Watch.Stop()
  Dim Result_Time As Long = Stop_Watch.ElapsedMilliseconds

我的结果是:

Result_Time = 36283 毫秒(36 秒

这正常吗?

【问题讨论】:

每次查询 36 毫秒。不荒谬。尝试使用准备好的语句,和/或通过in 而不是= 减少查询数量。 试试SELECT Id, Description FRO PartNumbers WHERE ID IN (... list of IDs here ...) 你目前正在做1000次索引查找。 只是出于好奇,如果您使用参数化查询会发生什么? sqlcmd.CommandText = "SELECT Description FROM PartNumbers WHERE ID = @Param"; sqlcmd.Parameters.AddWithValue("@Param", ID); 我知道在 SQL Server 中可以产生很大的不同。 @JonathanAllen 带来了巨大的变化,从 36 秒到 4059 毫秒(4 秒)谢谢 我的 2 美分。在for 循环外部 创建命令并打开连接。在循环中只改变参数值。 【参考方案1】:

使用参数化查询。

sqlcmd.CommandText = "SELECT Description FROM PartNumbers WHERE ID = @Param";
sqlcmd.Parameters.AddWithValue("@Param", ID); 

我不知道这个数据库的详细信息,但是对于其他数据库,您可以花更多的时间来解析 SQL 和生成执行计划,而不是实际运行查询。

【讨论】:

以上是关于SQL Server CE 读取速度慢(1000 行需要 36 秒?)的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server CE 4.0 的简单实体查询慢

C#/ASP.NET 网站使用 SQL Server CE 数据库慢查询

SQL SERVER 访问Sybase速度过慢,怎么解决?

sqlserver查询速度慢

SQL Server 2008 Query 生产速度慢,但开发速度快

如何解决SQL Server查询速度缓慢的问题