【问题标题】:SQL Server CE slow at reading (36 seconds for 1000 rows?)SQL Server CE 读取速度慢(1000 行需要 36 秒?)
【发布时间】: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 循环外部 创建命令并打开连接。在循环中只改变参数值。

标签: c# vb.net sql-server-ce local-database


【解决方案1】:

使用参数化查询。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2019-04-23
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2012-11-22
    相关资源
    最近更新 更多