数据库管理员

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

2
使用WITH进行多项操作
有没有一种方法可以使用该WITH语句执行多个操作? 就像是 WITH T AS ( SELECT * FROM Tbl ) BEGIN OPEN P_OUTCURSOR FOR SELECT * FROM T; SELECT COUNT(*) INTO P_OUTCOUNT FROM T; END; 我想选择一些数据及其数量...
16 oracle  select  cte 

1
DBCC CheckDB会丢失哪些类型的损坏?
这个问题是由较早的帖子提示的,我将一个数据库归档以备将来调查,该数据库已恢复,具体操作如下: BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file ’BrokenDatabase.mdf'. Error: 3043, Severity: 16, State: 1. 在链接的问题和我准备进行DBCC PAGE调查的备份中,DBCC CHECKDB顺利通过,但显然存在损坏。 CHECKDB将通过但BACKUP WITH CHECKSUM失败将发生什么类型的损坏?

2
从MyISAM在线转换为InnoDB后缺少行
我们有一个相当小的数据库,我们希望将其从MyISAM转换为InnoDB。作为数据库新手,我们甚至在不关闭站点的情况下进行了转换(使用alter table)。 现在,转换已完成,似乎缺少许多间歇行。这可能是由于转换期间的操作造成的吗?还是这个问题在其他地方?
16 mysql  innodb  myisam 

6
归一化:是否可以将静态数字(如年份)拆分到自己的表中?
我正在与另一位数据库设计师就标准化进行有趣的讨论。在此示例中,我们有一个GameTitles表,每个记录必须包含游戏发布的年份。他说2NF要求必须对所有内容进行规范化,因此,为了合规,年份字段应拆分为带有自己主键的ReleaseYears表,该主键由GameTitles表引用。我说它应该保留为GameTitles表本身上的一个字段。 我对此的论点是,一年只是一个非原始的数值,从本质上说是静态的(即2011年始终为2011年)。因此,它是它自己的标识符,因为它就是它,所以不需要引用它。这还引入了额外的维护,因为您现在必须在表中添加一个新的年份以供参考。如果您在表中使用大范围的年份进行填充,那么您将拥有多余的记录,这些记录可能根本不会引用它们。这也增加了数据库的大小,因为您现在有了额外的表,记录开销以及年份本身的额外主键。如果将年份保留为GameTitles表中的字段,则可以消除所有这些额外的维护和开销。 有这个想法吗? 编辑:打算将此发布在StackOverflow上。有人可以投票删除它或举报以引起注意吗?

2
哪种DBMS适合超快速读取和简单的数据结构?
我正在开发一种产品,作为其操作的一部分,它必须跟踪大量文件/目录。这个想法是将统计信息存储在数据库中,然后在启动时为每个文件创建监视。更改的文件将排队(在数据库中),以便组同步到远程数据库。它们将按照优先级顺序(1-10之间的数字)进行同步。 有关数据库的信息: <100,000个统计信息条目 在启动时读取整个数据库,只需要文件路径 排队的文件将具有优先级字段(无需搜索其他内容) 插入可能很慢 我找到了一些我认为可以使用的数据库,但是我不确定哪一个是最好的: Redis-将文件路径存储为密钥,将统计数据存储为值;队列将是一个列表 MongoDB-比Redis更多的查询选项,但仍然快速 我认为NoSQL数据库将是最好的解决方案,因为没有太多的关系逻辑,总数据量也不会太大(例如<100 mb,更接近<30 mb)。我确实看过SQLite,因为它看起来很简单,可以嵌入可安装的应用程序中。 由于这是面向最终用户而不是高负载服务器的分布式应用程序,因此数据库不必支持许多同时用户。这里的首要任务是找到一个最有意义的数据库。 那么问题是,哪种数据库最适合这种情况? 另外,是否还有其他数据库对这样的应用程序更有意义?

7
这些表设计中哪一个对性能更好?
我被要求创建一些东西来跟踪每天在帐户上收取的费用,而我正在尝试找出一个支持此目的的数据库表模式。 这就是我所知道的 公司拥有超过250万个帐户 其中,他们目前平均每月工作200,000(随着人员配备水平的变化而变化,目前水平很低) 他们想跟踪13种不同的费用类型,并且警告说,将来可能会增加更多的费用 他们希望每天跟踪费用 成本不会在整个库存中分配。它们可以分为每月工作的帐户数量(200,000),或者用户可以输入帐户标识符以将成本应用于一组帐户,或者可以仅指定将成本应用于哪个帐户。 我首先想到的是规范化的数据库: 帐户ID 日期 CostTypeId 量 我的问题是数学。该表将迅速变得庞大。假设所有13种成本类型都应用到了当月的所有工作帐户,即每月200k * 13 * N days in month大约75-8000万条记录,或者每年接近10亿条记录。 我的第二个想法是将其标准化 帐户ID 日期 总计花费 CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13 此方法更加不200k * N days in month规范,每月最多可以创建600万条记录(),或每年大约7200 万条。它比第一种方法少很多,但是,如果公司将来决定使用新的费用类型,则需要添加另一个数据库列。 在这两种方法中,您更喜欢哪一种?为什么?您是否可以想到另一种更好的选择? 我最感兴趣的是报告性能,包括总结报告和详细报告。当没有人在附近时,将费用分摊到各个帐户的工作将每晚进行。第二个问题是数据库大小。现有的数据库已经接近300GB,我相信磁盘上的空间约为500GB。 该数据库是SQL Server 2005

