我不知道在SQL Server中使用临时表或在C#中使用DataTable是否更好。以下是报告的范围:它将被复制到包含大约10个工作表的工作簿中 - 每个工作表包含大约1000行和大约30列,因此它是大量数据。有一些指导,但我找不到任何具体的数据量对于DataTable太多。根据{{3}},考虑到我的列数,16M行但我的数据集看起来很笨重。另外,我要么必须进行多次SQL查询才能收集报表中的数据,要么尝试在SQL中编写存储过程来收集数据。我怎么弄清楚这个窘境?
答案 0 :(得分:1)
这里有很多缺失的上下文 - 如何访问和运行此报告?这会像每天的脚本事件一样运行吗?
您是否考虑过SSRS?
在我看来,最好通过在数据库中创建视图或存储过程来抽象出业务逻辑。存储过程可能是要走的路,但它实际上取决于您的特定环境。然后,您可以指出要在数据库对象中使用的任何工具。这有几个好处:
如果您最终拥有不同版本或不同格式的报告,并且您的逻辑发生了变化,您可以在一个地方而不是多个地方更新逻辑。
您的代码更简单,更清晰,通常是:
select v.col1, v.col2, v.col3
from MY_VIEW v
where v.date between @startdate and @enddate
我假设您的10个电子表格将类似于
摘要页|部门1 |部门2 | ...
因此,你可以创建一个通用的View或SP,创建一个链接到db对象的主电子表格,从SQL中提取所有相关数据,并使用数据透视表或过滤器或任何你想要的其他内容,并使用它来生成副本被送出去。
但是在遇到所有麻烦之前,我会确保SSRS不是一个选项,因为如果你可以使用它,它有很多功能,可以让你的生活更轻松(导出到Excel,自动日期)参数,预定执行,电子邮件订阅等。)
答案 1 :(得分:1)
我的经验法则是,如果它可以在数据库服务器上处理,它可能应该。请记住,无论您的C#代码有多高效,SQL Server最有可能更快,更高效,毕竟它是专为数据操作而设计的。
使用#temp表并不可耻。他们维护统计数据,可以编制索引和/或操纵。最近的一个例子,开发人员使用cte创建了一个公认的优雅查询,使用#temps在1秒内对我的性能为12-14秒。
现在,一个精心构建的存储过程可以为您的工作表生成并返回10个数据集。如果您正在使用像SpreadSheetLight这样的产品(有许多可用选项),那么传递结果和创建选项卡(没有单元级循环......除非您需要或需要)就变得很小了。
我还想补充一点,你可以通过让SQL Server做繁重的工作来大大减少接触点的数量并更好地执行业务逻辑。例如,客户引入了6W风险等级,基本上为6.5。遗留报告的数量必须更新,而我只需要将6W添加到我的映射表中。