数据库管理员

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

4
如何确定负责“字符串或二进制数据将被截断”的列。
我使用从远程Pg数据库写入SELECT的代码自动生成一些查询,并将其插入本地SQL Server数据库中。但是,其中之一正在生成此错误: [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]字符串或二进制数据将被截断。(SQL-22001)[状态为22001现在01000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]该语句已终止。(SQL-01000)在。\ insert.pl第106行。 我如何找出哪个列正在生成该错误并且缺少输入的长度?有没有办法不用蛮力猜测所有内容varchar?

2
为什么在SQL Server 2012中查询结果为空的错误?
在MS SQL Server 2012中运行以下查询时,第二个查询失败,但第一个查询失败。同样,如果在没有where子句的情况下运行,则两个查询都会失败。我很茫然,为什么两个都失败,因为两个都应该有空结果集。任何帮助/见解表示赞赏。 create table #temp (id int primary key) create table #temp2 (id int) select 1/0 from #temp where id = 1 select 1/0 from #temp2 where id = 1

6
设备上的媒体系列格式不正确。SQL Server无法处理此媒体系列
我正在尝试在SQL Server中还原.BAK,但出现以下错误: 消息3241,级别16,状态7,行1设备'c:\ glyn \ JA.bak'上的媒体系列格式错误。SQL Server无法处理此媒体系列。消息3013,级别16,状态1,第1行RESTORE DATABASE正在异常终止。 我尝试使用2012年,2008年甚至2005年进行还原,但没有任何效果,我使用了以下查询,Tasks >> Back up但通过的结果却无效,这是我的SQL: RESTORE DATABASE JA FROM DISK='c:\glyn\JA.bak' 有没有人有什么建议?我读过bak可能已损坏,它是由另一位从事该项目的DVD开发人员发送给我的。

3
如何加快对2.2亿行的大型表(9 gig数据)的查询?
问题: 我们有一个社交网站,成员可以互相评价兼容性或匹配性。该user_match_ratings表包含超过2.2亿行(9 gig数据或近20 gig索引)。对该表的查询通常显示在slow.log(阈值> 2秒)中,并且是系统中最常记录的慢速查询: Query_time: 3 Lock_time: 0 Rows_sent: 3 Rows_examined: 1051 "select rating, count(*) as tally from user_match_ratings where rated_user_id = 395357 group by rating;" Query_time: 4 Lock_time: 0 Rows_sent: 3 Rows_examined: 1294 "select rating, count(*) as tally from user_match_ratings where rated_user_id = 4182969 group by rating;" Query_time: …

3
使用多个用逗号分隔的外键是否错误?如果是,为什么?
有两个表:Deal和DealCategories。一笔交易可以有很多交易类别。 因此,正确的方法应该是制作一个DealCategories具有以下结构的表: DealCategoryId (PK) DealId (FK) DealCategoryId (FK) 但是,我们的外包团队通过Deal以下方式将多个类别存储在表中: DealId (PK) DealCategory -- In here they store multiple deal ids separated by commas like this: 18,25,32. 我觉得他们做错了,但是我不知道如何清楚地解释为什么这是不对的。 我应该如何向他们解释这是错误的?或者也许我是错的人,这是可以接受的?

3
将MySQL / Amazon RDS数据库备份到S3的推荐方法是什么?
我有两个目的: 在Amazon Web Services出现区域性问题时进行场外备份。 将生产数据从生产帐单帐户复制到Beta帐单帐户。 当前,亚马逊似乎并没有开箱即用地支持这两种用例之一。 我已经看到提到了mysqldump和xtrabackup(请参阅表单发布)。 我还看到了一个更复杂的过程(在此处记录) 源计费帐户(prod)中的新RDS服务器从最近的备份中分离出来。 在步骤1中启动了一个新的EC2实例,该实例可以访问RDS服务器。 mysqldump用于对该数据库进行备份。 备份已复制到异地位置(S3?)。 在单独的帐户和/或区域中,将启动一个新的RDS服务器。 数据库转储已导入。 提示和建议,不胜感激。

3
HEAP表的有效使用方案是什么?
我目前正在将一些数据导入到旧版系统中,并且发现该系统未使用单个群集索引。快速的Google搜索向我介绍了HEAP表的概念,现在我很好奇在哪种使用情况下,HEAP表比集群表更可取? 据我了解,HEAP表仅对审计表和/或插入比选择频繁发生的地方有用。由于没有要维护的聚簇索引,而且由于非常罕见的读取,因此不会产生额外的碎片,因此,这将节省磁盘空间和磁盘I / O。

3
为了获得绝对性能,SUM是更快还是COUNT?
这涉及对符合特定条件(例如)的记录数进行计数invoice amount > $100。 我倾向于 COUNT(CASE WHEN invoice_amount > 100 THEN 1 END) 但是,这同样有效 SUM(CASE WHEN invoice_amount > 100 THEN 1 ELSE 0 END) 我本来认为COUNT更可取,原因有两个: 传达意图,这是为了 COUNT COUNT 可能涉及i += 1某个地方的简单操作,而SUM不能依靠其表达式作为简单的整数值。 是否有人对特定RDBMS的区别有特定的事实?

5
可以保留一个在表中更新的值吗?
我们正在开发一个用于预付卡的平台,该平台基本上保存有关卡及其余额,付款等的数据。 到目前为止,我们有一个Card实体,该实体具有一个Account实体集合,并且每个Account都有一个Amount,该数量在每次存款/提款中都会更新。 团队中现在有一场辩论;有人告诉我们,这违反了Codd的12条规则,并且在每次付款时更新其值都是很麻烦的。 这真的有问题吗? 如果是,我们该如何解决?