1
有没有人推荐一本教授分片的书?
有没有人对这本讲授数据库分片的书有很好的推荐(最好从零开始) 我读过40多个有关分片的网站。 我并不是说在线站点/博客很糟糕,它们是不错的选择。但是,我需要的主要餐点不仅仅是这里和那里的有用信息。基本上,我对如何实现分片有一个想法(但是我想),但是由于这是一个非常复杂的概念,因此我相信还有很多很多可以研究。
16 mysql  sql-server 

1
您如何按参数订购?
只是想知道我是否可以对正在运行的存储过程征求一些反馈,以及是否存在一种处理场景的更有效方法(我敢肯定会存在!)。 基本上,我有一个SP,可以调用它返回可能具有一个或多个状态和排序顺序的记录(作业)列表(我使用RowNum进行分页)。目前,我正在使用WITH RECOMPILE,因为状态的变化可以随时更改(取决于用户等)。还有一些过滤正在进行。 我正在使用IF语句来本质上运行相同的代码,唯一的变化是排序顺序。 我想我的问题是:是否有更好的方法(也许对于不同的状态使用不同的SP)?由于缺乏知识,我是否会使事情变得过于复杂(很有可能)SP确实可以,但是需要进行一些细微的调整以减少行数吗? 我在下面粘贴了一部分SP-完整代码的唯一区别是不同排序顺序的其他IF语句... 我将不胜感激。 提前致谢! PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy varchar(50), @CustomerID int, @ShowNotSet bit, @ShowPlaced bit, @ShowProofed bit, @ShowReProofed bit, @ShowApproved bit, @ShowOnTime bit, @ShowLate bit, @ShowProblem bit, @ShowCompleted bit, @ShowDispatched bit, @ShowUnapproved bit, @ShowClosed bit, @ShowReturned bit, @UserID int WITH RECOMPILE …

1
运行文件时PostgreSQL退出状态
使用单个SQL命令运行PostgreSQL时,按预期返回错误代码: % psql -c "SELECT * FROM AWDASDASDASDAS" my_db ERROR: relation "awdasdasdasdas" does not exist LINE 1: SELECT * FROM AWDASDASDASDAS % echo $? 1 但是在运行文件时,该错误被抑制: % psql -f test.sql my_db psql:test.sql:1: ERROR: relation "awdasdasdasdas" does not exist LINE 1: SELECT * FROM AWDASDASDASDAS % echo $? 0 任何想法如何找回这些错误?
16 postgresql 

