Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
MS SQL Server累积更新-最佳做法
我试图了解SQL Server累积更新推荐的最佳做法。 目前,我们秉承“除非CU解决的问题是我们遇到的问题,否则请不要做”的想法。这可以通过“如果还没有解决,就不要解决”的方法来实现,但是我想知道这是否真的是一个好主意,因为许多CU都具有性能增强功能。我们正在考虑将CU添加到CU发布后一两个月的定期维护周期中所应用的补丁中。 别人做什么,为什么? 作为影响以下答案的问题的更新,Microsoft的SQL Server团队于2016年3月24日宣布,他们正在更新其服务模型。Microsoft建议所有用户安装2016年1月之后发布的所有CU: 从CU的1月发行版开始,这些警告消息已更新,我们现在建议对CU进行持续,主动的安装。您应该计划以与计划安装SP(Service Pack)发布时相同的置信度来安装CU。这是因为CU已通过SP级别的认证和测试。此外,Microsoft CSS数据表明,以前通常在已发布的CU中解决了很大比例的客户问题,但并未主动应用。更重要的是,CU包含除修补程序之外的附加值。这些还可能包含可支持性,日志记录和可靠性更新,以增强整体体验。 除了消息和指导更新之外,我们还对CU采集模型进行了更新。 购置变更: 当然,传统上,CU通常在“ Hotfix”服务器上可用(伴随着与“ QFE”或“ Hotfix”相关联的“警告语言”)。这里的矛盾之处在于,CU不再是真正简单的快速修补程序。所包含的更新已在当今的单个以及整个系统集成级别进行了良好的测试。 因此,我们现在在microsoft.com/downloads上按照主流支持的基准(今天是2012 SP2 / SP3和2014 RTM / SP1)放置最新的CU,就像今天对Service Pack所做的那样 此外,我们很快将所有CU释放并维护到Windows Update目录中,以方便获取和分发 仅临时CU“按需”修复程序将放置在向前移动的修复程序服务器上 为了减少摩擦,从microsoft.com/downloads下载CU不需要提供/接收电子邮件和URL 我们也正在评估提供最新的CU作为Microsoft Update上的可选更新,就像今天的Service Packs一样。
11 sql-server 

1
IDENTITY_INSERT如何影响并发性?
我正在尝试使用第三方第三方SAP附加组件来帮助客户,该附加组件存在发布故障并且已不再支持。 在某些情况下,它将存档和不完整的帖子从发布队列表存档到发布存档表。我需要将这些存档结果移回队列。 队列ID是一个标识列,我希望保持不变。 问题是,如果我关闭了identity_insert on / insert / identity_insert,那么与创建队列条目并期望identity列自动生成的进程的并发性有什么期望? 任何最好的方式来演示这种行为的指针也将不胜感激。


