【问题标题】:Universe Entity Framework very slow to selectUniverse Entity Framework 选择非常慢
【发布时间】:2014-06-03 15:57:53
【问题描述】:

我将使用实体框架代码优先方法,发现仅获取 350 条左右记录的查询大约需要 8 秒。我怎样才能加快速度?这个 Universe 或实体框架是否运行缓慢?

实体框架 5.0 U2.Data.Client 1.2.1 .Net 框架 4.5.1

RAMContext 看起来像这样:

public class RAMContext : DbContext
{
    public RAMContext() { }

    public DbSet<Policy> Policies { get; set; }
}

这是获取实体的代码:

List<Policy> policies = null;

Database.SetInitializer<RAMContext>(null);
using (RAMContext context = new RAMContext())
{
    policies = (from p in context.Policies
               where p.AGENT_NO == id
               select p).ToList();
}

这是连接字符串:

<add name="RAMContext" connectionString="Database=<account>;UserID=<userid>;Password=<pwd>;Server=<server>;Pooling=false;ServerType=universe;ConnectTimeout=360;SleepAfterClose=300;PersistSecurityInfo=true" providerName="U2.Data.Client" />

AGENT_NO 已编入索引,从 TCL 直接在数据库上运行的相同查询几乎立即完成。

已编辑 在 Rajan 的 cmets 之后,我尝试了以下方法:

policies = (from p in context.Policies
            where p.AGENT_NO == id
            select new PolicyModel
            {
                //Type = PolicyModel.Types)StringValue.GetEnumValueByStringValue(typeof(PolicyModel.Types), p.TYPE),
                Insured = p.INSURED,
                City = p.CITY,
                State = p.STATE,
                CancelDate = p.CANC_DT
                //IsNew = PickHelper.PickYNNullToBool(p.NEW_RENEW_FLG)
            });

我现在可以在 3 秒内做出这个选择,它出现了。我还在 AGENT_NO 上重建了索引,我相信这有很大帮助。

尝试您的第二个建议,我得到以下异常:

U2.Data.Client.dll 中发生了“System.IndexOutOfRangeException”类型的异常,但未在用户代码中处理

补充资料:

此 U2ParameterCollection 的索引 -1 无效,Count=0。

【问题讨论】:

  • 与对数据库运行相同查询相比如何? AGENT_NO 上有索引吗?
  • 能否请您只尝试几列(int、string)?例如: var q = (from p in ctx.Customers where p.CUSTID >0 select new { ID = p.CUSTID, NAME=p.FNAME });你觉得有什么不同吗?
  • 你能再试试看吗?请运行以下代码(不带 EF)。例如。 // 取开始时间 U2Command cmd = con.CreateCommand(); cmd.CommandText = "SELECT ID, FNAME FROM CUSTOMER";数据集 ds = new DataSet(); U2DataAdapter da = 新 U2DataAdapter(cmd); da.填充(ds); //取结束时间
  • 我不太了解宇宙,甚至不知道是否有包含列的索引,但如果有的话,这绝对是一个想法,作为一般的数据库原则。因此,也许可以对某些索引列进行排序(即使它完全是任意的)。 Linq 本身并没有任何令人担忧的地方,但如果 List 实际上不是必需的(您不会多次点击它),您可以跳过它并遍历结果。
  • 您的 SQL 语法是什么?它是否包含“@ASSOC_ROW”?尝试将“NamedParameters=false”放在连接字符串中。如果没有解决,请将日志文件发送给我。最近我在 U2 Toolkit for .NET v2.1.0 中解决了这个问题。我们将很快发布 v2.1.0。我认为你错过了 BETA。请阅读:blog.rocketsoftware.com/2014/05/…blog.rocketsoftware.com/2014/05/…

标签: c# linq entity-framework u2netdk


【解决方案1】:

你能试试下面的代码吗?此代码不使用实体框架 (LINQ to Entity)。 我们想看看 UniVerse 在没有 Entity Framework 的情况下是如何表现的。

您需要执行以下操作:

  • 创建 C# 控制台应用程序
  • 将 Program.cs 文件的内容替换为以下代码
  • 右键->添加参考-> C:\Program Files (x86)\Rocket Software\U2 Toolkit for .NET\U2 Database Provider\bin.NETFramework\v4.0\U2.Data.Client.dll李>
  • 更改连接字符串
  • 更改 SQL 语法
  • 运行程序。请参见下面的屏幕截图。它显示“以秒为单位的时间”。

代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using U2.Data.Client; using System.Data; using System.Diagnostics; namespace DataAdapter { class Program { static void Main(string[] args) { try { Console.WriteLine("start........................."); Stopwatch sw = new Stopwatch(); sw.Start(); U2ConnectionStringBuilder conn_str = new U2ConnectionStringBuilder(); conn_str.UserID = "administrator"; conn_str.Password = "pass"; conn_str.Server = "localhost"; conn_str.Database = "XDEMO"; conn_str.ServerType = "UNIVERSE"; conn_str.Pooling = false; string s = conn_str.ToString(); U2Connection con = new U2Connection(); con.ConnectionString = s; con.Open(); Console.WriteLine("Connected..."); U2Command cmd = con.CreateCommand(); cmd.CommandText = "SELECT * FROM PRODUCTS"; DataSet ds = new DataSet(); U2DataAdapter da = new U2DataAdapter(cmd); da.Fill(ds); sw.Stop(); TimeSpan elapsed = sw.Elapsed; string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", elapsed.Hours, elapsed.Minutes, elapsed.Seconds, elapsed.Milliseconds / 10); int nSec = elapsed.Seconds; con.Close(); Console.WriteLine("Time Taken in seconds:" + elapsedTime); Console.WriteLine("End........................... "); } catch (Exception e) { Console.WriteLine(e.Message); } finally { Console.WriteLine("Enter to exit:"); string line = Console.ReadLine(); } } } }

【讨论】:

  • 嗨拉詹。以秒为单位的时间是 00:00:00.71 选择大约 1300 条记录。我在运行其他代码的同一个帐户上运行它。一个问题,当我在这里时;新版本的U2.Data.Client会更快吗?我正在开发的应用程序在很长一段时间内都不会上线,所以我会尽快更新到那个新版本。
  • 建议您使用更高版本(U2 Toolkit for .NET v2.1.0)。你需要再等一两个星期。我希望你会看到一些性能改进。您是否向 u2askus@rocketsoftware.com 发送了电子邮件?
  • 我做到了。 Joseph 一个多月前告诉我,他也会让我参加 BETA,所以我们拭目以待。非常感谢您对拉詹的所有帮助。如果我无法从新工具包中获得足够好的性能,我会告诉你...否则我将不得不尝试使用 UniObjects 和子例程。
  • 我们已于 2014 年 6 月 10 日发布 v2.1.0。请立即尝试。现在我们有了 Native Visual Studio 集成,所以你也可以在你的连接字符串“AccessMode=Native”中尝试。请再发送一封电子邮件至 u2askus@rocketsoftware.com 并提及“注意:Rajan Kumar”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多