1
设计平台:一个数据库还是多个数据库?
我们正在构建一个包含多个服务的网络平台,每个服务都有自己的基础数据。这些服务是按照面向服务的体系结构的原则独立构建的,但是它们会针对潜在的相关数据进行交易。我们正在考虑这些服务应该共享一个大数据库还是每个都有自己的数据库。(我们计划在Windows 2008群集上使用SQL Server 2008 Enterprise。) 我们已经考虑过的每种方法的一些优点包括: 单一数据库 可以通过外键约束将来自不同服务的数据关联在一起 分析摘录更易于编写和执行 在发生灾难的情况下,将平台恢复到一致状态更加容易 对于由多个服务引用的数据,一个服务缓存的数据很可能会在另一服务之后不久使用 管理和监控更简单,更便宜 多个数据库 维护工作,硬件问题,安全漏洞等未必会影响整个平台 假设每个数据库都在单独的硬件上,则与扩展一个大型机相比,扩展多台计算机可获得更多的性能优势。 从操作角度来看,此平台中的每个服务都拥有自己的数据库,或者它们都位于同一个数据库中,是否更具优势?哪些关键因素可以回答这个问题?

6
使用SQL Server进行负载平衡
如今可以在Windows Server上执行Microsoft SQL Server负载平衡并且对任何程序访问都是透明的。这是内置的,还是必须购买解决方案? 我试图找出今天是否有一种解决方案,从Web服务器或其他对SQL Server的数据库访问的角度来看,这使此操作非常容易。
31 sql-server 

5
开发人员是否可以遵循“最佳实践”类型的流程来进行数据库更改?
什么是将数据库更改从开发环境迁移到质量保证到生产环境的好方法?目前,我们: 在SQL文件中编写更改脚本,并将其附加到TFS工作项。 这项工作经过同行评审 当工作准备好进行测试时,SQL将在QA上运行。 这项工作已经过质量检查 当工作准备好进行生产时,SQL将在生产数据库上运行。 问题在于这是非常手动的。它依赖于开发人员记住附加的sql或由开发人员忘记的peer-reviewer来捕获它。有时,最终是发现问题的测试人员或QA部署人员。 第二个问题是,如果两个单独的任务更改同一数据库对象,则有时最终需要手动协调更改。这可能只是事实,但似乎仍然应该有一些自动方式来“标记”这些问题或其他内容。 我们的设置:我们的开发车间充满了具有丰富数据库经验的开发人员。我们的项目非常面向DB。我们主要是.NET和MS SQL商店。当前,我们正在使用MS TFS工作项来跟踪我们的工作。这对于代码更改非常方便,因为它将更改集链接到工作项,因此我可以准确地找到在迁移到质量检查和生产环境时需要包括哪些更改。我们目前不使用数据库项目,但将来可能会切换到该项目(也许是答案的一部分)。 我非常习惯于我的源代码控制系统来照顾这样的事情,并且希望我的SQL拥有相同的事情。

2
I / O请求耗时超过15秒
通常,我们每周的完整备份大约需要35分钟,而每天的差异备份大约需要5分钟。自星期二以来,每天花了将近4个小时才能完成工作,远远超出了要求。巧合的是,这在我们有了新的SAN /磁盘配置后就开始发生。 请注意,该服务器正在生产中运行,我们没有任何总体问题,它运行平稳-除了IO问题主要体现在备份性能方面。 在备份期间查看dm_exec_requests时,备份一直在等待ASYNC_IO_COMPLETION。啊哈,所以我们有磁盘争用! 但是,MDF(日志存储在本地磁盘上)和备份驱动器都没有任何活动(IOPS〜= 0-我们有足够的内存)。磁盘队列长度也约为0。CPU徘徊在2-3%左右,也没有问题。 SAN是Dell MD3220i,该LUN由6x10k SAS驱动器组成。服务器通过两条物理路径连接到SAN,每条物理路径通过一个单独的交换机,并具有到SAN的冗余连接-共有4条路径,其中两条在任何时间都处于活动状态。我可以通过任务管理器验证两个连接均处于活动状态-完美地平均分配负载。两种连接都运行1G全双工。 我们曾经使用巨型帧,但是我已禁用它们以排除此处的任何问题-无需更改。我们有另一台服务器(相同的OS + config,2008 R2)已连接到其他LUN,并且没有任何问题。但是,它不运行SQL Server,而只是在它们之上共享CIFS。但是,它的LUN首选路径之一与麻烦的LUN在同一SAN控制器上-因此我也排除了这一点。 尽管存在以下问题,但运行几个SQLIO测试(10G测试文件)似乎表明IO很不错: sqlio -kR -t8 -o8 -s30 -frandom -b8 -BN -LS -Fparam.txt IOs/sec: 3582.20 MBs/sec: 27.98 Min_Latency(ms): 0 Avg_Latency(ms): 3 Max_Latency(ms): 98 histogram: ms: 0 1 2 3 4 5 6 7 8 9 10 11 12 …


5
没有数据更改的UPDATE性能
如果我有一条UPDATE声明实际上并未更改任何数据(因为数据已经处于更新状态)。在WHERE子句中添加检查以阻止更新是否对性能有好处? 例如,在以下情况下,UPDATE 1和UPDATE 2之间的执行速度是否会有所不同: CREATE TABLE MyTable (ID int PRIMARY KEY, Value int); INSERT INTO MyTable (ID, Value) VALUES (1, 1), (2, 2), (3, 3); -- UPDATE 1 UPDATE MyTable SET Value = 2 WHERE ID = 2 AND Value <> 2; SELECT @@ROWCOUNT; -- UPDATE 2 UPDATE MyTable SET …

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.