我想知道对我来说似乎无效的事情。
我有2个表,一个非常大的表DATA(数百万行和数百列列),其中有一个ID作为主键。
然后我有了另一个表NEW_COL,该表具有可变的行(1到数百万个),但总是2个cols:id和new_col_name。
我想更新第一个表,向其中添加new_data。
当然,我知道如何使用proc sql / left join或数据步骤/合并来做到这一点。
就我所见,随着时间的推移,这似乎效率很低(这可能是错误的),这两种方式完全重写了巨大的表,即使NEW_DATA只有1行(几乎1分钟)。
我尝试执行2条sql,使用alter table add列然后更新,但是waaaaaaaay太慢了,因为加入联接的更新似乎根本没有效率。
那么,有没有一种有效的方法可以在不重写此巨大表的情况下向现有表“添加列”?
谢谢!
答案 0 :(得分:2)
SAS数据集是行存储,而不是列存储,就像其他数据库中的表一样。这样,添加行远比添加列容易和有效。键连接视图可以说是将列添加到数据矩形的最“有效”方法。
如果您添加列的频率太高而导致1分钟的资源入侵成为问题,则您可能需要使用更快的驱动器,较少争议的操作环境或更多的内存来升级硬件,如果新列经常使用SASFILE
本质上是暂时的。
答案 1 :(得分:2)
@Richard的答案很完美。如果您要定期添加列,那么您的设计就会出现问题。您要么需要提供有关您正在做的事情的更多详细信息,要么有人可以建议您。
我会尝试哈希联接。您可以找到用于简单哈希联接的代码。这是一种有效的联接方式,因为在您的情况下,如果内存中有一个大表和一个小表,则它比左联接要好得多。我使用了各种连接,查询运行时间大大减少了(达到10的数量级)
通过更改表方法,您正在重写表,并且这也会导致表上的锁定,并且没有人可以使用该表。
您应该在工作量较少时执行此联接,这意味着在不在办公室的时候,您可能需要在晚上有更多SAS资源可用时安排作业
答案 2 :(得分:0)
感谢您的回答。
要添加信息,我对表锁定,平衡负载等没有任何限制,因为它是我使用的“ projet工具”脚本。
目标是,在数据准备步骤“起点数据生成器”中,重新计算一个已经存在的数据,或添加一个新数据(虽然很少,但仍然很规则)。因此,我只是不想浪费时间等待整个表重写,而只需要为特定行更新一个数据即可。
当我监视伺服器时,数据的计算和连接步骤非常快。但是,当我只希望tu更新1行时,我看到整个表都在重写。对我来说似乎浪费了资源。
但是,这似乎是必须执行的步骤,因此不能做太多事情。
太糟糕了。