Questions tagged «sql-server»

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


4
更改查询以改善操作员估计
我有一个可以在可接受的时间内运行的查询,但我想从中获得最大的性能。 我要改进的操作是计划的右侧节点17处的“索引搜索”。 我已经添加了适当的索引,但是对于该操作,我得到的估计值是它们应有的一半。 我一直在寻找更改索引,添加临时表并重新编写查询的方法,但是为了获得正确的估算值,我无法对其进行简化。 有人对我可以尝试的方法有任何建议吗? 完整计划及其详细信息可以在这里找到。 可以在此处找到非匿名计划。 更新: 我觉得问题的最初版本引起了很多混乱,因此我将在原始代码中添加一些解释。 create procedure [dbo].[someProcedure] @asType int, @customAttrValIds idlist readonly as begin set nocount on; declare @dist_ca_id int; select * into #temp from @customAttrValIds where id is not null; select @dist_ca_id = count(distinct CustomAttrID) from CustomAttributeValues c inner join #temp a on c.Id …


2
堆压缩
以下是Microsoft Docs的一段: 在DML操作中分配给堆中的新页面在重建堆之前不会使用PAGE压缩。通过删除和重新应用压缩,或通过创建和删除聚簇索引来重建堆。 我不知道为什么会这样。如果我的堆具有指定的压缩设置,为什么不将其应用于属于该表的页面? 谢谢

2
如何在不到一秒钟的时间内跟踪发生的阻塞-SQL Server
我正在尝试解决不到一秒钟的阻塞问题。OLTP应用程序非常敏感,根据约定的SLA,某些事务的响应时间必须小于200ms。我们在新代码发行版中遇到了一些锁升级问题,可以通过减少更新中的批处理大小来解决这些问题。即使批处理量很小,我们也怀疑新sp阻塞了OLTP事务更新的同一行。 我需要找到被阻塞的会话及其等待的资源。根据我的理解,“阻塞的过程阈值”可以设置为至少1秒,因此这不会捕获阻塞。 我正在试验wait_info和wait_completed x事件。 还有其他方法可以跟踪此问题。谢谢

2
使用SqlCommand.Prepare()有什么意义和好处?
我遇到了开发人员代码,其中在执行SQL查询之前广泛使用了SqlCommand.Prepare()(请参见MSDN)方法。我想知道这样做的好处是什么? 样品: command.Prepare(); command.ExecuteNonQuery(); //... command.Parameters[0].Value = 20; command.ExecuteNonQuery(); 我玩了一些,并进行了追踪。调用Prepare()方法后,Command的执行使Sql Server执行以下语句: declare @p1 int set @p1=1 exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20' select @p1 之后,当获取参数的值并SqlCommand.ExecuteNonQuery()调用该参数时,将在Sql-Server上执行以下操作: exec sp_execute 1,@id=20 对我来说,这看起来像该语句在Prepare()执行后立即得到了编译。我想知道这样做有什么好处?这是否意味着将其放入计划缓存中,并且可以在使用所需参数值执行最终查询后立即重新使用它? 我发现(并记录在另一个问题中)用SqlParameters执行的SqlCommands总是包装在sp_executesql过程调用中。这使Sql Server能够独立于参数值存储和重用计划。 关于这一点,我想知道该prepare()方法是无用的还是过时的,或者我是否在这里遗漏了什么?

1
TempDB争用
我们在SQL Server 2014 SP1上有一个活动的OLTP 40GB数据库。发现查询随着IO_Completion等待而变慢,磁盘队列长度增加到900,并且SQL Server停止响应。我们尝试了什么: 重新启动实例,并在一分钟后开始以相同的方式运行。 第二次重新启动后,我们更改了每个tempdb数据文件的初始大小(创建了16个数据文件),它开始正常工作。 注意:我们将表变量用于中间结果集。这些结果集很小。 一个月内发生了两次。每次我手动向数据文件添加一点空间时,它就会开始正常工作。更有趣的是,我们在SQL Server 2008 R2和SQL Server 2012上使用的相同设置(相同的硬件,相同的文件夹和文件设置,相同的工作负载)可以正常工作。 请帮助我们找到永久的解决方案。 所有数据文件的初始大小都相同,为1000MB,当前为1500MB。都是一样的。每个自动增长为100MB。在此之前,我们面临着PFS和GAM页面争用的问题,我们增加到16个,问题得以解决。跟踪标记1117和1118均被启用。2个NUMA节点上的24个内核。所有数据文件都在同一卷上。简单磁盘,无SAN。 实例在物理计算机上。带表变量的查询和带哈希联接的查询是最常见的生成IO_Completion等待的方法。 wBob的详细回答促使我们进行了更详细的搜索。我们以前是怎么错过它的: 用户取消了数据库“ tempdb”中文件“ templog”的自动增长,或者在7704毫秒后超时。使用ALTER DATABASE可以为此文件设置较小的FILEGROWTH值,或显式设置新的文件大小。 每当发生这种类型的问题时,我们都会在日志中找到此问题。我们正在将TempDB移至单独的快速驱动器。