1
使用触发器进行同步
我的要求与之前的讨论类似: 编写一个简单的银行架构:如何使我的余额与他们的交易记录保持同步? 结合交易触发 我有两个表,[Account].[Balance]和[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); 当对该[Transaction]表进行插入,更新或删除时,[Account].[Balance]应基于进行更新[Amount]。 目前,我有一个触发器可以完成此任务: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR EXISTS (select 1 …

3
SELECT和GROUP BY子句中的SQL计算字段
通常在查询我的MS SQL Server数据库时,我需要创建一个计算字段,例如 (CASE WHEN A.type = 'Workover' THEN 'Workover' ELSE (CASE WHEN substring(C.category, 2, 1) = 'D' THEN 'Drilling' WHEN substring(C.category, 2, 1) = 'C' THEN 'Completion' WHEN substring(C.category, 2, 1) = 'W' THEN 'Workover' ELSE 'Other' END) END) 然后我需要按此计算字段(除其他外)对结果分组。因此,我在SELECT和GROUP BY子句中都进行了相同的计算。SQL Server是实际上执行两次这些计算,还是仅执行一次就足够聪明?
11 sql-server 

4
SQL Server上的CPU使用率高-查询速度慢
这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 6年前关闭。 我们的MS SQL Server使用了大约95%的CPU能力。 重新启动服务器(硬件)或重新启动SQL-Service后,使用率为0%,并且在1-3天的过程中缓慢增加。取决于使用了多少。 当超过80%时,每个查询都会非常慢。 我们的网站正在处理大量重大查询,因此其中一些需要45-60秒。重新启动后(CPU使用率低于80%),相同的查询需要11到20秒的时间。 我怎样才能解决这个问题?我已经在线阅读了亲和力掩码可以调整CPU使用率的信息,但亲和力设置已禁用。我不能改变他们。这是因为我只有1个处理器吗? 与查询本身有关的技巧很多,但我们的网站和服务相当庞大,而且变化太多。 它们中的大多数已经非常优化。 即使只花了2秒钟,我也无法继续重启SQL服务,因为我们有一个警报服务,允许人们拨入并记录一条消息,然后将呼叫选定的组并听到记录的消息。 数百个Search and Rescue团队都使用此系统,如果SQL-Service在警报期间重新启动,它将终止,并且不会通知调用它的人员。 我搜索了整个地方,但是除了“亲和力面具”以外,什么都找不到,我无法更改。 必须有一种在不终止当前查询的情况下清除CPU缓存的方法...对吗? SQL: Microsoft SQL Server 11.0.2100.60 OS: Windows Server 2012 x64 Processor: 2.30 GHz RAM: 4.00 GB

3
新服务器上的性能更差
我们一直在使用专用服务器(单四核,6 GB RAM),并且正在迁移到新的专用服务器(2x六核,32 GB RAM)。两者都是Windows Server 2008,SQL Server2008。新服务器的性能比旧的慢服务器稍差。 在测试中,我们的ASP.NET应用程序的运行速度降低了10%-20%。使用STATISTICS IO和STATISTICS TIME运行单个昂贵的查询将显示在新服务器上的运行时间增加了10-20%。SQL查询配置文件在昂贵的查询中显示较高的CPU使用率。 新服务器上的任务管理器显示sqlserver.exe正在消耗22 GB的RAM,但CPU值始终保持很低。 我已经更新了所有统计信息,重建或重新组织了索引等。鉴于我已完成的测试量,执行计划此时应存储在新服务器上。如果有任何缺失的索引(我认为没有),它们会同等地影响新旧服务器。新的具有与旧的相同数据的还原备份。 我曾希望新服务器上的性能会更好,但是负载更值得关注。如果旧服务器即使在负载下也表现更好,那么当新的,性能稍差的服务器必须承担该负载时会发生什么? 我还能在这里错过什么? 编辑:MAXDOP设置为6。 旧服务器在相同的物理驱动器(RAID 10)上具有操作系统,数据库和tempdb。总共4个15k 3 Gb / s 3.5英寸SAS。新服务器具有三个驱动器集:RAID 1上的OS,RAID 10上的数据库,RAID 5上的tempdb。总共9个15K 6 Gb / s 2.5英寸SAS。 旧服务器具有1 x Intel Xeon E5620 2.40 GHz四核8线程(w H / T)。新服务器具有2个Intel Xeon E5-2640 2.5 GHz六核12线程(w H / T)。 编辑2:这是最终分析: …

2
为什么禁用聚集索引会使表不可访问?
禁用索引后,定义保留在系统目录中,但不再使用。SQL Server不维护索引(当表中的数据更改时),并且该索引不能用于满足查询。如果禁用了聚集索引,则整个表将无法访问。 为什么不能直接从丢弃B树的表中访问数据?(最有可能通过逐行扫描表)是否比使数据完全不可访问更合适? 这是一个纯粹的理论问题-我绝对不会这样做。这不是一个场景,也不是一个要做的事情,我只是想知道事情为什么这样发展,将其视为内部问题。

2
LATCH_EX等待资源METADATA_SEQUENCE_GENERATOR
我们有一个生成库存报告的过程。在客户端,该过程拆分可配置数量的工作线程,以为报告构建大量数据,这些数据对应于许多商店(可能是数千个,通常是几十个)中的一个商店。每个工作线程都调用一个执行存储过程的Web服务。 用于处理每个块的数据库过程将一堆数据收集到#Temporary表中。在每个处理块的末尾,数据将被写入tempdb中的永久表。最后,在该过程结束时,客户端上的一个线程从永久tempdb表中请求所有数据。 运行此报告的用户越多,获取速度就越慢。我分析了数据库中的活动。在某一时刻,我看到35个单独的请求在流程的某一时刻全部被阻塞。所有这些SPID LATCH_EX在资源上的类型等待时间约为50 ms METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)。一个SPID拥有此资源,而其他所有SPID都被阻止。我没有在网络搜索中找到有关此等待资源的任何信息。 我们正在使用的tempdb中的表确实有一IDENTITY(1,1)列。这些SPID是否正在等待IDENTITY列?我们可以使用什么方法来减少或消除阻塞? 该服务器是集群的一部分。该服务器在64位Windows 2008 R2 Enterprise上运行64位SQL Server 2012 Standard Edition SP1。该服务器具有64 GB RAM和48个处理器,但是该数据库是标准版本,因此只能使用16个。 (请注意,我对在tempdb中使用永久表来保存所有这些数据的设计并不感到兴奋。对此进行更改将是一个有趣的技术和政治挑战,但我愿意接受建议。) 更新4/23/2013 我们已经与Microsoft开立了支持案例。随着我们了解更多信息,我将不断更新此问题。 更新5/10/2013 SQL Server支持工程师同意等待是由IDENTITY列引起的。删除IDENTITY消除了等待。我们无法在SQL 2008 R2上重复该问题;它仅发生在SQL 2012上。

2
架构更改会“破坏”可用性组,还是透明处理?
我的组织计划采用SQL Server 2012可用性组,并且我试图了解它将对我们的应用程序升级过程产生什么影响(如果有)。 我们每8周发布一次应用程序更新,任何发布都可能包含架构更改和/或数据迁移。 我想了解的是HA / DR解决方案是否透明地处理架构更改(新列,索引添加到第二级),还是在每个实例上创建架构然后重新打开Always On所需的手动干预。 我假设的数据迁移部分是透明处理的,但也想确认一下。 我想我也在做出一个笼统的假设,即基于可用性组配置的这些行为也没有差异,这可能也是错误的。请告诉我。 简而言之; 在我的应用程序的任何给定发行版中,我都可以通过向表中添加列来更改非常大的表(10s至1亿亿条记录)。一些列可能是“ net new”的,因此它们可以利用企业在线模式更改功能。其他列可能是对现有列的重构(FullName被拆分为FirstName和LastName),并且将对表中的每一行运行迁移以填充这些字段。这些行为是否需要DBA更改AlwaysOn配置,或者默认情况下会进行处理,并且所有辅助节点都“免费”获得DDL和DML语句? 感谢您的澄清。

3
将日期存储为整数(数字)有什么好处
问题1 我正在使用将日期存储为整数(实际数字(8,0))的系统,并且我注意到其他系统也在此线程中将日期存储为int,例如cisco。例 20120101 -- 01 Jan 2012 保留数字日期系统而不使用SQL Datetime有什么好处? 问题2 现在,我试图遍历数字日期以在两个日期之间找到客户。如果start和enddate包含两个月,我将获得数千条记录,而不仅仅是60条。示例: create table #temp1(day int,capacity int) /* just a temp table */ declare @start int declare @end int set @start=20111201 set @end = 20120131 while (@start <= @end) Begin insert into #temp1 /* I am storing things in #temp table …

2
接收到“对对象的SELECT权限被拒绝”,即使已被授予
我是程序员,而不是dba。。。我知道足够危险了。 我继承了一个旧用户,该旧用户是该数据库的db_owner。出于业务原因,我们无法调整该用户对现有表,模式等的权限,但是正在创建一些新表,我只希望该用户对其具有SELECT访问权限。 已为这些用户设置了这些表的权限,以便除SELECT(设置为GRANT)以外的所有内容都被拒绝。 但是,当此用户(dbadmin)尝试对这些表之一(AccountingAudit)执行SELECT时,会发生此错误: The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. 我已经运行此SQL来尝试查看为此表/用户设置了哪些权限: select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) as grantor, permission_name, state_desc from sys.database_permissions 这就是我得到的: AccountingAudit dbadmin dbo ALTER DENY AccountingAudit dbadmin dbo CONTROL DENY AccountingAudit dbadmin dbo DELETE DENY AccountingAudit dbadmin …

