数据库管理员

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

2
数据仓库设计,用于针对多个时区的数据进行报告
我们正在尝试优化数据仓库设计,以支持针对许多时区的数据进行报告。例如,我们可能有一个关于一个月活动的报告(数百万行),该报告需要显示按一天中的小时分组的活动。当然,一天中的那个小时必须是给定时区的“本地”小时。 当我们仅支持UTC和一个本地时间时,我们的设计效果很好。事实表上的UTC和本地时间的日期和时间维度的标准设计。但是,如果我们必须支持100多个时区的报告,则该方法似乎无法扩展。 我们的事实表将变得非常广泛。另外,我们还必须解决SQL中的语法问题,即指定在报告的任何给定运行中使用哪个日期和时间ID进行分组。也许是一个非常大的CASE语句? 我已经看到了一些建议,可以按您覆盖的UTC时间范围获取所有数据,然后将其返回到表示层以转换为本地并在那里进行汇总,但是使用SSRS进行的有限测试表明这将非常慢。 我也参考了一些有关该主题的书籍,它们似乎都说只有UTC并可以进行转换,或者只有UTC和一个本地语言。将不胜感激任何想法和建议。 注意:此问题类似于:在数据集市/仓库中处理时区,但是我无法对此问题发表评论,因此感到这是值得的。 更新:在 Aaron进行了一些重大更新并发布了示例代码和图表之后,我选择了Aaron的答案。我先前对他的答案的评论不再有意义,因为它们涉及答案的原始编辑。如果有必要,我会尝试再次更新此内容

1
查询性能不佳
我们有一个很大的过程(10,000行以上),通常需要0.5-6.0秒才能运行,具体取决于要处理的数据量。在过去一个月左右的时间里,在我们使用FULLSCAN更新统计信息后,开始花费了30秒钟以上。当速度变慢时,sp_recompile会“修复”该问题,直到夜间统计作业再次运行。 通过比较慢速执行计划和快速执行计划,我将其范围缩小到了特定的表/索引。当它运行缓慢时,它估计将从特定索引返回大约300行,而当它运行速度较快时,它估计将有1行。当它运行缓慢时,在对索引执行查找后将使用表后台处理程序;而当它运行速度较快时,它将不执行表后台处理程序。 使用DBSS SHOW_STATISTICS,我在excel中绘制了索引直方图。我通常希望该图更像是“起伏的丘陵”,但相反,它看起来像一座山,最高点比该图上的其他大多数值高2x-3x。 如果我在没有FULLSCAN的情况下更新统计信息,它看起来会更正常。如果我再次使用FULLSCAN运行它,则看起来就像我上面描述的那样。 这感觉像一个参数嗅探问题,并且特别与上面的(看似)怪异的索引分布有关。 proc接受表值参数,表值参数上是否可以进行参数嗅探? 编辑:proc还需要12个其他参数,其中一些是可选的,其中两个是开始日期和结束日期。 直方图是奇数,还是我吠错了树? 我当然很愿意尝试调整查询和/或尝试调整索引。如果那是很好的解决方案,那时候我的问题更多是关于偏斜的直方图。 我应该提到这是PK IDENTITY聚集索引。我们有两个互相通信的系统,一个是旧系统,一个是新的本地系统。两个系统都存储相似的数据。为了使它们保持同步,即使将数据添加到旧系统中(完成RESEED处理),也可以在将新事物添加到旧系统中后在新系统中的此表上增加PK。因此,此列中的编号可能存在​​一些差距。记录很少删除(如果有的话)。 任何想法将不胜感激。我非常高兴收集/包含更多信息。

3
如何查找数据库中没有显式主键的所有表?
一次Google搜索发出了数百万点击的信息,说明如何查找没有聚集索引的表,而PK通常是表的聚集索引。但是,表可以轻松地将自然键用作聚簇索引,并具有非聚簇代理索引(例如标识列)。 如何在未定义主键的数据库中查找所有表?我在该数据库中有245个表:手动检查效率很低。





2
何时更改并行性的成本阈值
在检查性能问题时,我发现大量涌入的CXPACKETS暗示我可能需要研究并行度的成本阈值,也许还需要考虑MAXDOP。 在对MAXDOP进行任何重大更改之前,我已经遵循许多其他人的建议,包括@mrdenny在SQL Server 2008的CXPACKET Waits性能调整中的建议以及@ aron-Bertrand在处理CXPACKET等待中的答案-设置成本阈值用于并行性。我已添加维护,以每晚更新一次完整的统计信息。这感觉就像是明智之举。 但是,修改成本阈值仍然让我感到困惑。 在什么时候应该更改并行性的成本阈值?是否有人举了一个例子(在检查了查询和工作负载的成本之后)他们对该成本进行了更改? 抱歉,是否已在上一个问题中得到了解答。 谢谢!

