数据库管理员

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

6
举例说明2NF与3NF
我对第二范式(2NF)有疑问,但无法使用Google来解决。这让我发疯,因为我是一名老师,而且我不想向学生们教错误的东西。 让我们有一个包含5个字段的表格。 评分= {学生姓名,学科编号,学科名称,#考试,年级} 依赖性是这样的: 学生姓名,科目代码,#考试->年级 SubjectCode-> SubjectName SubjectName-> SubjectCode 因此,候选键1是{StudentName,SubjectCode,#Exam},候选键2是{StudentName,SubjectName,#Exam}。 主要属性是{StudentName,SubjectCode,SubjectName,#Exam},非主要属性是Grade 根据第二范式的定义,非素数属性不能取决于候选密钥的一部分。唯一的非素数属性(Grade)不依赖于候选键的一部分,因此该表看起来像2NF。 问题是我认为有些不对(我可能错了)。我认为受试者应该有自己的桌子。 评分= {学生姓名,学科代码,#考试,年级} 主题= {主题代码,主题名称} 但是2NF不会产生这种情况。3NF与非素数属性之间的依赖关系有关,因此也不会产生这种情况。但是在我看来,这是正确的结果,因为它没有冗余。 我想如果非素数属性定义为“不是候选键的属性”,则2NF将产生所需的结果。但是我已经一遍又一遍地检查了这一点,并且非素数属性被定义为“对候选键不信任的属性”。 我究竟做错了什么?

2
PostgreSQL“临时文件的大小”
我已经将数据导入到新数据库中(大约600m行的时间戳,整数,双精度)。然后,我创建了一些索引,并尝试更改某些列(解决了空间不足的问题),数据库被清理。 现在pgAdmin III告诉我,“ 临时文件的大小 ”是50G〜+。 这些临时文件是什么?这些类似于SQL Server事务日志吗? 我如何摆脱它们,数据库似乎比应有的要大得多(数据库的总大小为91 GB) 在Windows 2012服务器上使用Posgres 9.4.1 。 数据库统计信息选项卡的屏幕快照:

1
当where子句对`value()`进行过滤时,为什么不使用二级选择索引?
设定: create table dbo.T ( ID int identity primary key, XMLDoc xml not null ); insert into dbo.T(XMLDoc) select ( select N.Number for xml path(''), type ) from ( select top(10000) row_number() over(order by (select null)) as Number from sys.columns as c1, sys.columns as c2 ) as N; 每行的样本XML: <Number>314</Number> …

1
如何解决RESOURCE_SEMAPHORE和RESOURCE_SEMAPHORE_QUERY_COMPILE等待类型
我们试图找出运行缓慢的sql服务器查询从以下配置之一托管的服务器(大小为300 GB)中命中/获取数据的根本原因: Windows Server 2003 R2,SP2,企业版,16 GB RAM,12 CPU 32位 SQL Server 2005 SP4企业版32位。 我们已经通知企业升级到64位需要一个多月的时间。 但是对于当前问题,如果可以解决内存压力或最终得出结论以增加RAM,则我们正在尝试收集数据。 完成的操作:重新索引和更新统计信息适用于此数据库。 如下图所示,我们已经注意到过去5天在加载时间内运行的信号量等待类型: 以下查询后很少有信息:缓冲区大小= 137272 SELECT SUM(virtual_memory_committed_kb) FROM sys.dm_os_memory_clerks WHERE type='MEMORYCLERK_SQLBUFFERPOOL' 和以下每个查询的信号量内存= 644024 SELECT SUM(total_memory_kb) FROM sys.dm_exec_query_resource_semaphores 以下是从dm_exec_query_resource_semaphores和sys.dm_exec_query_memory_grantsdvv 收集的更多信息 因此,从上面收集的信息和每个SP_Blitz数据来看,资源信号似乎是问题所在。 与可用的16 GB RAM相比,是否为资源信号ID分配的内存'target_memory_kb'太低。 注意*运行8小时的每次分析“ target_memory_kb”始终小于1 GB,而可用的16 GB是多少? 这里可能是什么问题以及如何解决,请提出建议 谢谢

1
SQL Server的优化器如何估计联接表中的行数?
我在AdventureWorks2012数据库中运行此查询: SELECT s.SalesOrderID, d.CarrierTrackingNumber, d.ProductID, d.OrderQty FROM Sales.SalesOrderHeader s JOIN Sales.SalesOrderDetail d ON s.SalesOrderID = d.SalesOrderID WHERE s.CustomerID = 11077 如果查看估算的执行计划,则会看到以下内容: 初始索引查找(右上)使用IX_SalesOrderHeader_CustomerID索引并在文字11077上进行搜索。其估计值为2.6192行。 如果使用DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM,则表明值11077在两个采样键11019和11091之间。 11019和11091之间的不同行的平均数为2.619718,或舍入为2.61972,这是为索引搜索显示的估计行的值。 我不了解的部分是针对SalesOrderDetail表的聚集索引查找的估计行数。 如果我运行DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID'): 因此,SalesOrderID(我要加入)的密度为3.178134E-05。这意味着1 / 3.178134E-05(31465)等于SalesOrderDetail表中唯一SalesOrderID值的数量。 如果在SalesOrderDetail中有31465个唯一的SalesOrderID,则分布均匀,每个SalesOrderID的平均行数为121317(总行数)除以31465。平均值为3.85561 因此,如果要循环遍历的估计行数是2.61972,并且要返回的平均值是3.85561,则我认为估计行数将是2.61972 * 3.85561 = 10.10062。 但是估计的行数是11.4867。 我认为我对第二个估算值的理解是不正确的,不同的数字似乎表明了这一点。我想念什么?

2
是否可以在数据库中的所有模式上使用?
我想要给GRANT USAGE定数据库的用户/角色。该数据库具有许多架构。 我知道有一个ON ALL TABLES IN SCHEMA,但是我想要“所有模式”。我试过了GRANT USAGE .. ON DATABASE,但这显然是错误的(实际上并不存在)。 这是针对Postgres 9.3或9.4,它恰好是在AWS RDS上的服务器。

2
SQL Server索引更新死锁
我有2个查询,当同时运行时会导致死锁。 查询1-更新索引(index1)中包含的列: update table1 set column1 = value1 where id = @Id 在table1上获取X-Lock,然后在index1上尝试X-Lock。 查询2: select columnx, columny, etc from table1 where {some condition} 在index1上获取S-Lock,然后在table1上尝试S-Lock。 有没有办法在保持相同查询的同时防止死锁?例如,我是否可以在更新之前以某种方式对更新事务中的索引进行X锁定,以确保表和索引访问的顺序相同-这样可以防止死锁? 隔离级别为“已提交读”。已为索引启用行锁和页锁。同一条记录可能同时参与这两个查询-从死锁图中我看不出来,因为它没有显示参数。 死锁图

1
统计。多列直方图可能吗?
我正在考虑以下情况:我有两根高密度色谱柱,但这些色谱柱不是独立的。 定义 这是我出于测试目的而创建的表的定义。 CREATE TABLE [dbo].[StatsTest]( [col1] [int] NOT NULL, --can take values 1 and 2 only [col2] [int] NOT NULL, --can take integer values from 1 to 4 only [col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different [col4] AS ((10)*[col1]+[col2]) …

2
sys.allocation_units和sp_spaceused上的空间使用情况
众所周知的事实是DMV不能保存有关页数和行数的准确信息。但是,当您更新统计信息时,我看不到为什么他们不这样做。 我正在使用一个监视工具,想知道每个索引和数据的磁盘大小,等等。最终我想找到正确的填充因子,以及其他东西。 我的函数使用的空间和旧的sp_spaceused在空间使用上有所不同,但在记录数上却没有。 您能看到我选择的商品中缺少什么吗? 这是sp_spaceused(然后我将数字转换为MB): sp_spaceused 'tblBOrderRelationship' go select 318008/1024.00 AS reserved, 140208/1024.00 AS data, 177048/1024.00 AS index_size, 752/1024.00 AS unused 但是,当我在下面的\下面的图片中运行我的select,代码时,我得到的数字略有不同。 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT schema_name(t.schema_id) as SchemaName, t.NAME AS TableName, t.type_desc, t.is_ms_shipped, t.is_published, t.lob_data_space_id, t.filestream_data_space_id, t.is_replicated, t.has_replication_filter, t.is_merge_published, t.is_sync_tran_subscribed, --t.is_filetable, i.name as indexName, i.type_desc, i.is_unique, …

1
PostgreSQL抱怨共享内存,但是共享内存似乎还可以
我一直在通过PostgreSQL服务器进行密集的模式删除和创建,但是现在抱怨..: WARNING: out of shared memory ERROR: out of shared memory HINT: You might need to increase max_locks_per_transaction. 但是问题仍然存在,如果PostgreSQL仅用重新启动service postgresql restart,我怀疑max_locks_per_transaction不会进行任何调整。 我有点疏远,因为此错误的故障排除列表对我不起作用。 更多信息1409291350:缺少一些细节,但我保留了核心SQL结果。 postgres=# SELECT version(); PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, 64-bit 和: $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: …


2
星型模式数据仓库中动态字段的EAV替代品
我需要在大型数据仓库中支持动态字段和值以存储API请求日志,而我的用例是我需要存储所有API请求查询字符串,并在将来能够对其进行查询(因此,不仅仅是存储,所以我不能为他们使用blob) 例如 http://example.com/?action=test&foo=abc&bar=def... 我需要存储所有field => value映射,即(action => test), (foo => abc), (bar => def),由于该字段是动态的,所以我发现的唯一解决方案是使用Entity-Attribute-Value,但是,人们一直说这是一个非常糟糕的设计。 因此,考虑以上我的用例,什么是EAV的合适替代方案? 我当前使用KAV的架构 表requests (id, timestamp, uri) 例如(1, 149382220, '/') 表params (request_id, key, value) 例如(1, 'action', 'test'), (1, 'foo', 'abc'), (1, 'bar', 'def') 有什么建议么? 更新:我们在AWS RedShift上运行仓库

1
使用非聚集索引更新不同行时出现死锁
我正在解决一个死锁问题,但我发现在id字段上使用聚集索引和非聚集索引时,锁的行为有所不同。如果将聚集索引或主键应用于id字段,则似乎可以解决死锁问题。 我有不同的事务对一个不同的行进行一个或多个更新,例如事务A将仅更新ID = a的行,事务B将仅触摸ID = b的行,等等。 而且我知道没有索引,更新将获取所有行的更新锁,并在必要时隐式转换为排他锁,这最终将导致死锁。但是我无法找出为什么非聚集索引仍然存在死锁(尽管命中率似乎下降了) 数据表: CREATE TABLE [dbo].[user]( [id] [int] IDENTITY(1,1) NOT NULL, [userName] [nvarchar](255) NULL, [name] [nvarchar](255) NULL, [phone] [nvarchar](255) NULL, [password] [nvarchar](255) NULL, [ip] [nvarchar](30) NULL, [email] [nvarchar](255) NULL, [pubDate] [datetime] NULL, [todoOrder] [text] NULL ) 死锁跟踪 deadlock-list deadlock victim=process4152ca8 process-list process id=process4152ca8 taskpriority=0 logused=0 …

4
为什么Mongo卡在STARTUP2中?
我有一个Mongo副本集,其中包含一些辅助副本。承载辅助实例的盒子崩溃并丢失了数据库。 我Mongo再次启动了辅助实例,现在它在STARTUP2中停留了12个小时以上。是否有意义 ?文档说Mongo应该在进入RECOVERING状态之前短时间处于STARTUP2 STARTUP2到底是什么意思?它是从主数据库复制数据库吗?我如何验证它(假设Mongo在Linux中运行)?
13 mongodb  recovery 


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.