3
为什么.bak比要备份的数据库小得多?
我只是备份了SQL Server数据库。MDF和LDF文件总共约29 GB,但是.bak文件只有23 GB,约小20%。 我的第一个猜测是,数据压缩的一个版本小于包含相同数据的另一个版本时,将是数据压缩,但是压缩通常会产生比20%更好的压缩率,尤其是对于高序数据(例如数据库表)而言。 )而且,压缩后的数据不能轻易地进一步压缩,但是我知道.bak文件可以被压缩。 因此,如果数据没有被压缩,并且没有任何东西被丢弃,(因为进行备份的全部目的是以后能够将其恢复到相同的状态),那么那20%的原因是什么呢?

3
SQL Server:仅用于系统表的文件组?
我们的公司标准之一是为用户表/索引提供单独的文件组/文件。这被设置为默认值,因此不需要限定CREATE TABLE语句。 所以看起来像这样 fileid 1 =系统表,MDF fileid 2 = t-log = LDF fileid 3 =用户资料= NDF 在座的任何人都可以帮助我理解为什么要这样做的原始理由吗? 我会干净的说我是伏都教徒。上午我错了......? 编辑:我知道如何使用文件组来分离索引/分区/档案,以及如何恢复零碎的文件。这个问题是关于在同一卷上仅对系统表使用单独的文件组。

