亲爱的stackoverflow管理员和成员:
您好,祝大家度过愉快的一天。
我一直在开发RDL(并且它在SQL Server 2008 R2中使用存储过程来获取数据)在我正在为此工作的这家公司工作了很长一段时间。我们以前的数据库管理员是检查我的存储过程的人,并建议我在存储过程需要增强时进行一些更改。一年后他辞职了。 : - (
来了这个新的数据库管理员,现在他希望我修改我的所有存储过程指定。那些使用具有ORDER BY
子句的存储过程的RDL。 :-(
他说排序必须在报告/ RDL中完成,因为它会以某种方式卸载数据库中的一些开销,这反过来会使我的报告更快地生成数据。
我现在的问题是,他对此是否正确?是否有额外的阅读,我可以阅读,以配合他的建议?或者这是他建议的一个简单的经验法则我从那以后没有实践过? (正如他所说,没有ORDER BY
子句,并且存储过程中没有格式化(例如日期,时间等),在RDL中进行所有格式化和排序。我仍然有一半的时间去做我的更改但是我想了解更多关于他一直在指导的内容。请告知。
感谢所有人的力量。 : - )
非常真实,
Mark Squall
答案 0 :(得分:1)
正如我所评论的那样,排序问题归结为在客户端或服务器端进行排序。关联的问题可能会提供关于每个选项的更有见地的讨论,但简而言之,没有明确的答案,每个都有权衡,你牺牲的最终取决于你的特定用例。
正如您所提到的那样" RDL",我认为您指的是SQL Server Reporting Services,对吧?如果是这样,那么情况会有所不同,因为"服务器"和#34;客户"实际上是两个不同的程序可能在同一台机器上运行(如果我错了,请纠正我。)
基本上,在服务器中执行此操作(即ORDER BY
),DB引擎可以有效地完成更多工作,正如您的DBA所说。好消息是,SQL可能有更多的工具来提供比客户端更快的响应(索引,统计数据,可能更快的CPU等)以及分页和TOP
之类的操作,它几乎总是更好的选择。在数据库中执行,因为客户端需要获取更多数据来提供结果。
排序客户端具有分发排序的优势。当许多客户端一起使用数据库时,让他们进行排序可以缓解服务器上的CPU压力(这很可能是您的DBA推理背后的原因)。此外,它还使客户能够有效地对用户操作的数据进行重新排序,而无需再次访问服务器(除非涉及分页)。
至于你提到的格式化,我倾向于同意DBA。大多数情况下,在客户端更好地处理格式化而不是由DB提供服务,因为它在每个地方的显示方式都是特定的。拥有存储过程格式的日期和此类方法将其与特定报告相关联,这意味着您无法轻松地将其重新用于其他目的。客户端工具通常更好地为最终用户显示内容,甚至可以考虑本地化(小数位,日期格式排序,填充等)等内容,尽管可能在服务器中执行,但通常涉及更多工作,甚至复制格式化功能。