数据库管理员

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

3
MongoDB MMAPv1与WiredTiger存储引擎
在mongoDB3中出现了一个新的存储引擎:WiredTiger。但是,MMAPv1仍然是Mongo中的默认选择。 一个可能不会比另一个更好,这通常是一个用例问题,并为工作选择了正确的工具。但是,哪种发动机最适合什么工作? 实际上,虽然MMAPv1是默认引擎,但 WiredTiger在几乎每个领域似乎都更好。它具有与MMAPv1 plus相同的功能: 更好的写入性能, 文档级并发, 压缩, 快照和检查点系统。 我在MongoDB的博客上找到了一个比较表: 因此,除非您使用Solaris,否则是否有理由不选择WiredTiger? 编辑 这是两个视频,详细介绍了WiredTiger和MMAPv1的内部 。

2
将列从NOT NULL更改为NULL-到底发生了什么?
我们有一个包含2.3B行的表。我们想将列从NOT NULL更改为NULL。该列包含在一个索引中(而不是聚集索引或PK索引)。数据类型没有改变(它是一个INT)。只是可空性。声明如下: Alter Table dbo.Workflow Alter Column LineId Int NULL 在停止该操作之前,该操作花费了超过10(我们甚至还没有让它运行完毕,因为这是一项阻塞操作,并且花费了太长时间)。我们可能会将表复制到开发服务器,以测试实际需要多长时间。但是,我很好奇,是否有人知道从NOT NULL转换为NULL时SQL Server在做什么?另外,是否需要重建受影响的索引?生成的查询计划不会指示正在发生的事情。 有问题的表是群集的(不是堆)。

1
结合交易触发
假设我们有以下情况: 我们有一张桌子(假设Table_A),其中有一个触发器INSERT。触发工作是table_B根据中的插入值更新其中的某些行table_A。 现在,当我们在表中简单地插入一行时,一切正常,但是在通过事务插入数据的情况下呢?触发器将等待所有事务语句成功运行,还是在识别到插入后立即触发?如果触发器在识别出第一个插入后立即触发,那么如果事务在最后一行失败,会发生什么?有什么机制可以解决这种情况吗?

1
在实时产品表上更改varchar的长度
我有一个与生产应用程序一起使用的MS SQL Server 2008 R2 DB服务器。 该应用程序的一项新增强功能现在需要varchar(100)增加表中一列的长度。 是否可以在不影响当前数据的情况下增加生产数据库中此现有列的长度? 是否必须在下班时间完成此更改,以避免服务中断?


3
如何在Postgresql中列出当前用户拥有的所有架构中的所有表?
我可以使用列出所有架构中的所有表 > \dt *.* 但这还会列出系统表,其数量大大超过我关心的表。我希望我在公共模式和我定义的任何模式中创建的所有表(可能还有视图)。 我希望找到一种方法,而不必在按如下所述创建架构时将架构显式添加到搜索路径中: /programming//a/12902069 编辑: 基于已接受的答案,我创建了以下视图: create view my_tables as select table_catalog, table_schema, table_name, table_type from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema'); 现在,以下命令给了我我想要的: select * from my_tables;

4
是否可以将一列设为只读?
我很好奇是否可以用无法更改的列创建表,但表的其他列可以更改。 例如,我可以想象一个CreatedByUser永远不应该更改的列。 SQL Server是否为此提供了内置功能,还是只能通过触发器或其他方式实现?
25 sql-server 

2
您可以将COUNT DISTINCT与OVER子句一起使用吗?
我正在尝试改善以下查询的性能: UPDATE [#TempTable] SET Received = r.Number FROM [#TempTable] INNER JOIN (SELECT AgentID, RuleID, COUNT(DISTINCT (GroupId)) Number FROM [#TempTable] WHERE Passed = 1 GROUP BY AgentID, RuleID ) r ON r.RuleID = [#TempTable].RuleID AND r.AgentID = [#TempTable].AgentID 目前,根据我的测试数据,大约需要一分钟。对于此查询所驻留的整个存储过程的更改,我的输入量有限,但我可能可以让他们修改此查询。或添加索引。我尝试添加以下索引: CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed) 它实际上使查询所花费的时间增加了一倍。我得到一个非聚集索引相同的效果。 我尝试将其重写如下,但没有任何效果。 WITH …

2
“ ibfk”在MySQL中代表什么?
如果我在phpmyadmin中为表“ photos”创建外键约束,则稍后会看到该约束名为“ photos_ibfk_1”,下一个约束名为“ photos_ibfk_2”,依此类推。由此,我得出[tablename] _ibfk_constraintIndex为MySQL中数据库约束的约定。它是否正确?IBFK代表什么?

3
使用SELECT-UPDATE模式时管理并发
假设您有以下代码(请忽略这很糟糕): BEGIN TRAN; DECLARE @id int SELECT @id = id + 1 FROM TableA; UPDATE TableA SET id = @id; --TableA must have only one row, apparently! COMMIT TRAN; -- @id is returned to the client or used somewhere else 在我看来,这不能正确地管理并发。仅仅因为您有一笔交易并不意味着其他人不会获得与您获得更新语句之前相同的值。 现在,将代码保持原样(我意识到这可以更好地作为单个语句处理,甚至可以使用自动增量/标识列更好地进行处理),有什么确定的方法可以使其正确处理并发并防止允许两个客户端获得相同竞争条件的竞争条件。 id值? 我非常确定,将WITH (UPDLOCK, HOLDLOCK)SELECT 添加到SELECT即可。该SERIALIZABLE事务隔离级别(因为它拒绝任何人阅读你做了什么,直到移植是在将似乎工作,以及UPDATE:这是假见马丁的答案)。真的吗?他们俩会平等地工作吗?是一个比另一个更好的选择吗? 想象一下,做比ID更新更合法的事情-基于需要更新的读取进行一些计算。可能涉及许多表,其中一些将要写入,而有些则不会。最佳做法是什么? 写完这个问题后,我认为锁定提示会更好,因为那样的话,您只锁定了所需的表,但是我很感谢任何人的投入。 PS:不,我不知道最佳答案,并且确实希望得到更好的理解!:)