2
防止SSMS查看服务器的文件系统
我有几个用户在我的管理下共享MS SQL Server 2017。他们不应该看到(甚至不知道)该服务器上的其他用户及其数据。每个用户都有自己的数据库。他们可以使用他们的数据库做任何想要的事情。 我正在使用SQL Server的Partial Containment功能将用户锁定在适当的位置。登录名是在数据库内部创建的。这样效果很好,因为他们看不到其他用户帐户或数据库。将数据库登录名添加到我使用以下命令创建的数据库角色中: USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole 我刚刚创建了一个数据库登录帐户,仅将其添加到上述角色。用户没有其他权限(据我所知)。 剩下的唯一问题是SSMS仍然能够浏览服务器的文件系统。如果我右键单击数据库并选择Tasks -> Restore -> Database,然后选择Device: -> [...]并添加文件。这使SSMS可以浏览服务器的文件系统,我想否认这一点。用户实际上不能还原数据库,但可以浏览文件系统。 这里的问题表明SSMS正在使用存储过程xp_fixeddrives,xp_dirtree并且xp_fileexist。但是,这些存储过程在具有所述组许可的用户身份执行时返回空结果。我已经读到,这是用户不是sysadmin角色成员时的行为。这已经使我有些困惑,因为我明确拒绝了执行该命令,但是用户仍然可以执行存储过程。但是,当通过SSMS浏览文件系统时,它不是空的。 SSMS从哪里获取文件系统信息,如何防止这种情况发生? 编辑:我也刚刚注意到,SSMS能够检索所有数据库在服务器上存在的所有数据库备份的列表。再说一次,我不知道它如何获得这些信息以及如何防止它。

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.