更新SQL中的大量列

时间:2015-10-26 09:03:41

标签: sql c sql-update odbc

在云上的数据库中,我有一个包含大约一万列的表。我将每隔几分钟用一些本地数据更新它,这是本地代码的输出(在my_col_val []之下)。我的问题是:

1-更新每一行的最佳和最快方法是什么? (对于Loop?)

2-使用char指针保存SQL查询(szSQL [])是包含大小为1MB的SQL问题的最佳方法吗?

我的代码(在C中)现在大致如下:

char * szSQL[?];// (What is the best size?)
char * my_col [?];
char * my_col_val[?]; 
SQLHSTMT    hStmt = NULL;

sprintf(szSQL, "UPDATE my_table SET %s='%s',...,%s='%s'\ // there should be 8000 %s='%s' statements
 WHERE ID = my_ID FROM my_table", my_col[0], my_col_val[0], ..., my_col[n], my_col_val[n]); //wher n=8000
SQLExecDirect(hstm, szSQL, SQL_NTS);

2 个答案:

答案 0 :(得分:2)

我喜欢@Takarii使用三张桌子的解决方案。最佳策略包括:1)如何插入新的测量行和2)它将用于什么。后者特别令人感兴趣,因为它可能需要额外的索引,并且这些必须在执行insert语句时由db维护。需要的索引最少,插入的速度越快。例如,虽然三个表之间存在关系,但测量表无法将其外键声明为其他表,从而减少了此索引的开销。

随着表的增长和增长,数据库将越来越慢。然后,为每天的测量创建一个新表是有益的。

由于传感器数据的类型不同,数据可以作为字符串数据插入,只能由检索程序解析。

另一个帮助可能是,如果仅定期检索记录的数据,可以将测量结果写入平面文件并定期插入,每小时一次。

也许这些想法可能有所帮助。

答案 1 :(得分:1)

根据您的评论和上述请求,以下是我的建议:

1)正如您所建议的那样,每台机器都有一个单独的表(不理想,但会起作用)

根据这个假设,您需要为每个传感器设置一个单独的行,但是当您需要添加其他计算机时会出现问题 - 通常表创建权限受sysadmins限制

2)多个表用于识别传感器信息和分配,以及统一的结果表。

表1 - 机器

表2 - 传感器

表3 - 结果

表1将包含有关为其分配传感器的机器的信息(machine_id, **insert extra columns as needed**)

表2包含传感器信息 - 这是您可能的10,000列的位置,但它们现在是ID为(sensor_id, sensor_name)的行

表3包含传感器读数的结果,分配给传感器,然后分配给机器(result_id, machine_id(fk), sensor_id(fk), result)

然后使用连接,您可以根据需要提取每台计算机的数据。这将比您当前的10k色谱柱设计更有效