2
一起使用MongoDB和PostgreSQL
我当前的项目实质上是工厂文档管理系统的运行。 就是说,有一些皱纹(惊奇,惊奇)。尽管有些皱纹是该项目特有的,但我相信会出现一些一般性的观察和问题,它们没有规范的答案(无论如何我还是可以找到),并且适用于更广泛的问题领域。这里有很多东西,我不确定它是否适合StackExchange Q&A格式,但我认为这是a)一个可以回答的问题,b)不够具体,足以使社区受益。我的某些注意事项是我特有的,但我认为该问题对于决定使用SQL,NoSQL和两者的任何人都可能有用。 背景: 我们正在构建的Web应用程序包含本质上关系明确的数据以及面向文档的数据。我们也想吃点蛋糕。 TL; DR:我认为下面的#5通过了气味测试。你呢?有没有人有在单个应用程序中进行SQL和NOSQL集成的经验?我试图在下面列出解决此类问题的所有可能方法。我错过了一个有前途的选择吗? 复杂性: 有许多不同类别的文档。这些要求已经需要数十种不同的文档。这个数字只会增加。最好的情况是我们可以利用一种简单的领域特定语言,代码生成和灵活的模式,以便领域专家无需DBA或程序员的干预即可处理新文档类的添加。(注意:已经知道我们遵守格林斯潘的第十条规则) 先前成功写入的完整性是该项目的核心要求。数据将对业务至关重要。如果成功写入的内容保持写入状态,则可以牺牲完整的ACID语义。 这些文件本身很复杂。在我们的特定情况下,原型文档将需要每个文档实例存储150多个不同的数据。病理情况可能会恶化一个数量级,但肯定不会两个。 单类文档是移动的目标,在以后的某个时间点会进行更新。 当我们将其连接到关系数据库时,我们喜欢从Django获得的免费内容。我们希望保留免费赠品,而不必跳回两个Django版本来使用django-nonrel分支。完全转储ORM优于降级到1.3。 本质上,它是关系数据(用户,组等典型的Web应用程序之类的东西,以及我们需要能够实时对复杂查询进行切片和切分的文档元数据)和文档数据(例如我们不希望加入或查询的数百个字段-数据的唯一用例是显示输入该文档的单个文档)。 我想对我的首选方法进行健全性检查(如果您检查自己的发帖历史,我很清楚我不是DBA),并列举了我为其他人解决的所有选项涉及关系和非关系数据的大致相似的问题。 拟议解决方案: 1.每个文档类一张表 每个文档类都有自己的表,其中包含所有元数据和数据的列。 好处: 标准SQL数据模型正在发挥作用。 关系数据以最佳方式处理。如果需要,我们将在以后进行非规范化。 Django的内置管理界面非常适合内省这些表,并且ORM可以愉快地使用100%开箱即用的数据。 缺点: 维护噩梦。数十个(几百个)数千列的表。 应用程序级逻辑负责确定要写入哪个表。使表名成为查询的参数很糟糕。 基本上,所有业务逻辑更改都将要求架构更改。 病理情况可能需要在多个表中剥离单个表单的数据(请参阅:PostgreSQL表中的最大列数是多少?)。 我们可能需要去寻找一个真正的,诚实的上帝DBA,毫无疑问,他最终会讨厌我们和生活。 2. EAV建模 只有一个字段表。实体-属性-值建模已经众所周知。为了完整起见,我将其包括在内。我认为在2013年启动的任何新项目都不会故意采用EAV方法。 好处: 易于建模。 缺点: 更难查询。 DB层不再对构成一个应用程序级对象的内容进行直接表示。 我们将丢失数据库级别的约束检查。 一张桌子上的行数将增长100-1000倍。从性能角度来看,可能是将来的痛点。 索引可能有限。 就ORM而言,DB模式是荒谬的。Web应用程序中包含的电池已保留,但自定义数据模型将需要自定义查询。 3.使用PostgreSQL的hstore或json字段 这些字段类型中的任何一个都可以解决在关系DB上下文中存储无模式数据的问题。我不立即跳到该解决方案的唯一原因是它是一个相对较新的版本(在8.4版中引入,所以不是那个新版本),以前对此没有零接触,并且对此表示怀疑。出于完全相同的原因,我感到不对,因为我会很不舒服地将所有漂亮的,易于规范化的数据扔到Mongo中,即使Mongo可以处理文档之间的引用,我也会感到不舒服。 好处: 我们获得了Django ORM以及内置的身份验证和会话管理的好处。 一切都保留在我们先前成功用于其他项目的一个后端中。 缺点: 没有经验,个人。 它看起来不像是一个非常常用的功能。看起来他们很受推荐给使用NOSQL解决方案的人们的欢迎,但我看不出有很多证据表明它们已被选中。这使我认为我一定想念一些东西。 所有存储的值都是字符串。丢失数据库级别的约束检查。 …

