我正在构建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报表中以上述方式执行此操作,则运行速度非常慢。我怎样才能更快地完成它?
答案 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'
替换您的选择条件。无论如何,这将是最好的选择。
或者有人可能会购买更快的硬件。
如果所有这些都是不可能的,那么就不可能更快地获得您的查询。