数据库管理员

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

2
我应该如何为“非此即彼”的关系建模?
假设我有一个名为Software的实体,并且有两个子类型FreeSoftware和NonFreeSoftware。NonFreeSoftware实体具有购买日期,供应商等属性。FreeSoftware实体具有许可证,源代码url等属性。 因此,如果我想为另一个实体OperatingSystem建模,应该怎么做?与软件之间存在“是”关系,而与FreeSoftware和NonFreeSoftware之间存在“或者”关系。 我认为我在分析此层次结构时缺少一些东西。

1
CAP定理与BASE(NoSQL)
CAP定理与BASE(NoSQL) 嗨,我正在尝试写一篇有关NoSQL的论文,并将CAP定理描述为(如果不是全部的话)大多数NoSQL数据库都遵守。稍后,我阅读了一篇有关NoSQL与RDBMS之间差异的论文,该论文指出NoSQL数据库使用ACID对应的BASE。 我知道BASE,ACID和CAP的属性,但是我很难确定CAP定理和BASE之间有什么关系。据我了解,CAP定理导致BASE的首字母缩写,但这是正确的结论吗?还是用两种不同的方法“构建”一个共享相似属性的数据库? 在此博客文章(http://www.johndcook.com/blog/2009/07/06/brewer-cap-theorem-base/)中,作者写道: 与苛刻的ACID世界相比,在容错的BASE世界中开发软件更加困难,但是Brewer的CAP定理指出,如果要扩展,则别无选择。但是,正如Brewer在本演示文稿中指出的那样,ACID和BASE之间存在连续性。您可以根据自己的优先级来决定与连续体一端或另一端相距多远。 作者在另一篇文章中写道: 最重要的是,许多NOSQL数据库已经放宽了对一致性的要求,以实现更好的可用性和分区。这导致系统被称为BASE(基本可用,软状态,最终一致)。这些没有经典意义上的事务,并且在数据模型上引入了约束,以实现更好的分区方案(例如Dynamo系统等)。简介中提供了有关CAP,ACID和BASE的更全面的讨论。 这清楚地表明CAP会导致 BASE。 我希望有人可以向我澄清这一点,消除我的困惑。 谢谢 -Mestika
12 nosql 


3
根据时间间隔对记录进行分组
我有一个具有以下模式的表,我需要定义一个查询,该查询可以基于时间间隔(例如每分钟记录数)对数据进行分组,然后提供自上一组以来对SnapShotValue所做的更改的总和。目前,SnapShotValue始终递增,因此我只需要求和。任何人都可以帮助执行此操作的SQL Server T-SQL查询吗?我愿意更改架构,但这是我目前拥有的。 架构图 CaptureTime (datetime) SnapShotValue (int) 样本数据 1 Jan 2012 00:00:00, 100 1 Jan 2012 00:00:30, 125 1 Jan 2012 00:01:00, 200 1 Jan 2012 00:01:30, 300 1 Jan 2012 00:02:15, 400 1 Jan 2012 00:02:30, 425 1 Jan 2012 00:02:59, 500 所需的查询结果 1 Jan 2012 00:01:00, 225 …

4
由于“客户端处理时间”较长,因此远程SELECT语句速度较慢,但​​本地速度较快
当连接到我们的生产服务器(SQL Server 2008,功能非常强大的计算机)时,此SELECT语句将花费2秒,回吐所有字段(总共4 MB的数据)。 SELECT TOP (30000) * FROM person WITH(NOLOCK); 从同一网络上的任何其他框中(使用SQL身份验证或Windows身份验证进行连接),相同的查询需要1分钟8秒。 我正在用这个非常简单的语句进行测试,以说明它不是索引问题或与查询相关的问题。(目前,所有查询都存在性能问题...) 这些行是成块的,而不是一次全部。我立即得到第一行,然后等待1分钟以上,以使成批的行进入。 从远程框中运行查询时,这是查询的客户端统计信息: Query Profile Statistics Number of INSERT, DELETE and UPDATE statements 0 Rows affected by INSERT, DELETE, or UPDATE statements 0 Number of SELECT statements 2 Rows returned by SELECT statements 30001 Number of transactions 0 …

2
一对一关系是否正常化?
考虑我们有大量的统计数据记录;例如20-30 INT列。最好将整个集合都保留在一个表中,因为它们都属于一条记录,还是创建另一个具有一对一关系的表。 前者的优点是避免JOIN并可以快速访问相应记录的所有统计数据。 后者的优点是使色谱柱保持整洁。第一列是读密集型的,第二列是写密集型的。当然,我认为它对性能没有显着影响,因为我将InnoDB与行级阻塞一起使用。 总的来说,我想知道为一条记录分离不同的数据集是否有用?


5
在触发器中将INSERTED和DELETED表联接在一起的糟糕表现
我在表上有一个UPDATE触发器,该触发器监视从一个特定值更改为任何其他值的特定列。发生这种情况时,它将通过单个UPDATE语句更新另一个表中的一些相关数据。 触发器要做的第一件事是检查是否有任何更新的行使该列的值与所讨论的值发生了变化。它只是将INSERTED与DELETED连接起来,并比较该列中的值。如果没有任何条件,它将尽早解决,因此UPDATE语句不会运行。 IF NOT EXISTS ( SELECT TOP 1 i.CUSTNMBR FROM INSERTED i INNER JOIN DELETED d ON i.CUSTNMBR = d.CUSTNMBR WHERE d.CUSTCLAS = 'Misc' AND i.CUSTCLAS != 'Misc' ) RETURN 在这种情况下,CUSTNMBR是基础表的主键。如果我对此表进行了大的更新(例如,超过5000行),则即使我没有触摸CUSTCLAS列,该语句也需要AGES。我可以在Profiler中看到它在此语句上停滞了几分钟。 执行计划很奇怪。它显示了具有3,714次执行和约1,850万个输出行的插入扫描。通过CUSTCLAS列上的过滤器运行。它将其(通过嵌套循环)连接到“删除的扫描”(也已在CUSTCLAS上过滤),该“删除的扫描”仅执行一次并且有5000条输出行。 我在这里做什么愚蠢的事情导致这个?请注意,触发器绝对必须正确处理多行更新。 编辑: 我也尝试过这样写(以防EXISTS做不愉快的事情),但它仍然一样糟糕。 DECLARE @CUSTNMBR varchar(31) SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR FROM INSERTED i INNER JOIN …


1
Postgresql本身执行了“快速关闭”。为什么?它是怎么做到的?
在将其发布到这里之前,我已经在Google上进行了大量的搜索和手动阅读。 版本信息:Ubuntu10.x上的Postgres8.4 我有一台运行Postgres服务器的个人笔记本电脑,使用JDBC的Java脚本运行了1600多个分钟(我已经运行了数周),然后死于管理员重启服务器。这是我在pgsql日志中找到的内容: Feb 29 07:46:55 krufe-laptop postgres[3578]: [2-1] 2012-02-29 07:46:55 EST LOG: incomplete startup packet Feb 29 07:46:56 krufe-laptop postgres[1113]: [2-1] 2012-02-29 07:46:56 EST LOG: received fast shutdown request Feb 29 07:46:56 krufe-laptop postgres[1113]: [3-1] 2012-02-29 07:46:56 EST LOG: aborting any active transactions Feb 29 07:46:56 krufe-laptop postgres[24095]: [2-1] …
12 postgresql 

3
为什么我不应该为多个关系使用一张桌子?
假设我的数据库中有多个关系,例如商店,员工和销售,并且我想用简单的二进制关系连接对。我个人将创建一个名为Employee_Store和Employee_Sale的表,并使用由外键组成的自然键。 现在,我的同事坚持要为多个关系创建一张表。对于上面的示例,可能有一个名为EmployeeLinks的表: EmployeeLinks( IdLink int PK, IdEmployee int FK null, IdStore int FK null, IdSale int FK null, LinkType int not null ) 请以充分的理由帮助我,为什么这不是一个好主意。我有自己的论点,但我想让他们保密,并听听您的公正意见。 编辑: 最初,上表没有主键(!)。因为外键允许为null,所以替代键是唯一的选择。

4
从正在执行的作业中获取作业ID或作业名称
我有一个中央数据库,可以在所有服务器上写入工作结果。我通过SQL作业中的powershell将3个参数传递回中央服务器上的sp,以验证该作业应在当时运行,等等。然后通过SSRS公开该信息,因此我们可以看到作业失败/长时间运行的作业/ &尚未运行但应该运行的作业(或者如果有人弄乱了时间表)。 为此,我将2个作业步骤添加到每台服务器上的每个作业中,并且我希望将脚本减少到仅添加到每个作业中的1个步骤。甚至可能从网络共享中调用该脚本。 但是我的问题是我传递的三个参数之一。我需要从正在执行的作业中获取正在执行的作业ID或作业名称,因此不必硬编码name参数。我传递的3个参数是Jobid,状态(成功/失败)和errormsg。我编写的powershell脚本非常简单。 调用sqlcmd -ServerInstance“ MYRemoteSYSTEM”-数据库remoteDB-查询“ exec dbo.JOB_LOG'JOBNAME / ID','成功/失败','错误消息在这里''' 这将我需要的东西写到桌子上。我已经看过msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs /,但是这些都不保证在执行多个作业的情况下,我可以获得正确执行作业的ID或名称。同时。 我什至尝试查看sys.sysprocesses,但我认为由于代理作业是一个powershell脚本,因此它显示为“ .Net SqlClient数据提供程序”,因此我无法从显示为“ SQLAgent-”的作业中删除二进制JOBID。 TSQL JobStep(作业0xF1800243164745429C30474FFD5C990C:第1步)” ---我从Denny Cherry的帖子中学到的 -谢谢denny- 任何关于如何获取执行中的Jobid的想法将不胜感激。 谢谢, 克里斯

4
从RESTORE HEADERONLY中提取字段
我正在尝试使用“ RESTORE HEADERONLY ”来获取进行我要还原的备份的日期。 命令: RESTORE HEADERONLY FROM DISK = '<path to .bak file>' 在查询分析器中可以很好地工作,并提供一个包含50列的结果集。 问题实际上是从代码访问它。 通过声明50:ish列中的每一个,将其插入到temp表中,exec然后从中获取所需的值。 问题是我真的想避免将整个结果集声明为临时表,因为如果将来的版本中向它们添加列,这似乎是一个非常脆弱的解决方案。 有什么方法可以从结果集中只获取一个列而不声明所有列吗?

5
MySQL-用于InnoDB的ALTER TABLE的最快方法
我有一个要更改的InnoDB表。该表有约8000万行,并退出了一些索引。 我想更改其中一列的名称并添加更多索引。 最快的方法是什么(假设即使停机,我也可能会遭受痛苦-服务器是未使用的从属服务器)? 是“普通” alter table的最快解决方案吗? 此时,我只关心速度:)

2
我可以在一个查询中重命名MySQL ENUM列中的值吗?
假设我有一个带的数据库表ENUM('value_one','value_two')。我想将其更改为ENUM('First value','Second value')。我目前正在这样做,如下所示: ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value'); UPDATE `table` SET `column`='First Value' WHERE `column`='value_one'; UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two'; ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value'); 有没有更有效的方式来做到这一点,例如,用一个做到这一点的方式 单一的 ALTER TABLE声明?

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.