1
从具有不同用户权限的存储过程中执行SSIS程序包
由于所需的特权级别不同,我在允许我的用户以合理的方式执行SSIS包时遇到问题。 场景:我们创建了一个数据仓库,其中有两个不同的SSIS软件包负责向其中加载数据,一个要自动运行(通过SQL Agent作业,并且运行良好),另一个必须在以下位置运行:一旦上游数据完成并清理等,用户的需求。 该程序包执行非常特权的操作,包括在运行开始时备份数据库(当然),删除和重新创建计算表等。 我已经编写了一个存储过程,以通过[SSISDB]。[catalog]。[create_execution]和[SSISDB]。[catalog]。[start_execution]存储过程来执行此作业。 (我是系统管理员)。 由于SSISDB和MSDB要求执行排队的高级权限,存储过程在由普通用户运行时失败,并且程序包本身由于在其(较低)安全性上下文下运行而失败。 我已经试过: 我试图在存储过程中使用“ Execute As”解决问题,但是由于跨数据库链接问题,Trustworthy标志等而失败。 我还尝试通过让Agent作业运行程序包并仅从存储过程运行Agent作业来解决该问题,但是我很快陷入了一个痛苦的世界,涉及到: 无法按工作设置执行权限 希望通过中央服务器角色配置此访问权限,以适应随时间推移而变化的员工,并且作业只能由一个用户作为所有者 代理帐户,凭据与sql-auth登录等结合使用的黑暗世界 计划C和D 我能想到的唯一的选择就是创建具有提升权限的专用SQL Server登录名,并相信用户不要传递凭据,也不会丢失计划导入的人员的可审核性(在其他方面解决此问题的方法)组织)或自定义构建Web前端,纯粹是为了允许用户认证为“服务器角色”帐户,然后让Web应用在第二个(特权)连接下运行存储过程。 所以.... 是否有关于如何进行以下操作的建议: 让SSIS包执行特权操作 特权较低的用户(使用AD Windows帐户)执行 最好是通过中央服务器角色来管理运行作业的访问权限(我不容易为它们创建新的Windows组) 并且任何新的中级/代理帐户都是SQL Server Auth帐户(同样,对AD进行更改的能力非常有限) 我知道这里有很多活动部件(有些感觉就像是旋转的刀片),所以请让我知道您是否还想念其他信息。 蒂姆,干杯 编辑.... 因此,今天我创建了一个具有ssis_admin权限的专用SQL Server登录,创建了该用户拥有的三个SQL Server Agent作业,并将最终用户调用的存储过程更新execute as为该用户。由于无法调用create executionSQL Server登录名而失败,它需要Windows帐户。 我将用户存储过程更新为execute asWindows帐户,SQL Server以(AD服务帐户)身份运行,并且授予该证书ssis_admin,但失败并显示错误 当前的安全上下文无法还原。请切换到调用“ Execute As”的原始数据库,然后重试。 这并不能很快实现:(

3
如何重新加载链接服务器?
我正在使用Microsoft SQL Server 2014企业版。链接的服务器出现问题,需要重新启动服务器或停止MSSQLSERVER服务。当服务器再次运行时,(连接到DB2的)链接服务器无法正常工作,并且SQL Server显示此错误: 消息7302,级别16,状态1,行10 无法为链接服务器“ Airspe”创建OLE DB提供程序“ DB2OLEDB”的实例。 仅在几次重新启动服务器后,链接服务器才开始工作。 为什么需要多次重启服务器才能启动链接的服务器? 还有其他解决方案吗? 这是创建链接服务器之一的脚本: EXEC master.dbo.sp_addlinkedserver @server = N'AIRS', @srvproduct=N'Microsoft OLE DB Provider for DB2', @provider=N'DB2OLEDB', @datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB; Data Source=#####;Persist Security Info=True;Password=**********; User ID=######;Initial Catalog=######; Network Address=###.###.###;Package Collection=AICOLDP;DBMS Platform=DB2/AS400', @catalog=N'#####' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AIRS',@useself=N'False',@locallogin=NULL,@rmtuser=N'#####',@rmtpassword='########' EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'collation compatible', @optvalue=N'false' EXEC master.dbo.sp_serveroption …

2
未使用计算列索引
我想根据两列是否相等来进行快速查找。我试图使用带有索引的计算列,但是SQL Server似乎没有使用它。如果仅使用带有索引的静态填充的位列,则会得到预期的索引查找。 似乎还有其他类似的问题,但是没有一个问题集中在为什么不使用索引上。 测试表: CREATE TABLE dbo.Diffs ( Id int NOT NULL IDENTITY (1, 1), DataA int NULL, DataB int NULL, DiffPersisted AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 else 0 end), 0) PERSISTED , DiffComp AS …

