数据库管理员

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

3
将具有多个联接的SQL查询拆分为较小的联接有帮助吗?
我们需要每晚在SQL Server 2008 R2上进行一些报告。计算报告需要几个小时。为了缩短时间,我们预先计算了一张桌子。该表是基于JOINining 12个很大的表(数十亿行)创建的。 直到几天前cca才花费了4个小时来计算此聚合表。我们的DBA将此大联接分成3个较小的联接(每个联接4个表)。每次都将临时结果保存到一个临时表中,该表将在下一个联接中使用。 DBA增强的结果是,聚合表是在15分钟内计算出来的。我想知道这怎么可能。DBA告诉我,这是因为服务器必须处理的数据数量较少。换句话说,在大型原始联接中,与汇总较小的联接相比,服务器必须处理更多的数据。但是,我认为优化器将通过原始的大联接有效地完成此任务,自行拆分联接并仅发送下一个联接所需的列数。 他所做的另一件事是他在一个临时表上创建了一个索引。但是,我再一次认为优化器将在需要时创建适当的哈希表,从而更好地优化计算。 我曾与我们的DBA讨论过此事,但他本人不确定是什么原因导致了处理时间的缩短。他只是提到,他不会怪服务器,因为计算如此大的数据可能不堪重负,而且优化器可能很难预测最佳的执行计划...。我了解这一点,但是我想对原因进行更多定义。 因此,问题是: 有什么可能导致重大改进? 将大联接拆分为较小联接是标准程序吗? 如果有多个较小的联接,则服务器必须处理的数据量真的减少了吗? 这是原始查询: Insert Into FinalResult_Base SELECT TC.TestCampaignContainerId, TC.CategoryId As TestCampaignCategoryId, TC.Grade, TC.TestCampaignId, T.TestSetId ,TL.TestId ,TSK.CategoryId ,TT.[TestletId] ,TL.SectionNo ,TL.Difficulty ,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty) ,TQ.[QuestionId] ,TS.StudentId ,TS.ClassId ,RA.SubjectId ,TQ.[QuestionPoints] ,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then …

2
从SQL 2005 [SQL_Latin1_General_CP1_CI_AS]迁移到2008-我将通过使用“向后兼容性”来丢失任何功能
我们正在从SQL 2005 [实例和数据库的归类为SQL_Latin1_General_CP1_CI_AS]到SQL 2008 [默认为Latin1_General_CI_AS]。 我完成了SQL 2008 R2的安装,并使用了默认Latin1_General_CI_AS排序规则,并且数据库还原仍在进行中SQL_Latin1_General_CP1_CI_AS。发生了例外的问题- Latin1_General_CI_AS数据库在 其中的#temp表所在的位置 SQL_Latin1_General_CP1_CI_AS,这就是我现在所在的位置-我现在需要有关陷阱的建议。 在安装SQL 2008 R2中,我对安装使用的选项'SQL Collation, used for backwards compatibility',我必须选择相同的排序规则为2005数据库的选项:SQL_Latin1_General_CP1_CI_AS。 这将使我在#temp表上没有问题,但是有陷阱吗? 如果不使用SQL 2008的“当前”排序规则,是否会丢失任何类型的功能或特性? 当我们从2008年迁移到SQL 2012时(例如,在2年内)怎么办?那我有问题吗? 我会在某个时候被迫去Latin1_General_CI_AS吗? 我读到一些DBA的脚本完成了完整数据库的行,然后使用新的排序规则将插入脚本运行到数据库中-我对此感到非常害怕和警惕-您会建议这样做吗?

