在云上的数据库中,我有一个包含大约一万列的表。我将每隔几分钟用一些本地数据更新它,这是本地代码的输出(在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);
答案 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色谱柱设计更有效