2
大量INSERT阻止SELECT
我遇到大量阻止SELECT操作的INSERT问题。 架构图 我有一个这样的表: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = …

1
为什么使用CASE,多个COUNT比一个SUM快?
我想知道以下两种方法中哪一种速度更快: 1)三COUNT: SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Approved'), Valid = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Valid'), Reject = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Reject') 2)SUM与FROM-clause: SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END), …

5
属性大小不适用于数据库
我最近将数据库还原到了从(SQL Server 2008 R2 Enterprise)备份的同一实例,发现我无法访问数据库属性。 我已经完成以下工作: 检查数据库所有者使用正确设置sp_helpdb。 将数据库所有者更改为sa。不能解决。 将数据库所有者更改回我的sysadmin用户。不能解决。 DBCC updateusage针对受影响的数据库发出。不能解决。 DBCC CheckDB在还原的副本上运行到另一个实例。找不到腐败。访问数据库属性窗口时,从同一备份文件还原的副本没有引发任何错误。 有人可以帮忙吗? 尝试查看属性时收到的错误消息是: 无法显示请求的对话框。(SqlMgmt) 属性大小不适用于数据库“ [DBNAME]”。 该属性对于该对象可能不存在,或者由于访问权限不足而无法检索。(Microsoft.SqlServer.Smo) 我sysadmin在这种情况下。 更新:根据建议,我创建了一个新用户,使其成为sysadmin并将数据库所有者更改为该用户。不幸的是没有修复。我将查看探查器跟踪是否产生任何有用的信息。 更新:Aaron-原始数据库已重命名并脱机,但仍在该实例上。然后使用原始名称还原了该数据库的备份。新数据库文件的文件名与原始文件名不同,因为它们与原始mdf / ldf位于同一文件夹中。恢复的数据库当前正在正常驱动我们的关键应用程序。

2
无法从完全备份还原SQL Server数据库,日志处理失败,数据库处于“还原”状态
我试图在我的PC的本地SQL Server Developer Edition 12.0.2000.8上建立数据库以用于开发目的。我有完整的数据库备份和单独的仅事务日志备份文件,这些文件是通过网络发送给我的。 尝试从完全备份还原时,经过一段时间(大约1个小时,数据库的大小约为270 GB),出现错误: System.Data.SqlClient.SqlError:处理数据库“数据库名称”的日志时发生错误。如果可能,请从备份中还原。如果没有备份,则可能有必要重建日志。(Microsoft.SqlServer.SmoExtended) 此后,数据库处于“正在还原..”状态。 我想运行类似的东西(从这个问题中得到它) ALTER DATABASE recovery_test_2 SET EMERGENCY; ALTER DATABASE recovery_test_2 SET SINGLE_USER; DBCC CHECKDB (recovery_test_2, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS; 针对它,但是自然地我不能,因为数据库处于'Restoring ..'状态。在数据库上重新启动还原过程会导致相同的错误消息,再次删除和还原也无济于事。 如何启动数据库并正常工作?事务的一致性对我来说并不重要。 SSMS自动生成的还原脚本: USE [master] RESTORE DATABASE [database_name] FROM DISK = N'D:\database_name.bak' WITH FILE = 1, MOVE N'database_name' TO N'D:\MSSQL\MSSQL12.MSSQLSERVER\MSSQL\DATA\database_name.mdf', MOVE N'database_name_index' …

4
SQL Server Developer Edition 2012或2014-下载
我已经听说(我很确定)Developer Edition是免费的,下载它不需要注册。但是,当我今天开始寻找它时,我找不到从哪里得到它的。我的理解是对还是错?抱歉,我在这里没有找到类似的问题。有任何想法吗?
14 sql-server 

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.