数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

2
重新设计数据库的机会:用于此传感器数据收集的表格设计如何?
背景 我有一个大约2000个传感器的网络,每个传感器都有大约100个数据点,我们每隔10分钟收集一次。这些数据点通常是int值,但有些是字符串和浮点数。此数据应存储90天,如果可能的话,还可以保留更长时间。 数据库设计 当最初负责该项目时,我编写了一个C#应用程序,该程序为每个传感器编写了逗号分隔的文件。当时没有那么多,当有人想查看趋势时,我们将在Excel中打开csv并根据需要绘制图形。 事情发展了,我们切换到了MySQL数据库。我为每个传感器创建了一个表格(是的,我知道很多表格!);它一直运行良好,但是有一些局限性。拥有如此多的表,显然不可能编写查询来查找特定值时在所有传感器中查找数据的查询。 对于下一个版本,我切换到Microsoft SQL Server Express,并将所有传感器数据放入一个大表中。这也有效,并且让我们进行查询以在所有感兴趣的传感器中查找值。但是,我遇到了Express版本的10GB限制,因此决定改回MySQL,而不是投资于SQL Server Standard。 问题 我对MySQL的性能和可伸缩性感到满意,但不确定是否坚持采用“一个表中的所有数据”方法是最好的。一张桌子上的10GB似乎要求使用其他设计。我应该提到仍然需要查询图形数据,而且我担心查询图形时会出现性能问题,例如,整个90天中一个传感器的温度数据。(换句话说,图形应该是可以快速生成的图形,而不必等待SQL对大量数据进行排序以隔离感兴趣的传感器。) 是否应该以某种方式拆分此表以提高性能?拥有这么大的桌子不是很平常吗? 我在Sensor ID和Timestamp列上都有索引,这几乎是任何查询的定义边界。(即从时间A到时间B获取传感器X的数据)。 我已经阅读了一些有关分片和分区的知识,但是在这种情况下,觉得不合适。 编辑: 根据到目前为止的评论和答案,一些其他信息可能会有所帮助: 不定期存储:目前,我不存储90天以上的数据。每天,我都会运行一个查询,以删除90天以上的数据。如果将来它变得很重要,我会存储更多,但现在就足够了。这有助于保持大小和性能更高。 引擎类型:原始的MySQL实现使用MyISAM。这次为新实现创建表时(一个数据表而不是多个数据表),它们默认为InnoDB。我不认为我需要其中之一。 标准化:当然,除了数据收集表外,还有其他表。这些支持表存储诸如传感器的网络信息,用户的登录信息等内容。据我所知,没有太多要标准化的东西。数据表具有如此多列的原因是每个传感器都有很多变量。(多个温度,光照水平,气压等)。对我进行归一化意味着没有冗余数据或重复的组。(至少对于1NF。)对于给定的传感器,在特定时间存储所有值需要一行数据,并且其中不涉及1:N关系(我知道)。 我可以在功能上分解表,例如在一个表中创建所有与温度相关的值,在另一个表中创建与气压相关的所有值。虽然这可能会提高仅进行温度查询的人员的效率,但我仍然必须一次插入所有数据。尽管如此,效率提高对于SELECT操作还是值得的。显然,最好根据用户请求数据的频率垂直拆分表。也许这就是我应该做的。我想在问我一个问题时正在寻求确认,这样做是值得的。 编辑2: 数据使用:最终,绝不会查看或需要很多数据,因为我们通常只关注有问题的项目。但是,在尝试发现问题时,我们使用各种工具来搜索数据并确定要放大的项目。 例如,我们注意到内存使用率值(特定于客户的专有软件程序)与重启/崩溃之间的相关性。我收集的数据点之一与此内存使用情况有关,并且我能够查看历史数据以显示超出特定内存使用量后设备变得不稳定。今天,对于运行该软件的部分设备,我检查了该值,如果该值过高,则发出重新启动命令。在发现这一点之前,我认为收集这些数据没有价值。 因此,我坚持要收集并存储大约100个数据点,即使该值值得怀疑。但是在正常的日常使用中,用户通常会检查其中的十几个参数。如果用户对特定地理区域感兴趣,则他(可以使用软件)可能会为几十个传感器生成数据的图形或电子表格。查看30天的图表并显示两条或三条显示温度,气压和光照水平等曲线的情况并不少见。这样做将运行类似于以下的查询: SELECT sensor_id, location, data_timestamp, temp1, air1, light1 FROM data WHERE data_timestamp >= '2012-02-01' AND sensor_id IN (1, 2, 3); (在原始的MySQL版本中,每个传感器都有自己的表,将发出三个单独的查询,但结果将通过软件合并以创建图形。) 由于该data表包含很多行(〜1000万),尽管在id和上都有索引data_timestamp,所以性能明显比多表方案(9秒内返回4500行,而在此示例中不到1秒)要好。在多表模式中,找到哪些传感器满足特定条件的能力实际上为零,因此,移至单个表的原因。 这类查询可以由多个用户快速连续地完成,因为他们选择了不同的数据组并比较每个结果中的图形。每个图形或电子表格等待近10秒可能会令人沮丧。 90天后数据将被丢弃。可以将其存档,但当前不是必需的。 …

3
如果不存在,则插入
我在存储过程中的插入出现并发问题。该过程的相关部分是: select @_id = Id from table1 where othervalue = @_othervalue IF( @_id IS NULL) BEGIN insert into table1 (othervalue) values (@_othervalue) select @_id = Id from table1 where othervalue = @_othervalue END 当我们同时运行3或4个这些存储的proc时,有时会得到多个插入。 我打算像这样修复此问题: insert into table1 (othervalue) select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) where NOT EXISTS …

