Questions tagged «sql-server-2012»

SQL Server 2012(主要版本11.00.xxxx)。还请标记sql-server。

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 ( …

2
不可搜索的持久化计算列上的索引
我有Address一个名为的表,该表具有一个称为的持久计算列Hashkey。该列是确定性的,但不精确。它具有不可搜索的唯一索引。如果运行此查询,则返回主键: SELECT @ADDRESSID= ISNULL(AddressId,0) FROM dbo.[Address] WHERE HashKey = @HashKey 我得到这个计划: 如果我强制索引,我会得到更糟糕的计划: 如果我尝试同时使用索引和查找,则会收到错误消息: 由于此查询中定义的提示,查询处理器无法生成查询计划。重新提交查询而不指定任何提示,也无需使用SET FORCEPLAN 这仅仅是因为它不精确吗?我以为如果坚持下去没关系吗? 有没有一种方法可以使该索引可查询而不将其设为非计算列? 有人在此链接到任何信息吗? 我无法发布实际的表创建,但是这是一个具有相同问题的测试表: drop TABLE [dbo].[Test] CREATE TABLE [dbo].[Test] ( [test] [VARCHAR](100) NULL, [TestGeocode] [geography] NULL, [Hashkey] AS CAST( ( hashbytes ('SHA', ( RIGHT(REPLICATE(' ', (100)) + isnull([test], ''), ( 100 )) ) + …

4
如何将SQL Server死锁报告中的键转换为值?
我有一个死锁报告,告诉我发生了涉及waitresource =“ KEY:9:72057632651542528(543066506c7c)”的冲突,并且我可以看到: <keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528"> 在<resource-list>中。我希望能够找到密钥的实际值(例如,id = 12345)。我需要使用什么SQL语句来获取该信息?

2
减少varchar列的大小对数据库文件有什么影响?
我们数据库中有许多表,这些VARCHAR(MAX)表中的列VARCHAR(500)(或比max小得多)足以满足需要。自然,我想清理它们,并将尺寸减小到更合理的水平。我了解的“方法”是:我的问题是更改这些列会对磁盘上​​的页面和现存内容产生什么影响?(那里有很多关于增长一列时会发生什么的信息,但是很难找到收缩一列时会发生什么的信息。) 有些表的行数非常小,因此我不担心更改的成本,但有些表却很大,并且担心它们可能会被重组并导致大量阻塞/停机。实际上,我只想一种估计维护时段的方法。通常,我想更好地了解这种情况下数据库引擎的行为。 提前致谢! 编辑: 我正在查看20个表,尽管其中只有一半的行数大于1,000。最大的行将近一百万行。犯规最严重的是一张有350,000行和4 VARCHAR(MAX)列的表,可以缩小到该VARCHAR(500)水平。

3
如何通过数据库获取特定实例的CPU使用率?
我发现以下查询可按数据库检测CPU使用率,但它们显示不同的结果: WITH DB_CPU_Stats AS ( SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms] FROM sys.dm_exec_query_stats AS qs CROSS APPLY ( SELECT CONVERT(int, value) AS [DatabaseID] FROM sys.dm_exec_plan_attributes(qs.plan_handle) WHERE attribute = N'dbid') AS F_DB GROUP BY DatabaseID ) SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num], DatabaseName, [CPU_Time_Ms], CAST([CPU_Time_Ms] * 1.0 …

3
从胜负平局数据获取连胜数和连胜类型
我做了一个SQL小提琴为这个问题,是否对任何人来说都使事情变得容易。 我有一个各种各样的幻想体育数据库,我想弄清楚的是如何得出“当前连胜”数据(如“ W2”(如果该队赢得了他们的最后两场比赛)或“ L1”(如果他们输了)他们赢得上一场比赛后的最后一场比赛-如果他们并列最近的比赛,则为“ T1”)。 这是我的基本架构: CREATE TABLE FantasyTeams ( team_id BIGINT NOT NULL ) CREATE TABLE FantasyMatches( match_id BIGINT NOT NULL, home_fantasy_team_id BIGINT NOT NULL, away_fantasy_team_id BIGINT NOT NULL, fantasy_season_id BIGINT NOT NULL, fantasy_league_id BIGINT NOT NULL, fantasy_week_id BIGINT NOT NULL, winning_team_id BIGINT NULL ) 的值NULL在winning_team_id列指示该匹配领带。 这是一个DML声明示例,其中包含6个团队和3周对战的示例数据: INSERT INTO …

2
如何在SQL Server 2012上创建只读服务器角色?
创建新服务器角色时,我授予了“查看任何数据库”权限,但意识到该权限仅允许用户查看系统数据库。 我正在尝试创建一个只读服务器角色,并且可以读取任何数据库。 有没有一种方法可以创建用户定义的服务器角色来读取用户数据库?还是我必须通过每个用户的用户映射来做到这一点?

4
如何在维护计划作业中更改或更新本地服务器连接
两天前,我们的客户更改了我们的Dev Server名称之一 重命名服务器后,由于服务器名称不匹配,所有我的维护作业和其他作业都失败了。 我们正在使用sql server 2012版本和 Server 2008 OS 所以今天早上我将我的Sql Server 2012名称重命名为更新的给定名称,并进行了表,程序更新 我试图在维护作业中更新本地服务器连接,但是无法编辑。然后我添加了新的服务器连接,但仍无用,执行作业时出现错误。 我尝试了作业属性选项中的目标页面后,也仅选择了目标服务器,并且禁用了多个目标服务器。 错误如下 以用户身份执行:NT Service \ SQLSERVERAGENT。用于64位版权(C)Microsoft Corporation的Microsoft(R)SQL Server执行软件包实用程序版本11.0.2100.60。版权所有。 开始时间:12:01:28 AM错误:2013-12-16 00:01:43.98代码:0xC00291EC源:{410F7661-F71A-4B68-9584-BA422AB00F02}执行SQL任务 说明:无法获取连接“本地服务器连接” 。连接可能配置不正确,或者您对此连接没有正确的权限。结束错误 错误:2013-12-16 00:02:00.00 代码:0xC0024104 源:Territory_Update 说明:任务上的Execute方法返回错误代码0x80131904(建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问该服务器。请验证实例名称是否正确以及该实例名称是否正确。 SQL Server配置为允许远程连接(提供程序:命名管道提供程序,错误:40-无法打开与SQL Server的连接)。Execute方法必须成功,并使用“ out”参数指示结果。结束错误 错误:2013-12-16 00:02:15.00 代码:0xC0024104 源:{4E2AF328-0B8D-4905-83BE-839FDDEFC09C} 说明:任务上的Execute方法返回错误代码0x80131904(建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问该服务器。请验证实例名称是否正确以及该实例名称是否正确。 SQL Server配置为允许远程连接(提供程序:命名管道提供程序,错误:40-无法打开与SQL Server的连接)。Execute方法必须成功,并使用“ out”参数指示结果。 结束错误DTExec:程序包执行返回DTSER_FAILURE(1)。 开始:12:01:28 AM 完成:12 …

3
SQL Server未使用所有CPU内核/线程
升级SQL Server的硬件后,我们在Windows任务管理器中注意到SQL实例仅使用了可用线程的一半: 。 该服务器具有以下硬件和软件: Windows 2008 R2企业版64位SP1 Intel Xeon E7-4870-4个处理器(40核,80线程) Microsoft SQL Server 2012企业版(64位) 运行select cpu_count from sys.dm_os_sys_info返回40。 操作系统可以看到所有80个线程。 为什么只使用服务器一半的处理能力? 我们在两台服务器上具有相同的硬件和软件,并且它们都表现出相同的行为。

3
优化CTE层次结构
在下面更新 我有一个具有典型acct /父帐户体系结构的帐户表来表示帐户层次结构(SQL Server 2012)。我使用CTE创建了一个VIEW,以散列层次结构,总的来说,它可以按预期的方式很好地工作。我可以在任何级别查询层次结构,并轻松查看分支。 需要根据层次结构返回一个业务逻辑字段。每个帐户记录中的一个字段描述了企业的规模(我们将其称为CustomerCount)。我需要报告的逻辑需要从整个分支汇总CustomerCount。换句话说,给定一个帐户,我需要对该帐户以及层次结构中该帐户下方每个分支中的每个子级的客户计数值进行汇总。 我使用CTE中内置的层次结构字段成功计算了该字段,该字段类似于acct4.acct3.acct2.acct1。我遇到的问题只是使其运行速度很快。如果没有这一计算字段,查询将在约3秒内运行。当我在计算字段中添加时,它变成一个4分钟的查询。 这是我能够想到的最佳版本,它可以返回正确的结果。我正在寻找有关如何在不牺牲性能的前提下重新构建此“视图”的想法。 我知道这种方法运行缓慢的原因(需要在where子句中计算谓词),但是我想不出另一种方法来构造它并仍然得到相同的结果。 这是一些示例代码,用于构建表并完全按照其在我的环境中的工作方式执行CTE。 Use Tempdb go CREATE TABLE dbo.Account ( Acctid varchar(1) NOT NULL , Name varchar(30) NULL , ParentId varchar(1) NULL , CustomerCount int NULL ); INSERT Account SELECT 'A','Best Bet',NULL,21 UNION ALL SELECT 'B','eStore','A',30 UNION ALL SELECT 'C','Big Bens','B',75 UNION ALL …

6
SQL Server 2012慢于2008
我将大型网站和数据库从旧服务器(Windows 2008 / SQL Server 2008/16 GB RAM / 2 x 2.5 GHz四核/ SAS磁盘)迁移到了更好的新服务器(Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2.1 GHz 16核处理器/ SSD磁盘)。 我分离了旧服务器上的数据库文件,将它们复制并附加到新服务器上。一切进展顺利。 之后,我将兼容性级别更改为110,更新了统计信息,并重建了索引。 令我感到非常失望的是,我注意到,在新的SQL 2012服务器上,大多数SQL查询的速度要比旧的SQL 2008服务器慢得多(慢2-3-4倍)。 例如,在具有约70万条记录的表上,在旧服务器上,对索引的查询花费了约100毫秒。在新服务器上,相同的查询大约需要350毫秒。 所有查询都一样。 我会在这里有所帮助。让我知道要检查/验证的内容。因为我很难相信,在具有更新的SQL Server的更好的服务器上,性能会更差。 更多细节: 内存设置为最大。 我有此表和索引: CREATE TABLE [dbo].[Answer_Details_23]( [ID] [int] IDENTITY(1,1) …

3
为什么OFFSET…FETCH与旧式ROW_NUMBER方案之间的执行计划有所不同?
OFFSET ... FETCHSQL Server 2012引入的新模型提供了简单,快速的分页。考虑到两种形式在语义上是相同且非常普遍的,为什么根本没有区别? 人们会假设优化器可以识别这两者,并(最大程度地)优化它们。 这是一个非常简单的情况,OFFSET ... FETCH根据成本估算,速度提高了约2倍。 SELECT * INTO #objects FROM sys.objects SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY object_id) r FROM #objects ) x WHERE r >= 30 AND r < (30 + 10) ORDER BY object_id SELECT * FROM #objects ORDER BY …


1
在INSERT上使用WITH TABLOCK的好处
在某些情况下,INSERT INTO <tablename> (WITH TABLOCK)由于记录最少,因此执行操作会更快。这些情况包括将数据库包含在BULK_LOGGED恢复模型中。 当数据库(tempdb)使用恢复模型时,在空表上使用WITH TABLOCKon 还有其他潜在的性能优势吗?INSERTSIMPLE 我正在使用SQL Server 2012 Standard Edition。 我的用例是使用来创建然后立即在存储过程中填充临时表INSERT...SELECT,该表可能包含多达几百万行。我尝试避免这种tempdb滥用,但是有时是需要的。 我正在尝试建立一个需要的案例TABLOCK。似乎它不会伤害任何东西,并且可能会有好处。我试图弄清楚是否有足够的潜在优势可以将其添加到我们整个代码库中的任何位置,我敢肯定没有其他进程要写到表中。 我通常将其插入具有群集PK的新创建的本地临时表中,但有时会使用堆。


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.