2
通过子查询选择多列
我正在尝试从以下查询中的子查询中选择2列,但无法这样做。尝试创建别名表,但仍然无法获取它们。 SELECT DISTINCT petid, userid, (SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate, (SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID FROM pet LEFT JOIN comments ON pet.id = comments.petid WHERE userid='ABC' AND deviceID!='ABC' AND comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH); 基本上,我试图从同一行中获取lastComDate&lastPosterID,该行是针对特定宠物的注释中的最新行。请提出如何有效地获取它们的建议。 上面的查询有效,但由于两次获取同一行而显得有些矫kill过正。而且,该ORDER BY子句比聚合函数要慢得多-正如我在分析查询时发现的那样。因此,避免排序的解决方案将不胜感激。


1
数据库存档解决方案
继续我提出的一个问题,将高容量和高访问量的表移至单独的数据库是否是一个好主意?,我正在寻找可用于PostgreSQL中数据库归档的不同技术/解决方案。 我能想到的解决方案很少: 表分区 单独的表空间和/或架构 将存档的记录/表移动到其他硬盘 任何其他建议/指针/解决方案都将受到欢迎和赞赏。 注意:我们在CentOS5.2上运行PostgreSQL v9.1.3

1
依靠mdf和ldf文件的卷影卷备份是否安全?
我们正在寻找将mdf和ldf文件的基于VSS的备份替换为传统的SQL Server备份。作为数据库管理员,我对此有些抽搐,但是我找不到任何证据证明这行不通? 谁能建议我可以设置一个试验,以证明使用此策略在哪里我们会失去交易?[在长期运行中拔出电源线很好]。 我们正在寻找的系统创建mdf和ldf文件的初始快照,然后在更改之间进行复制。我无法想象会失败的情况。 希望您能帮助我说服老板,我们需要保留传统备份!
18 sql-server 

3
从客户端检查与SQL Server的连接的简便方法
为了进行故障排除,我希望能够检查客户端是否可以连接到SQL Server实例,而与可能无法连接到SQL Server的应用程序无关。 是否有一种简单的方法(即不必安装第三方软件)使用默认的Windows系统工具来执行此操作?也许使用脚本或网络应用程序?

4
如何在不影响性能的情况下备份大型SQL Server数据库?
我们已经收到有关查询运行缓慢或凌晨超时的报告,而我认为运行可能会影响到此的唯一工作就是数据库备份工作。 数据库本身约为300GB,备份作业从凌晨4:30开始,直到凌晨7:00才完成。我们备份作业的当前语法为: BACKUP DATABASE [DatabaseName] TO DISK = N'E:\Database Backups\DatabaseName.Bak' WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak', NOSKIP, STATS = 10, NOFORMAT E:\ 是服务器上的一个分区,既包含数据库又包含数据库备份。 还应该注意,这是虚拟服务器,而不是专用的独立服务器。切换到虚拟服务器后,我们立即开始抱怨备份过程中的速度降低,因此我认为这可能与之相关。 有没有一种方法可以运行此备份作业,使其在运行时不影响查询性能? 我们正在使用SQL Server 2005


4
增加innodb_buffer_pool_size和innodb_log_file_size后,mysql将无法启动
我在这里遵循此解决方案/programming/3927690/howto-clean-a-mysql-innodb-storage-engine/4056261#comment14041132_4056261并尝试将其增加到innodb_buffer_pool_size4G和更高的1G(也为1024M)除了日志文件的大小,但mysql不会以这些值开头。如果我把它放回512M,mysql启动正常。 我该如何解决?我的服务器是16GB,根据Webmin sysinfo的说法: Real memory 15.62 GB total, 3.13 GB used 同时,我也找到了错误日志: 120529 10:29:32 mysqld_safe mysqld从pid文件/var/run/mysqld/mysqld.pid结束 120529 10:29:33 mysqld_safe使用/ var / lib / mysql中的数据库启动mysqld守护程序 120529 10:29:33 [注意]插件“ FEDERATED”已禁用。 120529 10:29:33 InnoDB:InnoDB内存堆已禁用 120529 10:29:33 InnoDB:互斥体和rw_locks使用GCC原子内置函数 120529 10:29:33 InnoDB:压缩表使用zlib 1.2.3 120529 10:29:33 InnoDB:使用Linux本机AIO 120529 10:29:33 InnoDB:初始化缓冲池,大小= 1.0G 120529 10:29:33 InnoDB:缓冲池的完成初始化 InnoDB:错误:日志文件./ib_logfile0的大小不同0 134217728字节 …

2
是否可以给优化器更多或所有需要的时间?
鉴于优化器无法花所有需要的时间(它必须使执行时间最小化并且不做任何贡献)来探索所有可能的执行计划,因此有时它会被切断。 我想知道是否可以覆盖它,以便您可以在需要的所有时间(或一定的毫秒数)内给予优化器。 我不需要这个(atm),但是我可以想象这样一个场景:在一个紧密的循环中执行一个复杂的查询,而您想提出一个最佳计划并事先对其进行缓存。 当然,它存在一个死循环,您应该重写查询,以便它消失但请耐心等待。 出于好奇,这更多是一个问题,还需要了解短路优化和完整优化之间有时是否存在区别。 事实证明,您可以使用跟踪标志2301给优化器更多时间。这并不是我所要的,但它接近了。 我发现的最佳信息是Ian Jose 在SQL Server 2005 SP1中的查询处理器建模扩展中。 请谨慎使用此跟踪标志!但是在提出更好的计划时可能会很有用。也可以看看: 由Grant Fritchey 标记为“优化级别”的文章。 在升级到SQL Server 2008之前……由Brent Ozar撰写。 Microsoft支持在高性能工作负载中运行时的SQL Server调整选项。 我在考虑具有大量联接的查询,其中联接顺序的解决方案空间呈指数爆炸式增长。SQL Server使用的试探法非常好,但是我想知道优化器是否有更多时间(在几秒钟甚至几分钟的范围内)是否会提出不同的顺序。

1
如何还原纯文本postgres .backup文件
我以纯格式从pgAdmin导出了一个postgres数据库,因为我想搜索整个数据库文本。然后,我尝试恢复数据库,但是它给出了一个错误,指出存档文件不是有效的存档文件。如果可以还原数据库,该如何还原呢?

3
来自sql server的高磁盘I / O还是正在减慢sql server的速度?
我一直在与DBA和几个硬件专家争论我们SQL服务器上的性能问题。通常,一切都很好,但是在过去的几周中,我们在sql服务器中一直遇到巨大的延迟高峰。很明显,SQL Server正在磁盘I / O上等待。但是我一直被告知这是因为SQL Server请求异常高的I / O。事实并非如此。从运行中我可以看到没有异常,DBA关心的只是导致阻塞的原因,等等,这是没有用的。例如,我们看到的主要备份是对ASPState数据库的操作,我们正在使用它来管理Web服务器上的ASP会话状态。这些操作通常不会在Sp_who2活动结果上看到,因为它们发生得如此之快。数据库处于简单恢复模式,日志记录很少。但是,在这些延迟尖峰期间,我们可以看到对数据库的大量选择和更新操作被阻止或等待。我确定正在发生的事情是某人或某项作业正在运行某些操作,从而导致该数据库日志和数据文件使用的RAID阵列上的磁盘使用率很高。问题正在得到证明,因为没有人愿意承认他们所做的事情正在杀死我们的网站。 我的问题是什么性能计数器或我可以记录什么内容,这将有助于表明SQL Server正在等待I / O,但不是因为它要求的异常多,而是因为磁盘正忙于响应sql server的请求像往常一样快吗?

3
动态定义维度范围
每当我决定构建一个多维数据集时,我都会遇到一个问题,但是我还没有找到克服它的方法。 问题是如何允许用户自动定义一系列事物,而无需在维度中对其进行硬编码。我将在一个示例中解释我的问题。 我有一个名为客户的表: 这是表中的数据: 我想以数据透视样式显示数据,并在如下所示的定义范围内将薪金和年龄分组: 我编写了此脚本并定义了范围: SELECT [CustId] ,[CustName] ,[Age] ,[Salary] ,[SalaryRange] = case when cast(salary as float) <= 500 then '0 - 500' when cast(salary as float) between 501 and 1000 then '501 - 1000' when cast(salary as float) between 1001 and 2000 then '1001 - 2000' when cast(salary …


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.