4
使用同义词避免创建重复表是一个好主意吗?
我们有3个完全相同的数据库副本。所有3个数据库都有一个Users表,并且一个用户将始终在所有3个数据库中使用完全相同的设置。每当我们要添加或编辑用户时,我们都必须更新3个数据库。 Users从数据库2和3中删除该表并将其替换为Synonym指向数据库1的a 是一个更好的主意吗? 这是我能想到的优点/缺点: 优点 易于维护。可以在一个位置而不是3个位置更新用户 用户ID将在数据库之间匹配(这一点很重要,因为很多附加应用程序都基于UserId) 缺点 不要以为这是标准程序,所以可能会造成混淆 用户在数据库之间必须具有相同的设置 (从下面的gbn回答)如果数据库1曾经出现故障,则数据库2和3也将不可用。还存在潜在的问题,即在还原事件中数据不一致 这是我正在考虑的一个选项,用于几个不同的表,这些表包含数据库之间相同的设置,而不仅仅是Users表。我在示例中使用Users是因为它很容易理解。

3
不使用时关闭SQL Server的最佳和最简便的方法是什么?
情况:通常只使用客户端工具连接到其他非本地sql服务器的开发人员工作站。但是,在极少数情况下,拥有完整版本的sql server进行本地开发将是有益的。为了不浪费所有时间运行sql server的系统资源,我想了解最好的“关闭它”方法,同时仍然允许使用客户端工具(management studio等)。
13 sql-server 


2
死锁错误未返回死锁SQL
Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 当我的一个网站繁忙时,我会随机收到此错误。我大致知道它在哪组表上发生,但是根据我在其他程序中的经验,我通常会在发生死锁的地方返回SQL。我应该打开一个标志来允许这种情况发生吗? 我将尝试将死锁本身作为一个单独的问题进行调试,因为这是我目前的主要问题。 我正在使用SQL Server 2008标准版。


2
如何在PostgreSQL中将现有索引提升为主键
我知道如何在表中创建主键,但是如何使现有索引成为主键?我正在尝试将现有表从一个数据库复制到另一个数据库。当我显示表格时,底部的索引采用以下形式: "my_index" PRIMARY KEY, btree (column1, column2) 我用以下方法创建了索引: CREATE INDEX my_index ON my_table (column1, column2) 但我不知道如何使其成为主键... 更新:我的服务器版本是8.3.3


3
有开源元数据管理解决方案吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 6年前关闭。 有开源元数据管理解决方案吗?我想创建一个元数据存储库,其中将保存数百个企业数据库的数据库模式,表和数据项的元数据的详细信息。 我对可以自动查询数据库架构数据以跟踪与表相关的元数据中的更改的东西特别感兴趣。即更改列数据大小,添加的表和列等。
13 schema  metadata 

2
如何在listener.ora中配置没有SID_LIST_LISTENER的Oracle Listener?
我可以使用以下listener.ora访问ORACLE 11g服务器 # listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.111)(PORT = 1521)) ) ) 并为该服务器上的所有实例提供服务,我可以通过以下方式进行验证 lsnrctl status 我的问题是,当我在虚拟机中全新安装Oracle 11g时,必须使用listener.ora # listener.ora Network Configuration …

3
设计比赛数据库的最佳方法
我正在创建一个网页,用于在即将到来的2012年欧洲杯足球锦标赛的所有比赛中下注。需要一些帮助来确定淘汰赛阶段应采取的方法。 我在下面创建了一个样机,当存储所有“已知”小组赛比赛的结果时,我非常满意。这种设计使检查用户是否正确下注变得非常容易。 但是,存储四分之一决赛和半决赛的最佳方法是什么?这些比赛取决于小组赛的结果。 我想到的一种方法是将所有比赛添加到matches表中,但是在淘汰赛阶段将不同的变量或标识符分配给主队/客队。然后将其他标识符映射到团队的其他表中……这可能有用,但感觉不正确。


5
SQL Server 2008全文索引似乎从未完成
我们的网站具有一个SQL Server 2008 R2 Express Edition数据库,该数据库具有用于我们网站搜索的全文索引。每次在其中一个索引表中添加或更新新记录时,索引过程似乎永远不会完成。 在过去的几周中,我一直在使用此网站上的基本相同的查询来监视状态:http : //www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this这么长时间的人口 这是我运行查询时看到的(单击以查看完整大小): 索引表中的最新记录永远不会完成,并且不可搜索。即使表中没有太多数据,我也已经等了几天看索引是否完成,但是什么都没有改变。 我能够成功完成索引编制的唯一方法是重建目录或删除并重新创建所有索引。 每次这样做,一旦添加了第一个新记录,就会再次出现相同的问题。 以下是服务器统计信息,以防万一: 四核AMD Opteron 2.34GHz 4GB RAM Windows Server 2008 R2企业SP1 x64 具有高级服务x64的SQL Server 2008 R2 Express Edition

4
PostgreSQL设计工具
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我将要设计一个要与PostgreSQL一起运行的数据库。我习惯了用于MySQL数据库的称为MySQL Workbench的宏伟工具。它很有用,而且看起来不错,这是我希望从数据库设计软件获得的。 如果我要学习一种新的数据库设计工具,那么我希望它成为最受欢迎的工具。因此,我的问题是:在PostgreSQL中设计数据库最流行的工具是什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.