运行大型SQL语句并填充网格视图

5

我有一条相当冗长的SQL语句,其中包含多个内部连接和交叉应用语句,用于进行某些计算,并根据上一个查询为每个条目创建新列。

我想知道在C#代码中运行此查询以填充GridView的最有效/最佳方法是什么?

将SQL拆分并将其中一些计算写入C#中?

创建存储过程?

仅将sql作为字符串传递,并创建数据集,然后将数据集绑定到gridview似乎太慢了。


  1. 返回的数据集有多大(行和列)?
  2. 给我们展示SQL语句。
- RBarryYoung
如果你喜欢使用 LINQ,那么你可以很容易地在你的 C# 代码中进行计算。 - huMpty duMpty
我不太想在这里发布SQL,但会尝试更改它以使其更通用...根据搜索条件,它可能有多达10,000行,并且至少有30列。 - user1186144
1
我唯一要添加的评论是,我很可能会将这个放在存储过程中。 - Wayne In Yak
同意。我将把任何对数据库进行大量工作的代码留在DBMS中。 - user1017882
4个回答

3
你的核心问题是数据库查询速度太慢。一旦你有了解决方案,就可以相应地调整代码。
我首先要看的是优化数据库索引以提高查询性能。如果可以的话,使用SQL ProfilerIndex Tuning Wizard(我认为这些工具在SQL Server Express版本中不可用)。请注意,新索引也可能导致插入性能下降,因此如果你的数据库需要支持高事务量,则应谨慎使用此方法。
如果你可以通过将查询分解为部分并使用过程化代码聚合结果来提高查询性能,那么转移到ObjectDataSource就有意义了。这将允许你最大限度地灵活获取数据。
作为起点,我建议在SQL编辑器中原型化您的查询和/或查询部分,以便您可以专注于仅查询优化,然后再做出任何有关ASP.NET代码如何更改的决策。
我无法进一步评论如何优化数据提取,而不查看您的模式和使用的查询的具体细节。但这应该让您朝正确的方向前进。

谢谢,我想我会尝试这个并优化我的查询,将其作为存储过程运行。 - user1186144

2

看起来你的问题是在每次SELECT时都运行一些昂贵的计算。

解决这个问题的正确方法是预先计算计算结果并将其存储在数据库中,这样你的网格就可以简单地读取数据而不需要进行任何计算。

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


1

你是否已经在代码的其他地方执行了任何SQL脚本(例如,您已经决定如何访问数据)?我问这个问题是因为最近我使用ADO .net实体框架模型来弥合数据库和我想要从数据库中处理的概念对象之间的差距,并且我强烈推荐它。非常容易掌握。一旦您实现了EF模型,只需使用EF模型生成的方法调用存储过程(是的,我建议您将查询保存在存储过程中),并将其提取到自动创建的类中。然后,您刚刚从该过程检索的类列表可以显然地绑定到任何您喜欢的控件。

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

这值得知道。


1
普遍建议选择实体框架模型是错误的吗?“许多”?老实说,我并不记得提出“许多”观点 - 我提出的两个建议是实现EF模型(广泛使用,没有问题),以及将脚本存储在过程中(这个建议很多其他人在这个帖子中也同意)。另外,我认为你不接受我的编辑有点不太好 - 你的回答拼写和语法有待改进。 - user1017882
典型的海报制作者不了解数据库。太好了。查看Frans Bourma的旧博客文章(谷歌可以帮助)关于存储过程谬论的内容。大多数支持它们的人使用的论点表明他们不了解数据库。Entity Framework模型不适合报告和分析,我打赌OP有一个分析设置,需要按需查询要求,这在存储过程中是不可行的。 - TomTom
1
女士们,请把你们的争斗带到别处去,是的,TomTom看起来像个混蛋,但是嘿嘿。 - user1186144
假设你是对的TomTom - EF在这样的数据库问题中仍然绝对不是“无关紧要”的(我假设你的意思是无关紧要)。而我的“许多”错误建议在哪里? - user1017882

-2
我在想从C#代码中运行此查询以填充gridview的最有效/最佳方法是什么?
你是说从你唯一可用的版本开始吗?
执行返回表的查询的唯一方法是运行返回DataReader的Command。如果SQL已经给出,那就是它了。没有其他选择。
注意:您可能想要在此处扔掉的所有其他东西都在内部使用它们。他们将其包装起来。
分解SQL并在C#中编写一些计算?
我的最爱食品是什么?你告诉我。这在很大程度上取决于硬件,数据量和查询。无法回答。
创建存储过程?
没有区别。
只是将sql作为字符串传递并创建数据集,然后将数据集绑定到gridview似乎需要太长时间。
什么是太长?
为什么需要那么长时间?加载1亿行? SQL Server处理?所有这些都确定优化。请提供相关信息-让我们知道时间花在哪里。

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


4
我明白了。我不欣赏像“我的最爱食物是什么?你告诉我”这样的评论,这似乎有点讽刺,对于只是寻求帮助和建议的人来说。创建存储过程确实会产生差异,无论是性能方面还是在组织和解决方案的“适当”结构方面。此外,拼写和语法有些错误,如果你不接受编辑,则可以接受一个反对票。 - user1017882
我在这里不是为了友好相处。我在这里尽我所能回报那些经常给予我的帮助,我认为我已经做到了。我推荐的解决方案被全球许多比你和我更有能力的软件开发人员日常使用于行业标准解决方案中。现在我已经开始难以理解你的意思了。 - user1017882
2
顺便说一下 - 拒绝我的编辑并选择了糟糕的拼写和语法 - 这是无能和无知。 - user1017882

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接