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 秒?)的主要内容,如果未能解决你的问题,请参考以下文章
C#/ASP.NET 网站使用 SQL Server CE 数据库慢查询