改进Crystal报表中的sql查询

时间:2014-05-08 10:37:19

标签: sql crystal-reports

我正在构建Crystal报告。查询来自一个巨大的表,但我只能读取并且无法添加索引。该表看起来像:

SampleTable (PersonID INT, Country VARCHAR(10), Purchase Real, PurchaseDateTime DateTime)

这里PersonID是一个键(索引),但我需要查询与PersonID无关的内容:

SELECT  Country
       , Sum(Purchase) As Purchase
 FROM  SampleTable
 WHERE PurchaseDateTime >= '2013-04-01 00:00:00'
 AND   PurchaseDateTime <  '2013-05-01 00:00:00'
 GROUP BY Country

如果我在Crystal报表中以上述方式执行此操作,则运行速度非常慢。我怎样才能更快地完成它?

1 个答案:

答案 0 :(得分:1)

您的查询非常完美。你可能无法以某种方式重写它来加快速度。执行查询时,将始终在表上完成全表扫描。即使使用PurchaseDateTime上的索引,这也许不会改变,因为一个月内有数百万秒,因此dbms可能仍然觉得最好进行全表扫描。我看到的唯一选择是:如果您的dbms支持查询提示,您可以通过在并行线程中运行查询来加速查询。以下是在Oracle中如何做到这一点:

SELECT /*+ parallel(SampleTable,4) */
  Country,
  Sum(Purchase) As Purchase
 FROM  SampleTable
 WHERE PurchaseDateTime >= '2013-04-01 00:00:00'
 AND   PurchaseDateTime <  '2013-05-01 00:00:00'
 GROUP BY Country;

加速这种情况的唯一方法是更改​​数据库或硬件。

数据库人员可能能够设置一个表选项,以便选择在多个并行线程中执行。这样可以加快您的执行时间,而无需进行任何更改。或者他们可能能够安装基于to_char(PurchaseDateTime,'yyyymm')的函数索引或dbms为获取月份而提供的任何函数。然后,您将WHERE to_char(PurchaseDateTime,'yyyymm') = '201304'替换您的选择条件。无论如何,这将是最好的选择。

或者有人可能会购买更快的硬件。

如果所有这些都是不可能的,那么就不可能更快地获得您的查询。