数据库管理员

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

1
使用页面压缩时的行开销是多少?
我创建了一个包含650 Numeric(19,4)列的表。当我打开页面压缩时,通过运行 ALTER TABLE fct.MyTable REBUILD WITH (DATA_COMPRESSION = PAGE); 我懂了 消息1975,级别16,状态1 索引“ PK_Mytable”的行长度超过了“ 8060”字节的最大允许长度。 但是650乘以9字节仅是5850字节,与规定的8060字节的限制相去甚远。 服务器正在运行Windows 2012 r2和SQL Server 2016 SP1 CU2 使用页面压缩时的行开销是多少? 这是一些代码来显示我的意思: /* test script to demo MSG 1975 */ DECLARE @sql NVARCHAR(max)='', @i INT =0 drop table if exists dbo.mytable; SET @sql = 'Create table dbo.Mytable …

2
标志与表拆分
我正在设计一个项目表,该项目表(可能)包含数千万条记录。某些项目只有在管理员“批准”之后才能使用。“使用”是指在“批准”之前不会在其他任何表中引用这些项目。在任何给定时间,多达50%的商品可能会被“未批准”。记录可能会被“批准”,但反之则不然。 我考虑两个设计选项: 一点标志 单独的“未批准”项目表-批准项目后,将其移至“常规”表(项目ID的更新不是问题) 我认为第二个选择要好得多。位标志每行仅占用一个字节,因此这不是问题。但是,如果我们在同一张表中有100万个批准的记录和100万个未批准的记录,则具有批准记录的操作的扫描时间会增加。 问题是:我应该考虑使用第一个(位标志)选项吗?在描述的情况下有什么好处吗?

2
为什么复合外键需要单独的唯一约束?
这是一个简单的表,其中的记录可以引用同一表中的父记录: CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) ); 在附加要求下,num父记录和子记录之间的其他字段值之一必须相同,我认为应该使用复合外键来解决问题。我将最后一行更改为 FOREIGN KEY (parent_id, num) REFERENCES foo(id, num) 并得到错误:没有唯一的约束条件匹配给定表“ foo”的键。 我可以轻松添加此约束,但是当所引用的列(id)中的一个已被保证是唯一的时,我不明白为什么有必要这样做?从我的角度来看,新约束将是多余的。

4
DELETE语句与REFERENCE约束冲突
我的情况如下所示: 表STOCK_ARTICLES: ID *[PK]* OTHER_DB_ID ITEM_NAME 表格位置: ID *[PK]* LOCATION_NAME 表WORK_PLACE: ID *[PK]* WORKPLACE_NAME 表INVENTORY_ITEMS: ID *[PK]* ITEM_NAME STOCK_ARTICLE *[FK]* LOCATION *[FK]* WORK_PLACE *[FK]* 显然,INVENTORY_ITEMS中的3个FK引用了其他表中的“ ID”列。 此处的相关表是STOCK_ARTICLE和INVENTORY_ITEMS。 现在有一个SQL作业,包含几个步骤(SQL脚本),这些步骤将上述数据库与另一个数据库(OTHER_DB)“同步” 。此作业中的步骤之一是“清理”。它会从STOCK_ITEMS中删除所有记录,而另一个数据库中没有对应的具有相同ID的记录。看起来像这样: DELETE FROM STOCK_ARTICLES WHERE NOT EXISTS (SELECT OTHER_DB_ID FROM [OTHER_DB].[dbo].[OtherTable] AS other WHERE other.ObjectID = STOCK_ARTICLES.OTHER_DB_ID) 但是此步骤始终失败: DELETE语句与REFERENCE约束“ FK_INVENTORY_ITEMS_STOCK_ARTICLES”冲突。数据库“ FIRST_DB”的表“ dbo.INVENTORY_ITEMS”的列“ …

5
给定范围内的质数
最近,我被赋予打印所有质数(1-100)的任务。我在那里彻底失败了。我的代码: Create Procedure PrintPrimeNumbers @startnum int, @endnum int AS BEGIN Declare @a INT; Declare @i INT = 1 ( Select a = @startnum / 2; WHILE @i<@a BEGIN @startnum%(@a-@i) i=i+1; ) END 尽管我最终没有完成它,但我想知道在数据库(SQL Server 2008 R2)上执行这样的程序是否可行。 如果是,它将如何结束。

2
选择满足组条件的行(无临时表)
该表具有3列: ID category flag 1 A 1 2 A 0 3 A 0 4 B 0 5 C 0 我想选择flag = 1每个类别至少具有一次的所有行。 预期成绩: ID category flag 1 A 1 2 A 0 3 A 0 可以使用如下临时表来解决: select ID into #tempTable from someTable where flag = 1 select * from someTable …


1
聚簇索引查找和非聚簇索引查找之间的区别
聚集索引(CI)搜索和非聚集索引(NCI)搜索之间有什么区别?一个人比另一个人表现更好吗? 我之所以这样问,是因为我有一个具有5000万行和150列的表。它有一列名为ID定义为聚簇索引的列。还有一个具有相同索引键ID和七个include-d列的NCI 。在我看来,NC索引在这里是重复的,可以安全地删除。 因此,我想获得一些专家意见/建议,以确保可以安全地放下它或保持其完好无损?

