Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时尝试优化SQL或只是在表中汇总数据?_Sql_Sql Server - Fatal编程技术网

何时尝试优化SQL或只是在表中汇总数据?

何时尝试优化SQL或只是在表中汇总数据?,sql,sql-server,Sql,Sql Server,我在SQL Server 2008数据库中有一个EMPLOYEE表,该表每年多次存储员工(~80000+)的信息。例如,每个员工在不同年份的数据可能有10个不同的实例 我通过一个web应用程序报告这些数据,主要是通过直接查询EMPLOYEE表来报告,使用函数获取报告所需的计算或派生信息 这些函数有时必须引用一个EMPLOYEE\u DETAIL表,该表每年有100000多行-因此,现在我开始编写一些报告类型查询,一些查询运行大约需要5-10秒,这有点太慢了 我的问题是,在这种情况下,我是否应该尝

我在SQL Server 2008数据库中有一个
EMPLOYEE
表,该表每年多次存储员工(~80000+)的信息。例如,每个员工在不同年份的数据可能有10个不同的实例

我通过一个web应用程序报告这些数据,主要是通过直接查询
EMPLOYEE
表来报告,使用函数获取报告所需的计算或派生信息

这些函数有时必须引用一个
EMPLOYEE\u DETAIL
表,该表每年有100000多行-因此,现在我开始编写一些报告类型查询,一些查询运行大约需要5-10秒,这有点太慢了

我的问题是,在这种情况下,我是否应该尝试调优函数之类的东西,所以我
始终可以直接查询数据以进行报告(实时)
,还是通过过程或保存的查询将所需数据汇总到静态表中并用于任何报告的更好方法


我想报告需求的任何变化都可以反映在我使用的“总结机制”中……但我不知道该怎么做……

在重构函数之前,我建议您先看看索引。你会惊讶于构造良好的索引能带来多大的不同。此外,索引维护所需的工作量可能比“汇总机制”要少。在重构函数之前,我建议您查看一下索引。你会惊讶于构造良好的索引能带来多大的不同。此外,索引维护可能需要比“汇总机制”更少的工作

我的问题是,在这样的情况下,我是否应该尝试调整函数之类的东西 始终可以直接查询数据以进行报告(实时),还是通过过程或保存的查询将所需数据汇总到静态表中并用于任何报告的更好方法

您可以将数据汇总为日、月等数据块,将这些数据块汇总到您的报告中,并在过去的某些数据发生更改时使其无效(以更正错误等)

我的问题是,在这样的情况下,我是否应该尝试调整函数之类的东西 始终可以直接查询数据以进行报告(实时),还是通过过程或保存的查询将所需数据汇总到静态表中并用于任何报告的更好方法


您可以将数据汇总为日、月等数据块,将这些数据块汇总到您的报告中,并在过去的数据发生变化时使其失效(以纠正错误等)

在实时报告和性能方面,您的客户满意什么

话虽如此,优化您的查询/索引可能是值得的。

如果您不能通过修改索引来提高性能,我会感到惊讶。

在实时报告和性能方面,您的客户满意什么

话虽如此,优化您的查询/索引可能是值得的。

如果您不能通过修改索引来提高性能,我会感到惊讶。

我个人会使用以下方法:

  • 如果可以优化函数,例如,添加一个专门适合查询需要的索引,或者在表上使用不同的聚集索引,那么就可以对其进行优化。如果你不必处理冗余问题,生活就会轻松得多

  • 如果您觉得已经到了无法再进行优化的地步(无论您做什么,从磁盘获取几千个碎片页面都需要一段时间),那么最好以冗余方式存储一些数据,而不是完全重新构建存储数据的方式。如果你走这条路,要非常小心避免不一致

    例如,SQL Server允许您使用,它以冗余方式存储摘要数据(即某些视图的结果),以便快速访问,但也可以自动更新该数据。当然,修改基础表时会有性能损失,因此您必须检查这是否符合您的需要

    Ohtherwise,如果数据不必是最新的,那么定期重新计算总结(在晚上,当没有人工作时)可能是一种方法


    • 就个人而言,我会使用以下方法:

      • 如果可以优化函数,例如,添加一个专门适合查询需要的索引,或者在表上使用不同的聚集索引,那么就可以对其进行优化。如果你不必处理冗余问题,生活就会轻松得多

      • 如果您觉得已经到了无法再进行优化的地步(无论您做什么,从磁盘获取几千个碎片页面都需要一段时间),那么最好以冗余方式存储一些数据,而不是完全重新构建存储数据的方式。如果你走这条路,要非常小心避免不一致

        例如,SQL Server允许您使用,它以冗余方式存储摘要数据(即某些视图的结果),以便快速访问,但也可以自动更新该数据。当然,修改基础表时会有性能损失,因此您必须检查这是否符合您的需要

        Ohtherwise,如果数据不必是最新的,那么定期重新计算总结(在晚上,当没有人工作时)可能是一种方法


      在尝试静态表路由之前,检查索引、返工功能、购买更多硬件、做任何事情

      在尝试静态表路由之前,检查索引、修改函数、购买更多硬件、做任何事情

      100000行/年(大概总共100万行)算不了什么。如果这些查询需要5-10秒才能运行,则存在问题