1
Mysql Innodb:InnoDB:错误:最后一个检查点的寿命是InnoDB:它超出了日志组的容量
我真的需要一些mysql专业知识。我是mysql的新手,并且在过去1周内看到数据库的服务器崩溃。 我在Ubuntu上使用mysql 5.1.36。这是具有双核和4GB内存以及40GB SSD的专用mysql服务器。 日志错误为: 120413 23:57:15 [Note] Plugin 'FEDERATED' is disabled. 120413 23:57:15 [Warning] option 'innodb-autoextend-increment': unsigned value 2000 adjusted to 1000 120413 23:57:15 InnoDB: Initializing buffer pool, size = 2.9G 120413 23:57:15 InnoDB: Completed initialization of buffer pool 120413 23:57:16 InnoDB: Started; log sequence number 0 44234 120413 …
25 mysql  innodb 

3
innodb_file_format梭子鱼
对于那些比较熟悉的人,我有几个问题。尽管有梭子鱼的支持,我的大多数实例仍在运行Antelope。 我一直在寻找一些压缩innodb表的方法。我的理解是,这仅在梭子鱼格式下可用。 我看到innodb_file_format是动态的,因此我可以不跳动地切换。我应该意识到这样做的任何含义。我只能说意味着将使用该格式创建新表或随后更改的表。这一切正确吗? 我希望不必经历所有表的转换。犹太洁食器是否在同一表空间中同时存在羚羊和梭子鱼表?即使有效,也有什么需要注意的地方吗? 从我阅读并从测试中收集的信息来看,答案是:是的。是。我不确定。 更新资料 自这篇文章发布以来,我一直在各种实例中运行一些动态表和一些压缩表。此外,我 当时忽略了阅读http://dev.mysql.com/doc/refman/5.5/en/innodb-file-format-identifying.html。 启用给定的innodb_file_format后,此更改仅适用于新创建的表,而不适用于现有的表。如果您确实创建了一个新表,则包含该表的表空间将被标记为具有该表功能所需的“最早”或“最简单”的文件格式。例如,如果启用文件格式梭子鱼,并创建未压缩且不使用ROW_FORMAT = DYNAMIC的新表,则包含该表的新表空间将被标记为使用文件格式Antelope。 因此,即使您允许梭子鱼,表也将被创建为羚羊。除非您将每个表都指定为row_format动态表或压缩表,否则混合是不可避免的。 没有迹象表明您在引入第一个梭子鱼表时应该进行完整的转储和重新加载(例如在升级主要版本的mysql时建议使用)

1
报告服务和应用程序角色
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 第一张海报,长期潜伏在这里。在报表中激活应用程序角色的最佳方法是什么? 我尝试了不同的方法,到目前为止,唯一可行的方法是将调用嵌入到应用程序角色中,如下所示:- EXEC sp_setapprole 'REPORTZ', 's3cr3t'; select * from mytable where ID < 10000 在数据集中。它确实可以工作...但是我不喜欢(肯定不是我想融入生产环境的形状)。 我希望可以通过自定义程序集或Reporting Service中的某种“服务器挂钩”在运行时以某种方式“劫持”或“注入”应用程序角色激活行(在两种情况下,我都不知道如何) 非常感谢您的时间+亲切的关注。 YS。
25 sql-server  ssrs  role 

2
在运行时切换二进制日志格式的最安全方法是什么?
由于出现以下警告mysqld.log: [警告]由于BINLOG_FORMAT = STATEMENT,因此使用语句格式将不安全的语句写入二进制日志。该语句不安全,因为它使用LIMIT子句。这是不安全的,因为无法预测其中包含的行集。 我想将复制格式切换为MIXED。 但是根据MySQL文档: 不存在任何临时表时,建议不要在运行时切换复制格式,因为临时表仅在使用基于语句的复制时才记录,而在基于行的复制中则不记录。 因此,问题是如何确定是否存在任何临时表来安全地切换二进制日志格式?

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.