1
在80M行索引表上运行插入查询时,MSG 666
奇怪的是,我的存储过程开始收到某些输入数据的消息666。 当存储过程尝试将行插入具有以下结构的表中时,存储过程在最后一步失败: Columns: A_Id: PK, int B_Id: PK, FK, int C_Id: PK, FK, int D_Id: PK, smallint 这实际上是一个将所有引用的实体连接在一起的表。 Indexes: IX_TableName_D_id - Clustered index on D_id column PK_TableName - Unique non-clustered index on all columns (A_Id, B_Id, C_Id, D_Id) 两个索引的碎片率都很​​低(<25%)。但是,由于对表的操作量非常大,PK_TableName碎片迅速增加。 桌子尺寸: Row count: ~80,000,000 rows 因此,当我尝试运行简单的查询时,对于某些D_Id,我会收到以下消息: 消息666。对于分区ID为422223771074560的索引,超出了复制组的最大系统生成的唯一值。删除并重新创建索引可能会解决此问题;否则,请使用另一个群集密钥。 查询示例: INSERT INTO TableName …

2
mysqladmin没有采取内联密码
我正在尝试设置一个cron作业,以便从从机上进行备份。所以我要停止奴隶 我发出命令 mysqladmin --user=root --password=test_pass stop-slave 但这会引发错误: mysqladmin:在“ localhost”处连接到服务器失败错误:“对用户“ root” @“ localhost”的访问被拒绝(使用密码:是) 现在我尝试使用命令 mysqladmin --user=root --password stop-slave 它提示输入密码,我给了as test_pass,一切都很好。 为什么会这样呢?有什么选择? 注意:顺便说一句,我的mysql版本是mysql-5.0.95-5,这有意义。

1
动态将列名传递给UNPIVOT
我有一个包含以下数据的表 First Second Third Fourth Fifth Sixth 2013-08-20 2013-08-21 2013-08-22 2013-08-23 2013-08-24 2013-08-25 并使用 UNPIVOT SELECT Data ,DATENAME(DW, Data) AS DayName FROM Cal UNPIVOT(Data FOR D IN ( First, Second, Third, Fourth, Fifth, Sixth )) AS unpvt 我得到以下结果 Data DayName 2013-08-20 Tuesday 2013-08-21 Wednesday 2013-08-22 Thursday 2013-08-23 Friday 2013-08-24 Saturday …

1
将Select语句放入事务中
这两个查询之间有什么区别: START TRANSACTION; SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; COMMIT; 而且没有交易: SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; 进行SELECT内部交易有什么影响? 如果在这两种情况DELETE FROM orders WHERE id=1之后都SELECT在另一个会话中被调用,它将在何时进行处理?

3
数据库大小-MDF太大?
我正在维护一个SQL Server 2005数据库,该数据库承载大约2.9Tb的数据(2 x 1.45Tb-我具有RAW架构和Analysis架构,因此基本上是摄取的数据的两个副本)。恢复模型为SIMPLE,恢复模型为.ldf6Gb。 无论出于什么原因,它.mdf都是7.5Tb。现在,在Analysis表中可能只有2-3个附加列,NVARCHAR(MAX)而从我(可能是误解-如果我错了,请纠正我)可能导致额外的空间分配的列不多。那是在紧缩数据库之后-在此之前大约是9Tb。有什么想法吗? 并且,如果您还有其他问题,请告诉我-我是数据库管理和优化工作的新手(我通常不做这方面的工作:)。 非常感谢! 安德里亚

1
表格存在时获取“ ORA-00942:表格或视图不存在”
我是Oracle数据库的新手。我已经安装Oracle Database 11g R2了Oracle Linux 6。我已经使用以下方法成功创建了一个新数据库dbca并连接到该数据库: $ sqlplus "/ as sysdba" 我成功创建了一个表,并插入了一些数据并执行了一些选择: SQL> CREATE TABLE Instructors ( tid NUMBER(7) PRIMARY KEY, fname VARCHAR2(32), lname VARCHAR2(32), tel NUMBER(16), adrs VARCHAR2(128) ); Table created. SQL> INSERT INTO Instructors (tid, fname, lname, tel, adrs) VALUES (8431001, 'John', 'Smith', 654321, 'London'); 1 row created. …


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.