数据库管理员

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

5
提高sys.dm_db_index_physical_stats的性能
在维护工作期间,我正在尝试获取碎片索引的列表。但是查询非常慢,需要30多分钟才能执行。我认为这是由于对sys.dm_db_index_physical_stats进行的远程扫描。 有什么方法可以加快以下查询的速度: SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, i.name AS TableIndexName FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') phystat INNER JOIN sys.indexes i ON i.OBJECT_ID = phystat.OBJECT_ID AND i.index_id = phystat.index_id WHERE phystat.avg_fragmentation_in_percent > 20 AND OBJECT_NAME(i.OBJECT_ID) IS NOT NULL ORDER BY phystat.avg_fragmentation_in_percent DESC 我不是DBA,可能在上面的查询中犯了一个明显的错误,或者也许有些索引或统计信息会有所帮助?也许只是数据库的大小(大约20Gb,大约140个表)。 我问的原因是,我们在夜间只有一个很小的维护窗口,这在大多数时候都占用了。

7
什么是“数据库”?
这个问题有很多讨论:大型搜索引擎使用哪些数据库技术? 太多的讨论使我感到困惑。那么...什么是数据库?关系数据库只是“数据库”吗?面向对象的数据库是“数据库”吗?有没有能让我存储和检索信息(例如地图,列表等)的数据库的系统? 还是数据库必须存储/检索信息,并且还具有某些管理功能(如用户和特权)?dBase III是否加上数据库,因为它并不是真正的关系数据库?

2
如何释放磁盘空间?哪些日志/目录要清除?
我想释放Linux机器上的磁盘空间。我仔细研究了空间使用情况,发现以下目录的大小很大 /u01/app/11.2.0/grid/cv/log /u01/app/11.2.0/grid/log/diag/tnslsnr/r1n1/listener_scan2/alert (Contains xml files) /u01/app/11.2.0/grid/rdbms/audit(Contains .aud files) /home/oracle/oradiag_oracle/diag/clients/user_oracle/host_XXXXXXXXXX/alert(Contains xml files) /u01/app/oracle/diag/rdbms/crimesys/crimesys1/alert (Contains xml files) 我可以从这些目录中删除内容吗?注意:我的意思是内容而不是目录。

2
如何为域帐户创建Sql Server登录名?
所有, 我在域(比如说AD)的服务器(比如说Server1)上安装了Sql Server 2008 。我也有一个名为AD \ Sql1的域帐户。这不是域(AD)上的管理员帐户,但我希望它成为Server1上的管理员帐户。然后在Sql Server上为该域帐户(而不是本地帐户)创建一个登录名。 我怎么做? 问题: 用户AD \ Sql1,我希望他作为Server1上的管理员。为此,我是否只创建了一个具有相同用户名的本地帐户(例如,Server1 \ Sql1),然后将该本地帐户设置为计算机上的管理员。该本地帐户会自动映射到同名的域帐户吗?也许我应该在这里添加CREATE LOGIN [AD\Sql1] FROM WINDOWS对我不起作用的内容。我尝试并出现错误提示user does not exist in Windows(类似这样的内容) 现在,如果上述技术可行。让我们假设,AD \ SQL1,成为上的管理员Sever1。因此,从理论上讲,我不需要在Sql Server上为该Windows域帐户创建Sql Login,对吗?属于BUILTIT \ Admins的所有本地管理员都会自动具有对Sql Server的sysadmin访问权限,对吗? 我哪里做错了?请分享所有可以更好地解释此概念的URL。 编辑:我还应该补充一点,问题1和2独立重要。我知道如何将域/ Windows帐户添加为sysadmin。但是我对域和本地帐户之间的映射如何工作很感兴趣。我的目标不是要以sysadmin身份添加本地帐户,我可以很快地做到这一点。我的意图不是无礼,而是要尽可能明确。如果我的问题仍然不清楚,请告诉我,以便我添加更多详细信息。 谢谢, _UB 编辑:语法

4
SQL Server 2012向后兼容2008年备份
我有许多使用SQL Server 2008的客户端,这也是我在服务器上所拥有的。我使用备份文件在客户端之间以及在我的办公室之间来回发送数据库。 我已经读到,当您从SQL Server 2012创建备份时,无法将其还原到2008实例上。我认为兼容性级别可以解决此问题,但事实并非如此。因此,我对如何升级一无所知。除了一次升级所有我的客户(这是不可能的)之外,我可以想到没有干净的方法可以做到这一点。 我需要将数据库发送到客户端以及从客户端接收数据库。这是我在SQL Server上的第一个版本升级,因此我是这个问题的新手。关于如何进行的任何想法?
14 sql-server 

2
为什么查询在存储过程中比在查询窗口中运行慢?
我有一个复杂的查询,它在查询窗口中运行2秒钟,但作为存储过程大约5分钟。为什么以存储过程的形式运行需要花费更长的时间? 这是我的查询的样子。 它采用一组特定的记录(由@id和标识@createdDate)和特定的时间范围(从开始的1年@startDate),并返回已发送信件的摘要列表以及由于这些信件而产生的估计付款。 CREATE PROCEDURE MyStoredProcedure @id int, @createdDate varchar(20), @startDate varchar(20) AS SET NOCOUNT ON -- Get the number of records * .7 -- Only want to return records containing letters that were sent on 70% or more of the records DECLARE @limit int SET @limit = IsNull((SELECT Count(*) …

4
将多行中的列合并为单行
customer_comments由于数据库设计的缘故,我将某些内容分成了多行,而对于一份报告,我需要将comments每个唯一字段组合id成一行。我以前尝试过使用SELECT子句和COALESCE技巧在此定界列表中进行操作,但是我无法记住它并且一定不能保存它。在这种情况下,我似乎也无法使其工作,只能在单行上工作。 数据如下所示: id row_num customer_code comments ----------------------------------- 1 1 Dilbert Hard 1 2 Dilbert Worker 2 1 Wally Lazy 我的结果需要看起来像这样: id customer_code comments ------------------------------ 1 Dilbert Hard Worker 2 Wally Lazy 因此,每个row_num结果实际上只有一行结果;评论应按的顺序组合row_num。上面的链接SELECT技巧可以使特定查询的所有值作为一行获得,但是我无法弄清楚如何使其作为SELECT将所有这些行吐出来的语句的一部分来工作。 我的查询必须自己遍历整个表并输出这些行。我没有将它们组合成多列,每行一列,因此PIVOT似乎不适用。

3
如何在SQL Server上配置SSD驱动器的RAID阵列?
我正在构建一个具有48 GB RAM,1个CPU和8个SATA III(6GB / s)SSD驱动器(128 GB Crucial m4)和LSI MegaRAID控制器(SAS 9265-8i)的SQL Server。我希望典型的工作量主要来自阅读。会有一段时间的写入活动增加(与第三方数据提供者每小时进行一次数据同步-每晚备份),但是我怀疑典型的读写比率约为90%读取/ 10%写入。 选项1: 逻辑驱动器C:-RAID 1(2个物理驱动器)-OS 逻辑驱动器D:-RAID 10(6个物理驱动器)-DB文件/日志/ tempdb /备份? 要么 选项2: 逻辑驱动器C:-RAID 1(2个物理驱动器)-OS 逻辑驱动器D:-RAID 1(2个物理驱动器)-Db文件 逻辑驱动器E:-RAID 1(2个物理驱动器)-日志文件/备份? 逻辑驱动器F:-RAID 1(2个物理驱动器)-tempdb 要么 选项3: 其他建议? 我认为选项1会给我带来更好的性能,因为所有数据库活动都将在3个驱动器上进行条带化(并在阵列中的其他3个驱动器上进行镜像),尽管选项2似乎模仿了传统的观点(这似乎更适用于机械驱动器而不是SSD)。似乎选项1的堆栈溢出已消失。 我猜固态硬盘可以将所有东西都放在一个逻辑驱动器上,因为此时服务器可能受到更多CPU约束,而不是受I / O约束? 我还有一个问题是每晚备份应该放在哪里?我们不希望备份减慢SQL Server的其余部分的速度,并且我猜测将备份与日志写入相同的位置是一个好习惯,因为在这两种情况下,读/写行为都是顺序写入。

2
从传感器阵列存储大量数据
我受命实施一个解决方案(应用程序和数据库),以存储来自巨大传感器阵列的数据样本。该阵列目前由大约20,000个传感器组成,但是很快就会增长到多达100,000个传感器。每个传感器每10秒发送一次数据样本,每个样本的大小为28个字节。 这样求和会导致: 每个传感器每天8640个样本 每个传感器每天242kB的数据 每天8.64亿个样本 现在,我一直在想最好的方法是存储/检索数据?在指定了软件之后,我“加入”了这个项目,因此需要使用SQL Server在Windows平台上实现它。 我目前的解决方案是创建一个具有两个表的数据库来存储数据样本。第一个用作第二个的索引,第二个以每个传感器每天的基础将整理后的样本存储在二进制字段中: Table 1: RecordID - BigInt - Identity SensorID - BigInt - Primary Key Date - DateTime - Primary Key (yyyy-mm-dd) Table 2: RecordID - BigInt - Primary Key (from an insert into Table 1) Data - Binary 基本上,我会将所有传感器的样本写入临时文件(每个传感器1个)。每天结束时,我将在表1中创建一个条目,使用生成的RecordID并将文件转储到表2的“数据”字段中。 这样,我最终每天只向该表添加100,000个条目,而不是8.64亿个条目。数据应该在LAN或高速WAN上可用,因此可以全天检索传感器数据。 尽管必须存储所有数据,但大多数数据可能永远不会被读取。因此,在表上读取的数量将不会比写入的数量多得多。 我知道我可以通过仅存储数据文件的路径来使用文件系统来实现某些功能,但是我读到SQL Server的性能优于NTFS,而您的二进制字段则少了256kB。(在256kB和1MB之间存在一个灰色区域,而对于二进制大小> …

1
如何为小型Web团队设置本地数据库开发过程?
背景 我正在为一个由约4位程序员和4位设计师组成的小型Web团队创建一个新的开发过程,并有望在未来发展该团队。我们的产品是一个中央应用程序,可为我们设计和托管的客户网站提供支持。 以前,我们都通过FTP在开发服务器上使用单个开发数据库进行工作。有效” *了一段时间,但我们正在进入一个新的发展方向,所以它是成熟的时间我们的进程。 我们使用Percona Server 5.5,但这应该是数据库不可知的,其思想是保持低成本。 目标: 我正在考虑为数据库开发创建一个持续集成(CI)流程,请注意以下几点: 开发人员拥有本地数据副本以针对其运行开发代码 能够将数据库结构回滚到以前的变更集 能够将新功能架构更改与架构设计修订更改分开 能够在本地修改数据库结构以进行测试 初始概念 我已经在下面使用SVN和LiquiBase勾勒出了一个过程,尽管它完全删除了#4。 从主干创建一个“开发”分支 中央“开发”数据库服务器从“开发”分支运行 本地开发人员被设置为开发分支的奴隶(#1上面提供) liquibase变更集定期提交给开发分支,该分支执行提交后挂钩以更新中央开发数据库(它将滴流到作为该开发服务器的从属服务器运行的本地计算机)(liquibase #2上面提供了) 当功能或模式修订准备好进行质量检查时,DBA(我)将把适当的更改从开发分支合并到主干中。此操作将创建一个SQL脚本以应用于暂存数据库服务器。 登台服务器应反映TRUNK,该结构应与Production具有相同的结构,以及质量检查中的更改 在登台服务器上执行sql脚本后,请对更改进行一些质量检查。 如果一切看起来不错,请标记结构。这将生成.sql脚本,以供DBA在生产环境中手动运行(如果需要,请在非高峰时间运行) 此过程要求所有开发人员都在同一个“开发”分支下运行,这意味着在任何给定时间仅存在一个数据库模式版本(不确定我是否需要此版本)。 这也意味着对模式的任何更改都无法在本地进行测试,如果操作不当,可能会影响其他开发人员。在我们的环境中,开发人员可能会添加新表,但很少修改现有结构。作为DBA,设计修复工作由我完成。但是无法在本地测试修复程序是我最大的困扰。 如何调整上述过程以允许本地开发,同时仍保持数据的相对最新副本(如我建议的过程中的复制所提供的那样)?我不需要直到上周的最新数据。 * “有效”是指足够,但是PITA。

3
SQL Server CLR中的第三方dll
我需要在SQL Server CLR的触发器c#代码中使用第三方DLL 但是,当我尝试添加引用时,它仅显示了SQL Server中的一些DLL。 如何将第三方dll添加到SQL Server?
14 sql-server  c#  sql-clr 

5
PL / SQL:计算数组中元素的最佳方法?
鉴于这种: DECLARE TYPE T_ARRAY IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; MY_ARRAY T_ARRAY; V_COUNT INTEGER; 我想要做: BEGIN -- ... some code filling the MY_ARRAY array -- obviously COUNT_ELEMENTS() does not exists, this is what I'm looking for :-) V_COUNT := COUNT_ELEMENTS(MY_ARRAY); DBMS_OUTPUT.PUT_LINE('My array containts ' || V_COUNT || ' elements.'); …
14 oracle  plsql 

6
在MySQL中拆分表。好的做法?
我已经开始研究一个现有项目,并且以前的开发人员已将一个表拆分为10个具有相同模式但数据不同的单独表。 这些表如下所示: [tableName_0] [tableName_1] [tableName_2] [tableName_3] [tableName_4] [tableName_5] [tableName_6] [tableName_7] [tableName_8] [tableName_9] 主键是一个整数id字段。该应用程序使用哈希算法(idmod 10)来知道在查找时要访问哪个表。例如id= 10将导致[tableName_0]。 这些表加起来可能有100,000行,并且增长率相对较低。 因此,我的问题是,这是否是可行的解决方案,或者即使在任何情况下都是好的做法。我的理论是推动将它们组合在一起,因为这样会使事情变得更容易,直到UNIONs等。主要缺点是更改所有应用程序代码以及从长远来看是否值得。

1
PostgreSQL故障转移和复制
我正在评估PostgreSQL 9.1,并且有几个与故障转移和复制详细信息有关的问题。 我有几个测试方案。第一个具有主服务器和少量从属服务器的服务器。万一Master崩溃了,我希望其中一个Slave成为Master。主服务器恢复到正常状态后,它应与群集中的其他服务器同步(应用关闭状态下所做的所有更改),并退回主服务器角色或成为从服务器。 我在PostgreSQL和当前场景中看到的问题如下。 1)我没有看到用于检测主服务器故障的内置工具。我读到pgpool可以处理它并创建触发文件,我还读到人们为此使用Linux心跳或类似工具。好的,我可以检测故障转移并在群集中分配一个新的主服务器。其他的奴隶们会明白有一个新的主人,他们现在应该备份吗? 2)我不了解故障回复程序。主从主机配置不同。那么崩溃的Master故障回复后,我将拥有两个Master吗?服务器将如何恢复同步?我只看到手动解决方案,例如“将数据文件夹传输到服务器并重新启动它”。那么什么是解决方案或最佳实践,或者至少是关键原则? 3)我应该如何处理客户端的服务器中断?创建连接时,我明确指定服务器IP。我是否应该开发某种会知道我的主从结构的ConnectionManager,仅将请求发送到主服务器,并且在连接断开的情况下将切换到备用服务器等?我读到pgpool可以成为应用程序的入口点,并以正确的方式管理连接。pgpool是这里唯一的解决方案吗?它能否很好地处理故障转移和故障回复? 4)是否有解决方案(也有商业解决方案),所以我可以避免手动复制数据,重新配置PostgreSQL实例和其他应由人工完成的工作?当每个人都同步时,这样的集群配置就很清楚,谁是主服务器,一切都会自动切换而无需操作员注意? 根据这些主题和文章 在PostgreSQL上进行流式复制和故障转移 PostgreSQL 9.1中的自动故障转移 http://denishjpatel.blogspot.com/2010/11/possibility-of-graceful-switchover.html 没有单一的全自动解决方案可以解决这些问题。我对吗? 谢谢!


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.