【发布时间】:2013-07-08 15:51:23
【问题描述】:
编辑:这是一组更完整的代码,可以准确显示下面的答案。
libname output '/data/files/jeff'
%let DateStart = '01Jan2013'd;
%let DateEnd = '01Jun2013'd;
proc sql;
CREATE TABLE output.id AS (
SELECT DISTINCT id
FROM mydb.sale_volume AS sv
WHERE sv.category IN ('a', 'b', 'c') AND
sv.trans_date BETWEEN &DateStart AND &DateEnd
)
CREATE TABLE output.sums AS (
SELECT id, SUM(sales)
FROM mydb.sale_volue AS sv
INNER JOIN output.id AS ids
ON ids.id = sv.id
WHERE sv.trans_date BETWEEN &DateStart AND &DateEnd
GROUP BY id
)
run;
目标是简单地根据类别成员在表中查询某些 id。然后我总结了这些成员在所有类别中的活动。
上述方法远慢于:
- 运行第一个查询以获取子集
- 运行第二次查询每个 ID 的总和
- 运行内部连接两个结果集的第三个查询。
如果我理解正确,确保我的所有代码完全通过而不是交叉加载可能更有效。
在昨天发布问题后,一位成员建议我可能会从针对我的情况提出一个更具体的关于性能的单独问题中受益。
我正在使用 SAS Enterprise Guide 编写一些程序/数据查询。我无权修改存储在“Teradata”中的基础数据。
我的基本问题是在这种环境下编写高效的 SQL 查询。例如,我在一个大表(包含数千万条记录)中查询一小部分 ID。然后,我使用这个子集再次查询更大的表:
proc sql;
CREATE TABLE subset AS (
SELECT
id
FROM
bigTable
WHERE
someValue = x AND
date BETWEEN a AND b
)
这可以在几秒钟内完成并返回 90k ID。接下来,我想针对大表查询这组ID,问题接踵而至。我想对 ID 的值随时间求和:
proc sql;
CREATE TABLE subset_data AS (
SELECT
bigTable.id,
SUM(bigTable.value) AS total
FROM
bigTable
INNER JOIN subset
ON subset.id = bigTable.id
WHERE
bigTable.date BETWEEN a AND b
GROUP BY
bigTable.id
)
无论出于何种原因,这都需要很长时间。不同之处在于第一个查询标记了“someValue”。第二个查看所有活动,无论“someValue”中有什么。例如,我可以标记每个订购披萨的顾客。然后,我会查看所有订购比萨饼的顾客的每次购买情况。
我对 SAS 并不太熟悉,因此我正在寻找有关如何更有效地执行此操作或加快速度的任何建议。我愿意接受任何想法或建议,如果我能提供更多细节,请告诉我。我想我只是对第二个查询需要这么长时间来处理感到惊讶。
【问题讨论】: