数据库管理员

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

3
具有“预览模式”的数据库存储过程
在我使用的数据库应用程序中,一个相当普遍的模式是需要为具有“预览模式”的报表或实用程序创建存储过程。当此类过程确实更新时,此参数指示应返回操作结果,但该过程实际上不应执行对数据库的更新。 一种实现方法是简单地if为参数编写一条语句,并具有两个完整的代码块。其中一个确实更新并返回数据,而另一个仅返回数据。但这是不希望的,因为代码重复并且相对较低的可信度,即预览数据实际上是对更新所发生情况的准确反映。 下面的示例尝试利用事务保存点和变量(与临时表相反,不受事务影响)与临时表相比,仅将单个代码块用作实时更新模式。 注意:不能选择事务回滚,因为此过程调用本身可能嵌套在事务中。这已在SQL Server 2012上进行了测试。 CREATE TABLE dbo.user_table (a int); GO CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] ( @preview char(1) = 'Y' ) AS CREATE TABLE #dataset_to_return (a int); BEGIN TRANSACTION; -- preview mode required infrastructure DECLARE @output_to_return TABLE (a int); SAVE TRANSACTION savepoint; -- do stuff here INSERT INTO dbo.user_table (a) …
15 sql-server  t-sql 

2
较新版本的SQL Server不稳定吗?
我们的数据库架构师告诉我们的客户,SQL Server 2014比2012年是一个糟糕的选择,因为它缺乏2012年所具有的性能和稳定性优势。我读过的所有内容都与此矛盾。 亚伦·伯特兰德(Aaron Bertrand)表示完全相反,我从MS那里阅读的所有白皮书也都同意-2014年得到了增强,解决了人们在2012年遇到的一些AG问题。 我错过了选择2014年而不是2012年的主要缺点吗?

3
为什么我的EXISTS查询执行索引扫描而不是索引查找?
我正在优化一些查询。 对于以下查询, SET STATISTICS IO ON; DECLARE @OrderStartDate DATETIME2 = '27 feb 2016'; DECLARE @OrderEndDate DATETIME2 = '28 feb 2016'; SELECT o.strBxOrderNo , o.sintOrderStatusID , o.sintOrderChannelID , o.sintOrderTypeID , o.sdtmOrdCreated , o.sintMarketID , o.strOrderKey , o.strOfferCode , o.strCurrencyCode , o.decBCShipFullPrice , o.decBCShipFinal , o.decBCShipTax , o.decBCTotalAmount , o.decWrittenTotalAmount , o.decBCWrittenTotalAmount …

3
事务日志备份是串行还是并行?
我们碰巧正在使用SQL Server 2012 Standard Edition。我也碰巧使用Ola Hallengren的脚本来提供简单,灵活的框架来进行备份和维护。 这个问题不是关于Ola的脚本,而是关于最佳实践。我意识到最终的答案是“这取决于您公司的要求”。但是,我试图就如何最好地满足我对公司要求的理解,征询社区的建议。 我希望每15分钟设置一次事务日志备份。这样,我们希望丢失的数据不会超过15分钟。我应该设置一项使用ALL_DATABASES的作业吗?还是为每个数据库设置一项工作并并行启动它们?我问,因为我有一种基于Ola脚本运行方式的感觉,即备份是以串行方式启动的。串行的缺点是每个连续的备份要等到另一个完成为止。这可能会增加备份之间的时间量(即,大于15分钟)。另外,我担心的是,一个备份失败会阻止其他备份的发生,我不希望这样。我希望其他人继续备份。 那么Ola的脚本是串行执行的,还是失败会停止连续的备份,这是真的吗? 每个数据库都有一份工作更好吗?或仅完成一项工作?我倾向于单独的工作,但是我希望了解SQL Server DBA通常会做什么。

1
用以证明或否定其他DBA需求的度量标准?
我们目前有2个DBA,一个是我,另一个是一个家伙,我们俩都觉得需要一个或两个以上的额外资源。我曾几次与我的直接经理就这个话题进行过交谈,但是很难把这个想法卖掉。最近,我们的经理与我们分享说,拿出我们希望或觉得我们需要做的事情的“软价值观”列表确实很棒,但是真正有用的是提出“硬价值观”,显示美元节省。 如果我们认为的需求是合法的,那么您能否首先帮助我理解,如果是这样,我们将如何提出这个“硬价值观”清单。我觉得我们可以提出我们为节省公司资金而需要做的事情,但这可能只是放在优先事项列表的首位,这给我们带来了更多压力。 为了让您更深入地了解我们的环境,以下是我们在为我们提供支持方面所看的东西。 生产服务器– 30多个 生产数据库– 200多个 SQL版本– 2008 / 2008R2 / 2012,现在调查2014年,以及当年下半年的2016年 应用程序(第三方和家庭用户)– 支持的20多个应用程序团队– 6个 虚拟化– 75%虚拟化的25%物理 群集– 3个以上计划的 复制– 1个分发服务器,2个订阅服务器,24个订阅,6个发布服务器,12个发布 日志传送– 8个主数据库+更多计划的,4个辅助数据库+更多计划的,49个日志交付数据库+更多计划的 可用性组–目前暂无,但正在探索可能性 导致版本更改或DBA资源的每年平均应用程序升级/安装– 2-3 修补程序(SP,CU)–目前不存在,除非出现问题累计数据库大小– 14TB + 报表服务器–一个由2个服务器组成的横向部署,我们两个都不熟悉SSRS Analysis Server –两个服务器,我们两个都不熟悉SSAS 我们应该使用什么度量标准来证明或拒绝其他DBA的需求? 我最初的目的是证明我们目前的能力与计划中的项目以及重复执行的任务,但是我们需要证明在雇用额外资源方面的投资回报率。

1
SQL Server 2014 COUNT(DISTINCT x)忽略列x的统计信息密度向量
对于COUNT(DISTINCT)具有约10亿个不同值的,我正在获得一个查询计划,该计划的哈希汇总估计只有300万行。 为什么会这样呢?SQL Server 2012提供了一个很好的估计,所以这是我应该在Connect上报告的SQL Server 2014中的错误吗? 查询和差评 -- Actual rows: 1,011,719,166 -- SQL 2012 estimated rows: 1,079,130,000 (106% of actual) -- SQL 2014 estimated rows: 2,980,240 (0.29% of actual) SELECT COUNT(DISTINCT factCol5) FROM BigFactTable OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE -- Stats for …

1
默认情况下资源池中没有足够的系统内存来运行此查询
我在Windows Server 2012上使用SQL Server 2014-12.0.2269.0(X64),遇到一些内存问题。当我运行一个存储过程进行相当“繁重”的计算时,大约10分钟后出现错误: 资源池“默认”中没有足够的系统内存来运行此查询。 我的SQL Server有多个数据库(例如15个,但并非总是同时使用它们)。我查看了SQL Server日志文件(出现错误后),并且看到了很多这样的行: 2015-12-17 12:00:37.57 spid19s由于资源池“默认”中的内存不足,不允许为数据库“ Database_Name”分配页面。有关更多信息,请参见“ http://go.microsoft.com/fwlink/?LinkId=330673 ”。 日志中会生成一个报告,其中包含每个组件使用的内存(我认为)。如果我正确地解释了报告,我们可以看到消耗了很多内存MEMORYCLERK_SQLBUFFERPOOL。您可以在这里找到报告:http : //pastebin.com/kgmk9dPH 我还生成了一个带有图形的报告,该图形显示了相同的“结论”: 这可能是另一个有用的报告: 请注意,我还在日志中看到此错误: 2015-12-17 12:04:52.37 spid70由于数据库内存压力而无法分配页面:FAIL_PAGE_ALLOCATION 8 以下是有关服务器内存的一些信息: 服务器上的总内存:16 Gb 分配给SQL Server的内存:12288 Mb 使用中的物理内存(来自sys.dm_os_process_memory):9287 Mb 如果有帮助,则该服务器不承载任何SharePoint数据库。

2
PostgreSQL递归后代深度
我需要根据祖先计算后代的深度。当记录具有时object_id = parent_id = ancestor_id,它将被视为根节点(祖先)。我一直在尝试使WITH RECURSIVE查询与PostgreSQL 9.4一起运行。 我不控制数据或列。数据和表架构来自外部来源。桌子在不断增长。目前每天约有3万条记录。树中的任何节点都可能丢失,并且它们有时会从外部源中拉出。通常按created_at DESC顺序提取它们,但是使用异步后台作业提取数据。 最初,我们有一个解决此问题的代码,但现在有5M +行,需要近30分钟才能完成。 表定义和测试数据示例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) …

2
DDL_admin和db_owner权限
我正在接管一个涉及删除和限制服务器场中所有数据库用户权限的项目。(娱乐时间) 当前受限制的权限之一是db_owner权限。 该权限将根据具体情况进行审查,但是一个常见的更改是将db_owner权限替换为以下内容: db_datareader db_datawriter db_ddladmin db_executor 我想定义两者之间的确切区别(以告知客户)。 但是,据我所知,两者之间的区别应该是: db_accessadmin权限 db_backupoperator权限 db_securityadmin权限 所以实际上他们还是会输: [ALTER ANY USER] [CREATE SCHEMA] [BACKUP DATABASE],[BACKUP LOG],[CHECKPOINT] [ALTER ANY APPLICATION ROLE],[ALTER ANY ROLE] [DROP DATABASE] 将db_owner替换为上述四个角色后,用户还有其他事情会松动吗? 这实际上在很大程度上是出于安全目的吗?

4
如何查询SSISDB找出软件包中的错误?
我已经看到了这个问题 SSIS 2012-如何在T-SQL中查询当前正在运行的程序包? 它给了我以下脚本: SELECT E.execution_id , E.folder_name , E.project_name , E.package_name , E.reference_id , E.reference_type , E.environment_folder_name , E.environment_name , E.project_lsn , E.executed_as_sid , E.executed_as_name , E.use32bitruntime , E.operation_type , E.created_time , E.object_type , E.object_id , E.status , E.start_time , E.end_time , E.caller_sid , E.caller_name , E.process_id , E.stopped_by_sid …

5
要将10-20个SQL Server数据库备份和还原到〜同步状态?
我需要备份10-20个大小在10-50 GB之间的SQL Server 2008 R2数据库,而这些数据库是联机的并且由单个企业应用程序同时使用。我还需要将它们恢复到在所有数据库之间都基本同步的状态(我可以承受数据库之间长达几秒钟的取消同步)。目的是为QA / DEV环境捕获生产数据。 我强烈希望不要要求数据库以完全恢复的方式运行,并且要提出一种备份方法,该方法专用于为QA环境捕获数据,并且保持独立于不受我控制的主要备份过程。 对于我的客户,将需要1-2个小时来捕获20个完整备份,每个备份约30 GB。这使得按顺序进行完整备份是不可接受的,因为在简单恢复中运行时,数据库将太不同步。 我在寻找比这些更好的主意: 理念1:VM磁盘的SAN级别快照。从快照xcopy MDF / LDF。 将复制的文件附加到其他服务器实例后,其恢复过程将生成一致的数据库,这些数据库几乎同时是快照。 谷歌搜索使我确信这不是一个好主意,至少因为我可能会与master / msdb / etc失去同步。 理念2:在所有数据库之间进行复杂的备份和同步还原 这要求我要求数据库在完全恢复中运行,而这是我所不希望的。在截止日期(T0)之前,为所有数据库开始并行备份。达到T0后,备份所有日志(最多需要几分钟)。进行大量的备份,然后尝试还原它们并向前/向后滚动日志,以获得相对于T0的数据库之间的某种一致性状态。 这需要大量的计划和脚本来可靠地使用它,因此我会竭尽全力避免它。 我是否还缺少其他解决方案? PS1:我很想能够使用数据库快照。这个想法是在每个数据库上启动一个快照(应该以秒为单位),然后在接下来的几分钟/小时内依次完全备份每个数据库。然后将它们全部还原到另一台服务器上,并将它们还原为快照。AFAIK这种情况是不可能的,因为快照无法与数据库一起备份。它们只能在创建它们的服务器上回滚到位。此外,他们需要企业版,但我并没有为所有客户提供。 PS2:如果您知道能够产生跨数据库同步备份的第三方解决方案,请提出。

2
添加联接提示时,为什么SQL Server行估计会更改?
我有一个查询,该查询连接了几个表并且执行得很差-行估计相差1000倍,并且选择了嵌套循环连接,从而导致了多个表扫描。查询的形状非常简单,看起来像这样: SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID 在处理查询时,我注意到当我提示它对一个连接使用合并连接时,它的运行速度快了很多倍。我能理解-合并联接是联接数据的更好选择,但是SQL Server选择嵌套循环时并不能正确估计它。 我不完全理解的是,为什么此联接提示会更改所有计划运营商的所有估计?通过阅读不同的文章和书籍,我假设基数估计是在构建计划之前执行的,因此使用提示不会改变估计,而是明确地告诉SQL Server使用特定的物理联接实现。 但是,我看到的是,合并提示使所有估计变得非常完美。为什么会发生这种情况,并且有任何通用的技术可以使查询优化器在没有提示的情况下做出更好的估计-考虑到统计数据显然可以做到这一点? UPD:可在此处找到匿名的执行计划:https ://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl =0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0 我使用TF 3604、9292和9204检查了两个查询使用的统计信息,它们是相同的。但是,查询之间扫描/查找的索引有所不同。 除此之外,我尝试使用来运行查询OPTION (FORCE ORDER)-它的运行速度比使用合并连接还要快,为每个连接选择HASH MATCH。

4
SQL Server最大内存,页面文件,最大并行度
希望您的DBA宇宙大师可以回答以下三个问题: 我知道设置SQL Server的最大内存是最佳实践。因此,如果具有44 GB RAM的服务器安装了SQL Server,则应将SQL Server最大内存设置为大约37GB。 但是,如果SQL Analysis Service和SQL Reporting Services与SQL Server安装在同一服务器上,我们应该设置什么?那么是否最好将SQL Server的最大内存设置为22GB RAM,以便Analysis可以占用其他22GB RAM? 在运行带有44 GB RAM的SQL Server的服务器上,设置页面文件大小的最佳实践是什么?我在Brent Ozar(http://www.brentozar.com/archive/2014/06/sql-server-setup-checklist-free-ebook-download/)上阅读了以下内容: SQL Server不需要巨型页面文件。如果要在服务器上安装其他应用程序(不建议这样做,则应隔离SQL Server)。您可能需要更大的页面文件。如果SQL Server是包装盒上运行的唯一主要服务,则通常在系统驱动器上创建2GB大小的页面文件。 微软表示,我们应该将页面文件系统设置为RAM的1.5倍,这与Remus的建议相符(请参见-> http://rusanu.com/2009/11/22/system-pagefile-size-on-machines-with -large-ram /)。 因此,在具有44GB RAM的服务器上,我们在SQL Analysis Service和SQL Reporting Services旁边安装了SQL Server。我们应将页面文件设置为什么大小? 对于SharePoint是SharePoint场的一部分的SQL Server以及SharePoint存储数据库的位置,应该将最大并行度设置为1。现在,我们拥有的服务器不属于SharePoint场的一部分(称为sql2)。服务器上安装了SQL Server,SQL Analysis and Reporting。SharePoint不会在其服务器上存储其数据库,但是我们确实创建了SharePoint读写的报告和分析数据库/多维数据集。 布伦特·奥扎尔(Brent Ozar)说: 经验法则:将此值设置为硬件上的单个NUMA节点(处理器)插槽中的物理内核数或更少 当该SQL Server实例具有4个VCPU时,应在该SQL Server实例上为最大并行度配置什么? 希望你们不仅给我,而且让更多的SQL管理员对最佳实践的了解比与Internet上的丛林有关。

2
空列可以成为主键的一部分吗?
我正在开发一个SQL Server 2012数据库,并且对一个一对零或一个关系存在疑问。 我有两个表,Codes和HelperCodes。一个代码可以具有零个或一个辅助代码。这是用于创建这两个表及其关系的sql脚本: CREATE TABLE [dbo].[Code] ( [Id] NVARCHAR(20) NOT NULL, [Level] TINYINT NOT NULL, [CommissioningFlag] TINYINT NOT NULL, [SentToRanger] BIT NOT NULL DEFAULT 0, [LastChange] NVARCHAR(50) NOT NULL, [UserName] NVARCHAR(50) NOT NULL, [Source] NVARCHAR(50) NOT NULL, [Reason] NVARCHAR(200) NULL, [HelperCodeId] NVARCHAR(20) NULL, CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED ( …

1
用户共享的查询:动态SQL与SQLCMD
我必须重构和记录许多foo.sql查询,这些查询将由数据库技术支持团队共享(针对客户配置等)。每个客户都有自己的服务器和数据库的票证类型经常出现,但其他方面的架构是相同的。 当前无法选择存储过程。我正在讨论是使用动态还是使用SQLCMD,因为我在SQL Server上有些新手,所以我也没有使用太多。 我觉得SQLCMD脚本对我来说绝对看起来更“干净”,并且更易于阅读和根据需要对查询进行较小的更改,但同时也迫使用户启用SQLCMD模式。由于使用字符串操作编写查询会导致语法高亮丢失,因此动态处理更加困难。 这些正在使用Management Studio 2012(SQL版本2008R2)进行编辑和运行。每种方法的优缺点是什么,或者一种方法或另一种方法的某些SQL Server“最佳实践”是什么?其中一个比另一个更“安全”吗? 动态示例: declare @ServerName varchar(50) = 'REDACTED'; declare @DatabaseName varchar(50) = 'REDACTED'; declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594'; declare @sql_OrderCheckQuery varchar(max) = (' use {@DatabaseName}; select -- stuff from {@ServerName}.{@DatabaseName}.[dbo].[client_orders] as "Order" inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders] as "VendOrder" on "Order".o_id = "VendOrder".vco_oid where …

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.