2

我有使用 sqlserver 精简版和实体框架进行数据访问的 c# 项目。我需要向数据库插入或更新大量行,5000+ 或更多,所以如果密钥存在,如果不插入则更新记录。我找不到使用紧凑版和 EF 执行此操作的方法,但性能不佳,即在核心 i7 计算机上花费 2 分钟以上。我曾尝试搜索记录以查看它是否存在,如果不存在则插入或更新,如果存在,则搜索是杀手锏。我已经尝试编译搜索查询,但只带来了很小的改进。我尝试过的另一件事是将记录插入到 try catch 中,如果它更新失败,但这会迫使我在每条记录上保存更改以获取异常,而不是在最后,这是一个性能杀手。显然我不能 t 使用存储过程,因为它是精简版。此外,我还研究过以某种方式直接在数据库上执行 t-sql,但紧凑中缺少进程语句似乎排除了这一点。我已经在世界各地寻找想法。如果我可以过度表达部署优势和防止用户挖掘数据库的能力,我真的很想使用紧凑型。任何建议将不胜感激。

谢谢

4

7 回答 7

6

当我们使用 SQL CE(以及 SQL 2005 Express)时,我们总是先调用更新,然后如果 udate 给出的行数为 0,则调用插入。这实现起来非常简单,不需要尝试费用。 .catch 块用于控制流。

于 2009-06-30T08:19:02.300 回答
2

鉴于您的问题陈述,我猜测该软件假定了一个相对强大的环境。您是否考虑过将确定 sqlce 的任务并自行完成?本质上,从相关表中获取所有 ID(键?)的排序列表,并在排队插入之前根据该列表检查每个对象键?

这做出了一些假设,这对于典型的数据库来说是个坏消息,但您可能可以在 sqlce 中侥幸逃脱。例如,它假定在您执行此插入时,其他用户不会插入或显着修改行。

如果键列表太长而无法合理地保存在内存中以进行此类检查,恐怕我会说 sqlce 可能不是该工作的正确工具。:(

于 2009-04-08T04:10:07.297 回答
2

也许您可以通过使用简单的查询来获得您寻求的结果。假设您要插入或更新的表是这样的

TABLE original
     id integer,
     value char(100)

首先,您可以使用新值创建一个临时表(您可以使用 SELECT INTO 或其他方式来创建它)

TABLE temp
    id integer,
    value char(100)

现在,您需要做两件事,更新原始行,然后插入新值

UPDATE original 
SET original.value = temp.value
FROM original, temp
WHERE original.id = temp.id

INSERT INTO original 
SELECT * from temp 
WHERE temp.id not IN (select o.id from original o)
于 2009-04-08T21:06:34.810 回答
2

我不确定这是否可行,因为我没有使用实体框架,但是您是否尝试过先运行更新并检查行数——如果没有更新行则插入?这可能比捕获异常更快。将异常用于控制流通常是一种不好的做法,并且通常会大大减慢速度。

如果您可以直接编写 SQL,那么最快的方法是将所有数据放入临时表中,然后更新现有数据并插入其余数据(如上面 Andrea Bertani 的示例)。通过在插入的选择中对原始表使用左连接,并排除原始表中的值不为空的任何行,您应该会获得更好的结果:

INSERT INTO original
SELECT * FROM temp
LEFT JOIN original ON original.id = temp.id
WHERE original.id IS NULL
于 2009-04-09T00:12:31.540 回答
2

我建议直接使用 SqlCeResultSet。您失去了 EF 良好的类型安全性,但性能却非常快。我们从 ADO.NET 2.0 样式的 TypeDataSets 切换到 SqlCeResultSet 和 SqlCeDataReader,速度提高了 20 到 50 倍。

于 2009-04-24T16:30:00.057 回答
1

请参阅 SqlCeResultSet。对于一个 .NETCF 项目,我删除了几乎所有的 sql 代码来支持这个类。只需在此处和 msdn 中搜索“SqlCeResultSet”即可。

快速概览:

  1. 打开结果集。如果您需要寻找(用于检查是否存在),则必须为结果集提供索引。

  2. 寻找结果集并阅读以检查您是否找到该行。即使在具有数万行的表上,这也非常快(因为查找使用索引)。

  3. 插入或更新记录(请参阅 SqlCeResultSet.NewRecord)。


我们已经成功开发了一个带有 sqlce 数据库的项目,该数据库具有一个超过 65000 行的主产品表(具有 4 个索引的读/写)。

于 2009-06-30T07:50:28.333 回答
0

SQL Server 精简版目前处于开发的早期阶段。此外,根据您的设备,内存磁盘访问可能非常缓慢,并且 SQLCE 和 .NET 类型安全开销非常大。它最适合使用漂亮的静态数据存储。

我建议您要么使用更轻量级的 API,要么考虑使用 SQLite。

于 2009-04-24T16:39:06.917 回答