【问题标题】:Running a large SQL statement and populating a gridview运行大型 SQL 语句并填充 gridview
【发布时间】:2012-04-08 04:18:55
【问题描述】:

我有一个相当大的 SQL 语句,它有许多内部连接和交叉应用语句来执行一些计算,这些计算根据之前的查询为每个条目创建新列。

我想知道在代码中从 C# 运行此查询以填充网格视图的最有效/最好的方法是什么?

分解 SQL 并用 C# 编写一些计算?

创建存储过程?

只是将 sql 作为字符串传入并创建数据集,然后将数据集绑定到 gridview 似乎花费的时间太长。

【问题讨论】:

  • 1) 返回的数据集有多大(行和列)?2) 向我们展示 SQL 语句。
  • 如果您喜欢使用 LINQ,您将能够轻松地在 C# 代码中进行计算
  • 我真的不想在此处发布 SQL,但会尝试更改它以使其更通用...根据搜索结果,它最多可以有 10,000 行,并且至少有30 列
  • 我要添加的唯一评论是我很可能将它放在存储过程中。
  • 同意。我将所有对数据库进行大量工作的代码留在 DBMS 中。

标签: c# asp.net sql gridview


【解决方案1】:

您的核心问题是您的数据库查询必须运行得更快。一旦你有了解决方案,你就可以相应地调整你的代码。

我首先要看的是优化数据库索引以提高查询性能。如果可以,请使用SQL ProfilerIndex Tuning Wizard(我认为这些工具在SQL Server Express 版本中不可用)。请注意,新索引也可能导致插入时性能下降,因此如果您的数据库需要支持高事务量,则应谨慎使用此方法。

如果您能找到一种方法来通过将查询分解为多个部分并使用过程代码聚合结果来提高查询性能,那么转移到ObjectDataSource 将是有意义的。这将使您在获取数据方面具有最大的灵活性。

作为一个起点,我会在 SQL 编辑器中对您的查询和/或部分查询进行原型设计,以便您在决定如何更改 ASP.NET 代码之前只专注于查询优化。

如果不查看架构的细节和正在使用的查询,我无法就如何优化数据提取做出进一步评论。但这应该会让你朝着正确的方向前进。

【讨论】:

  • 谢谢,我想我会试试这个并优化我的查询并将其作为存储过程运行
【解决方案2】:

看起来您的问题是您在每个 SELECT 上运行一些昂贵的计算。 正确的解决方案是预先计算计算结果并将其存储在数据库中,这样您的网格就可以简单地读取数据而无需任何计算。

当基础数据发生变化时,您可以触发重新计算结果。您可以使用触发器或调用从 C# 代码实现计算的存储过程。

【讨论】:

    【解决方案3】:

    您是否已经从代码中的其他任何地方执行任何 SQL 脚本(即您是否已经决定如何访问数据)?我问的原因是我最近使用 ADO .net 实体框架模型来弥合我的数据库和我想从数据库中的数据中使用的概念对象之间的差距,我强烈推荐它。真的很容易掌握窍门。实现 EF 模型后,只需使用 EF 模型生成的方法(即也由模型自动创建)。您刚刚从过程中检索到的类列表显然可以绑定到您喜欢的任何控件。

    http://msdn.microsoft.com/en-us/data/ff191186

    值得了解。

    【讨论】:

    • 一般来说选择实体框架模型的坏建议!? “许多”?老实说,我实际上根本不记得提出“很多”点 - 我提出的两个建议是实现一个 EF 模型(广泛使用,这没有错),并且脚本存储在一个过程中(这个线程中的许多其他人都会同意我的观点)。另外,我认为你不接受我的编辑很痛苦——你的答案的拼写和语法还有很多不足之处。
    • 所以典型的发帖人不知道数据库。伟大的。查看 Frans Bourma 的旧博客文章(谷歌帮助)关于存储过程的谬误。大多数提倡他们的人使用argumetns,表明他们不了解数据库。实体框架模型不适合报告和分析,我打赌 OP 有一个分析设置,其中包含临时查询要求,这些要求在存储过程中是不可行的。
    • 女士们女士们,把你们的战斗带到其他地方,是的,TomTom 确实像个 t*at 但嘿嘿
    • 让我们假设你是对的 TomTom - EF 对于这样的数据库问题仍然肯定不是“不相关的”(我假设你的意思是不相关的)。我的“许多”实际上是错误的建议在哪里?
    【解决方案4】:

    我想知道在代码中从 C# 运行此查询以填充网格视图的最有效/最好的方法是什么?

    你的意思是你必须从唯一一个可能的版本开始?

    执行返回表的查询的唯一方法是运行返回 DataReader 的命令。观点。如果给出了 SQL,就是这样。没有其他选择。

    注意:您可能想在这里扔掉的所有其他东西都在内部使用。他们把它包起来。

    分解 SQL 并用 C# 编写一些计算?

    我最喜欢的食物是什么?你告诉我。很大程度上取决于硬件、数据量和查询。无法回答。

    创建存储过程?

    没有区别。

    只是将 sql 作为字符串传入并创建数据集,然后将数据集绑定到 gridview 似乎花费的时间太长。

    • 什么太长了?
    • 什么需要这么长时间?加载 1 亿行? SQL Server 处理?所有这些都决定了优化。请提供相关信息 - 让我们知道时间都花在了哪里。

    也就是说:不使用数据集,而是在后台填充可观察的对象集合,至少可以在填充列表时显示结果。

    【讨论】:

    • 我做到了。我不喜欢‘我最喜欢的食物是什么?你告诉我'。对于只是寻求帮助和建议的人来说,这简直是讽刺。创建存储过程确实会有所不同,无论是性能还是在组织和解决方案的“适当”结构方面。另外 - 拼写和语法是“靠墙”,如果您不接受编辑,请接受反对票。
    • 我来这里不是为了友好。我来这里是为了尽我所能来回报我定期得到的帮助,我想我已经做到了。我向全世界的许多软件开发人员推荐了一个解决方案,它比我和你更有能力,每天都在行业标准解决方案中使用。我现在很难理解你。
    • 顺便说一句 - 你拒绝我的编辑选择了糟糕的拼写和语法 - 这是无能和无知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多