2
偶尔查询缓慢的原因?
我们在Windows Server 2008 R2上运行MySQL 5.1。 我们最近在数据库上进行了一些诊断,发现了一些无法解释的令人不安的工件。当查询花费很长时间(> 2000ms)时,我们添加了一些代码来记录日志。结果令人惊讶(并且可能解释了我们的僵局)。 有时,查询通常花费很少的时间(<10毫秒),而这需要4到13秒。需要明确的是,这些查询持续不断地运行(每秒几次),并且不受这些查询时间尖峰的影响。 我们已经通过索引查找任何明显的错误,并且运气不高。 更新资料 人员表: | people | CREATE TABLE `people` ( `people_id` bigint(20) NOT NULL AUTO_INCREMENT, `company_id` bigint(20) NOT NULL, `name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `temp_password` varchar(10) DEFAULT NULL, `reset_password_hash` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `phone` varchar(32) DEFAULT …

2
无法破译innodb状态日志中的死锁
我们正在从Microsoft ADO.NET连接器访问MySQL。 有时,我们在innodb状态中看到以下死锁,并且无法确定问题的原因。看起来事务(2)正在等待并持有相同的锁? ------------------------ LATEST DETECTED DEADLOCK ------------------------ 110606 5:35:09 *** (1) TRANSACTION: TRANSACTION 0 45321452, ACTIVE 0 sec, OS thread id 3804 starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 368, 1 row lock(s) MySQL thread id 84, query id …

5
什么时候应该将非聚集索引存储在单独的文件组中?
我听说将索引存储在不同的文件组和驱动器上可以提高数据库的性能,因为驱动器不必在索引和索引所引用的数据之间来回移动。我也听说这是一个神话。 何时建议将非聚集索引存储在单独的文件组和驱动器上?什么性能/分析器证据会导致我得出该结论?硬件在决策中是否起作用(是否在单个驱动器上使用RAID / SAN)?
16 sql-server  index 

2
SQL Server 2008-分区和聚集索引
因此,请允许我说我对数据库的设计没有完全控制权,因此,对于本场景而言,无法更改当前系统的许多方面。 关于我们应该如何重新考虑设计方面的评论可能是正确的,但无济于事:) 我有一个很大的表,大约150个字段宽,大约600m行,它驱动着大量的进程。这是在数据仓库的情况下,因此我们在计划的加载过程之外没有任何更新/插入,因此它的索引很高。 已做出尝试对该表进行分区的决定,并且我对索引已分区表有些担忧。我没有分区方面的经验,因此不胜感激任何输入或链接。我在BOL或msdn上找不到具体的位置。 目前我们群集上一个领域,我们称之为IncidentKey这是一个varchar(50),而不是唯一的-我们可以1-100记录与同一之间有IK(没有意见,请)。我们经常会在旧IncidentKey记录上获取新数据,因此也不是连续的。 我了解我需要IncidentDate在群集索引键中包含分区字段,以使分区正常工作。我在想IncidentKey, IncidentDate。 问题是,如果“新”分区中的记录应该在聚簇索引中“旧”分区中的记录之前,则聚簇索引的机制将如何在分区表的2部分键上工作? 例如,我有5条记录: IncidentKey Date ABC123 1/1/2010 ABC123 7/1/2010 ABC123 1/1/2011 XYZ999 1/1/2010 XYZ999 7/1/2010 如果我得到一条新记录,ABC123, 2/1/2011它将需要在聚集索引BEFORE中 XYZ999, 1/1/2010。这是如何运作的? 我假设使用碎片和指针,但是找不到具有双部分键的分区表上非分区聚簇索引的物理存储和配置的任何信息。

3
如何在MySQL存储过程中使用准备好的语句?
我正在使用mysql,我需要以某种方式在以后的查询中使用由prepared语句返回的curid列。我使用准备好的语句,因为如我所读,这是将变量传递给LIMIT子句的唯一方法。我在这里有此存储过程: DROP PROCEDURE IF EXISTS fixbalance; CREATE PROCEDURE fixbalance (userid INT) BEGIN DECLARE i INT DEFAULT 0; DECLARE balance INT DEFAULT 0; DECLARE idcnt INT; SET idcnt = (SELECT COALESCE(COUNT(id), 0) FROM coupon_operations WHERE user_id = userid); IF idcnt <> 0 THEN WHILE i <= idcnt DO BEGIN SET @iter …

1
SQL Anywhere 11:恢复增量备份失败
我们希望在完整备份后创建远程增量备份。这将使我们能够在发生故障时进行恢复,并通过SQL Anywhere网络服务器启动另一台具有尽可能接近实时备份的计算机。 我们正在执行完整备份,如下所示: dbbackup -y -c "eng=ServerName.DbName;uid=dba;pwd=sql;links=tcpip(host=ServerName)" c:\backuppath\full 这样可以备份数据库和日志文件,并且可以按预期进行还原。对于增量备份,如果有多个增量备份,我会使用重命名方案尝试实时和增量事务日志: dbbackup -y -t -c "eng=ServerName.DbName;uid=dba;pwd=sql;links=tcpip(host=ServerName)" c:\backuppath\inc dbbackup -y -l -c "eng=ServerName.DbName;uid=dba;pwd=sql;links=tcpip(host=ServerName)" c:\backuppath\live 但是,在还原时应用事务日志时,将事务日志应用于数据库时,我总是会收到错误消息: 10092:无法找到事务日志中引用的表的表定义 transaction log restore命令为: dbeng11 "c:\dbpath\dbname.db" -a "c:\backuppath\dbname.log" 该错误未指定找不到的表,但这是一个受控测试,没有表被创建或删除。我插入几行,然后在尝试还原之前启动增量备份。 有谁知道在Sql Anywhere 11上进行增量备份和还原的正确方法? 更新:认为可能与目标数据库的复杂性有关,我制作了一个新的空白数据库和网络服务。然后添加一个带有两列的表并插入几行。进行完全备份,然后插入和删除更多行和已提交的事务,然后进行增量备份。在还原完整备份后尝试应用事务日志的增量备份时,此操作也失败,并显示相同的错误... 编辑: 您可以通过以下链接查看相同的问题,并获得有关SA的更多反馈:http : //sqlanywhere-forum.sybase.com/questions/4760/restoring-incrementallive-backup-failure

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.