2
为什么Cassandra建议不要在高基数列上创建索引?
Cassandra文档指出, 在以下情况下不要使用索引: 在高基数列上,因为您随后查询了大量记录以获取少量结果。请参阅下面的使用高基数列索引的问题。 继续 如果在高基数列上创建索引,该索引具有许多不同的值,则字段之间的查询将导致许多查找,结果很少。在拥有十亿首歌曲的表中,按作者(通常是每首歌曲唯一的值)而不是按艺术家查找歌曲的效率很低。手动将表维护为索引形式而不是使用Cassandra内置索引可能会更有效。对于包含唯一数据的列,有时为了方便起见,最好使用索引,只要对具有索引列的表的查询量适中且不在恒定负载下即可。 但是从来没有真正回答这个问题:为什么效率低下?我不知道“手动将表作为索引的一种形式”是什么意思。但是,这却与“………有时为了方便起见,只要查询量适中,使用索引有时是很好的性能……”。 这是否只是在告诉我在何时何地可以使用PK?什么是效率低下?我的理解是,要查询索引的查询将需要查询集群中的每个¹节点,然后每个节点都将在其本地索引中进行查找,然后将结果汇总。除了我们要付出网络等待时间之外,这并不一定是昂贵的(每个索引查找都应该相当便宜),因为我们必须等待最慢的节点。我在这里想念什么吗? 但是,如果我有一个包含不计其数的项目的收藏集,那么在极少数情况下,需要通过一个不同但几乎独特的属性来查找……这是一种适当的用法,对吗? ¹每个?IDK,如果复制意味着复制因子为3时,它可以达到群集的1/3?
10 index  cassandra 

1
如何降低SQL Server中的HEAP碎片?
我最近发现,一个堆表的碎片超过70%。所以我决定做一个 ALTER TABLE dbo.myTable REBUILD 有趣的是,事后我有20%的支离破碎。从那以后,在那张桌子上没有写任何东西。因此,我决定再进行一次重建。 第二次后,桌子上的帽子碎裂了50%,甚至更多! 我真的不明白怎么会这样...


1
HADR高工作线程使用率
为什么HADR池中的可用性组的工作线程数会大大增加,而不是每个副本“ 通常有3–10个共享线程 ”的最低使用量? 在一种情况下,我们观察到300个线程的使用情况,其中包含3个可用性组和10个数据库。SQL Server 2014 SP1。 我们的潜在客户包括辅助副本上的备份,主副本上的高活动性,辅助副本上的报告。 AG位于VMware的数据中心中。总共16个调度程序,通常的工作线程在200个范围内。服务器上的max_dop为2。 3个AG,10个DB,每个4个副本-主,2个只读,1个不可读。 1个辅助同步,2个异步 大型多主机群集上的32个物理核心上有16个vcore。 没有多余的准备。 其他较小的VM 4-8内核位于同一位置,但不会按CPU 我们观察到工作线程数量激增,导致拒绝服务。我们假设工作线程归因于AG,因为只有那些工作线程才能超过限制。 在上下文中阅读的来自SQL Server Premier现场工程师博客的以下链接没有给我完整的答案: 监视SQL Server 2012 AlwaysOn可用性组工作线程消耗 我的实际工作线程是否超出了sp_configure“最大工作线程”值?

3
将多个数据库备份到同一时间点
通常,当我们开始备份时,我们不允许提交更改,否则将无法访问数据库。我的意思是数据库将处于单用户模式,但是我想开始备份并释放数据库以供使用。另外,一旦开始备份,我就不想将正在进行的更改写入备份文件。我想知道如何在Microsoft SQL Server 2012中实现此目标。请帮助我。 好吧,让我先解释我的问题。目前,我正在将数据库设置为单用户模式,直到备份完成。我的目的是为了避免备份过程中的数据更改。但是我的应用程序与多个数据库绑定在一起(每个数据库相互链接,并且有var dbs不断按月创建)。因此,备份所有这些数据库已成为一个繁琐的过程,更重要的是,在备份过程中,我必须将用户排除在系统之外。 因此,我正在寻找可以满足以下要求的备份机制。 一次启动所有数据库的备份,然后释放该数据库以供使用。 由于数据库相互链接,因此我希望在备份文件中保持数据一致性。因此,由于这种数据一致性要求,我不想将正在进行的更改提交到备份文件中。 我想要的是-在给定时间备份所有数据库。


2
喜欢或投票推荐
我正在制作一个小程序,用户可以在其中编写帖子或撰写博客。在这些帖子上,其他用户可以像在Facebook中那样喜欢或不喜欢该帖子,或者像在stackoverflow中那样对帖子进行赞或不赞成。我想知道一个常用的良好数据库结构,并且该程序可以有效地使用该结构。我有两个选择 第一 发布: id head message datepost likes dislikes 1 ab anchdg DATE 1,2,3 7,55,44,3 以上述方式,id是postid。在“喜欢”列中,1,2,3是喜欢或赞成该帖子或博客的用户的ID。7,55,44,3是不喜欢或不赞成该帖子或博客的用户的ID。 第二 发布: id head message datepost 1 ab anchdg DATE 喜欢: id postid userid 1 1 1 2 2 2 不喜欢: id postid userid 1 1 7 2 1 55 这样,我必须为喜欢和不喜欢创建两个单独的表,以获取帖子的喜欢。这样,表即Likes&Dislikes将被大量填充。这可能会使表沉重,处理速度变慢。 因此,我想知道哪种更好和更标准的方法来完成此任务?

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.