Questions tagged «sql-server»

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

1
TSQL为什么使用变量可以使Top更快?
大家早, 我一直在研究一些中度复杂的sql,以从第三方产品数据库中“获取”某些数据,以将其显示在我们自己的内部应用程序中。 我添加了一个select来从子查询中的表中获取最高记录(如果那很有意义) 该查询花费了将近3分钟的时间,使用以下命令返回了100条记录的最终结果集 SELECT TOP 1 ... 我在网上查看了要实现的目标的改进,建议我将选择更改为使用变量,如下所示 DECLARE @topCount INT SET @topCount = 1 SELECT TOP (@topCount) ... 这将相同的查询从3分钟缩短到1秒,这太好了! 但是谁能解释为什么会这样。
10 sql-server  t-sql 

3
在聚集索引上重建,为什么datasize缩小?
当我们在其中包含约15gb数据的表的聚集索引上进行重建时,数据大小缩小到5gb,这怎么可能?什么样的“数据”被删除? 数据大小,我的意思是DBCC sp_spaceused的“数据”列 在聚集索引上重建之前: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 39169656 KB 15857960 KB 22916496 KB 395200 KB 在聚集索引上重建后: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 29076736 KB 5867048 KB 22880144 KB 329544 KB 用于重建的TSQL: USE [DAX5TEST] GO ALTER INDEX [I_212RECID] ON [dbo].[LEDGERJOURNALTRANS] REBUILD PARTITION = ALL …

2
删除辅助数据文件。DBCC SHRINKFILE:无法移动页面,因为它是工作表页面
我为创建了太多辅助数据文件(.ndf)tempdb。要删除多余的文件,我需要清空文件(内容将移至其他文件): DBCC SHRINKFILE('tempdbfile8', EMPTYFILE); 然后删除文件: ALTER DATABASE tempdb REMOVE FILE tempdbfile8; 但是EMPTYFILE命令返回错误: DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page. Msg 2555, Level 16, State 1, Line 2 Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation. …

2
对Parallel Scalar UDF的支持是否合理?
相当有据可查的是,标量UDF强制执行总体串行计划。 并行运行功能 鉴于大量行进入必须计算UDF的管道中的某个点,为什么引擎不能只在处理器之间分配它们呢?如果UDF中没有状态,则顺序无关紧要。 有人声称UDF是黑匣子,必须使用游标。我可以看到,在两次迭代之间保持某种状态的情况下,用户游标无法在SP内并行化,但是看起来应该可以并行化。 解释引擎为何强制整个计划按顺序进行而不是仅由UDF计算阶段进行的加分。 对并行UDF的支持是否是要求的合理功能?

5
使用INSERT_IDENTITY插入select到多个相关表中
好,设置场景。我有三个表,( Table1,Table2和DataTable),我想插入Table1和Table2使用DataTable作为源。所以对于每一行DataTable我都想要在Table1和中一行Table2,并且Table2需要id从Table1...中插入(PK)。 如果我要这样做... INSERT INTO Table1 SELECT A, B, C FROM MyTable INSERT INTO Table2 SELECT IDENTITY_INSERT(), D, E, F FROM MyTable 我将获得ID最后插入的记录的Table1。 是CURSORor WHILE循环的唯一方法吗?

6
估计预计的数据库增长
我最近开始以DBA培训生的身份使用SQL Server 2008。我需要计算数据库的大小,还需要估计数据库在最近几个月的增长以及未来12个月的预测增长。 我可以使用sp_spaceused语句来计算实际大小,但是如何计算其他所有内容?

2
外键约束违规问题
我确定了3种情况。 没有入学的学生。 有入学但没有成绩的学生。 具有入学和成绩的学生。 注册表上有一个触发器来计算GPA。如果学生有成绩,它将更新或在GPA表中插入一个条目;没有成绩,没有GPA表条目。 我可以删除没有注册的学生(#1)。我可以删除具有入学和成绩的学生(以上#3)。但是我不能删除没有注册但没有成绩的学生(#2)。我收到了参考约束违规。 DELETE语句与REFERENCE约束“ FK_dbo.GPA_dbo.Student_StudentID”冲突。在数据库“”,表“ dbo.GPA”的“ StudentID”列中发生了冲突。 如果我无法删除没有注册(也没有GPA条目)的新学生,那么我会理解违反约束的条件,但是我可以删除该学生。这是一个学生,没有注册并且没有成绩(我也没有GPA条目),我无法删除。 我已修补好扳机,因此可以继续前进。现在,如果您已注册,则无论如何触发器都会将您插入GPA表。但是我不理解潜在的问题。任何解释将不胜感激。 物有所值: Visual Studio 2013专业版。 IIS Express(VS2013内部)。 使用EntityFramework 6.1.1的ASP.NET Web App。 MS SQL Server 2014企业版。 GPA.Value可为空。 Enrollment.GradeID为空。 这是数据库的一个片段: - 编辑 - 这些表都是由EntityFramework创建的,我使用SQL Server Management Studio生成了这些表。 这是带有约束的创建表语句: GPA 表: CREATE TABLE [dbo].[GPA]( [StudentID] [int] NOT NULL, [Value] [float] NULL, CONSTRAINT …

1
为什么对具有INSTEAD OF UPDATE触发器的表进行UPDATE似乎会执行聚集索引插入以及聚集索引更新?
我将从一个非常简单的示例开始:两个表都具有相同的模式,它们都聚集在PK上,但是其中一个具有INSTEAD OF UPDATE触发器: CREATE TABLE Standard ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO CREATE TABLE InsteadOf ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) GO CREATE TRIGGER …

1
事务隔离级别快照与截断?
我希望有人可以阐明我在SNAPSHOT隔离与TRUNCATE上没有想到的这种行为。 数据库:允许快照隔离= True;读取已提交快照快照= False。 Procedure1(从具有大量连接的长时间运行的复杂SELECT替换表foo的内容): BEGIN TRAN; TRUNCATE TABLE foo; INSERT INTO foo SELECT...; COMMIT; Procedure2(从表foo中读取): SET TRANSACTION ISOLATION LEVEL SNAPSHOT; SELECT * FROM foo; 如果在执行Procedure2的同时正在运行Procedure1,则过程2将等待LCK_M_SCH_S(根据sp_WhoIsActive)等待,直到Procedure1完成。而当Procedure2确实完成时,它将引发此异常: 快照隔离事务在数据库'DatabaseName'中失败,因为自该事务开始以来,该语句访问的对象已由另一个并发事务中的DDL语句修改。不允许这样做,因为未对元数据进行版本控制。如果同时进行元数据更新和快照隔离,则可能导致不一致。 但是,Microsoft并未将TRUNCATE列为SNAPSHOT隔离下不允许的DDL语句:http : //msdn.microsoft.com/zh-cn/library/bb933783.aspx 显然,我并没有正确理解某些东西,因为我希望程序2的最佳情况会在TRUNCATE之前立即返回表中最近提交的数据,或者最坏的情况是被程序1阻止,然后返回程序的新内容。表。你能帮我吗?

1
哈希/排序溢出到tempdb中的频率是多少?
我们的企业应用程序使用SQL Server进行数据存储,并且主要是OLTP系统。但是,我们应用程序的重要组成部分会产生大量的OLAP工作负载。 我们对tempdb的写入延迟约为100毫秒。这种趋势发展随着时间的推移,和ALLOW_SNAPSHOT_ISOLATION关断。我们正在对有关此问题的问题进行故障排除,到目前为止,我们发现的唯一有趣的事情是,有大量散列和排序溢出到tempdb。我们推测这是来自我们的OLAP工作负载。 题 涉及什么频率的泄漏?任何?每秒多少溢出?我们的初步数据表明,每秒大约有2次哈希溢出,每分钟大约25次分类溢出。 这种溢出的频率是否可能成为我们高tempdb写延迟的主要原因? 其他资讯 根据内核数的建议,我们正在为tempdb使用多个文件。tempdb文件位于RAID 1 + 0 SAN(具有高性能SSD)上,但与主DB数据和日志文件位于同一设备上。tempdb文件的大小足够大,以至于它们很少增长。我们没有使用跟踪标志1117或1118。另一个变量是,此设置被许多不同的数据库共享,这些数据库都承受着中到高负载。 我们的100 ms写延迟远远大于我们在MSDN,SQL Skills和其他站点上找到的tempdb写延迟可接受的范围。但是,其他数据库的写入延迟很好(小于10ms)。基于其他统计数据,看来我们在大量使用tempdb,尤其是对于内部对象。因此,我们正在深入研究以找出为什么我们的应用程序如此大量地使用内部对象。 我们的平台上确实存在实际性能问题,这些问题以不同的方式体现出来。我们一直在监视性能计数器,查看DM视图,并分析我们的应用程序行为,以尝试挖掘系统的资源使用特征。我们现在专注于溢出,因为我们已经了解到溢出具有严重的负面影响,因为它们是在磁盘上而不是在内存中执行的。而且我们似乎有大量的泄漏事件,但是我想就人们认为“高泄漏”的问题征求一些意见。

1
确保时态数据库设计中唯一条目的正确方法是什么?
我在设计时态数据库时遇到了麻烦。我需要知道如何确保商店的给定时间范围内只有一条活动记录。我已经读过这个答案,但是恐怕我无法围绕触发器的工作原理来解决。特别是,我将如何触发现有的触发器,以防止对记录进行更新,而是插入一条新记录。我的真正问题是,当完成日期为null时,我不知道如何防止商店拥有多个生效日期。(即防止2条活动记录的商店)。 这就是我所拥有的,但是它允许我为具有不同生效日期的商店插入新记录。 表定义: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) BEGIN CREATE TABLE [Z_STORE_TEAM]( [STORENUM] …

1
用于处理10亿行和计数的数据库设计
我们以大约5000 pr的速率接收实时GPS数据。分钟(来自4个TCP服务器)。每个服务器使用单个连接来插入数据,并在两次插入之间缓冲数据。每隔15分钟左右,服务就会获取一次此数据,并将其处理为行程。生成行程后,仅当用户希望在地图上查看路线时,实际的GPS数据通常并不那么重要。 问题是数据库似乎在努力跟上插入数据的速度。有时,当负载增加时,插入时间突然急剧增加(> 30秒),这又使更多数据得以缓冲,从而导致更大的插入量和更长的插入时间。 我希望能对当前的设计发表一些评论,以及一些我们必须提高性能的想法,并回答我们的一些问题-以及人们可能拥有的其他技巧! 当前设计 当前将数据分为代表一周的表格,并且将早于一年的数据存档到辅助数据库中。整个事物在可编辑视图中连接在一起,该视图用于插入和读取。 桌子设计 ID(PK,唯一标识符) DeviceId(FK,int) PersonId(FK,int) VehicleId(FK,int) TokenId(FK,int) UtcTime(PK,datetime2(3)) 纬度(浮动) 经度(浮点) 速度(smallint) 标题(smallint) 卫星(tinyint) IOData(varbinary(100)) IgnitionState(tinyint) UserInput(tinyint) CreateTimeUtc(datetime2(3)) 指标 DeviceId_CreateTimeUtc_Desc DeviceId_UtcTime_Desc(集群) PersonId_UtcTime_Desc TokenId_UtcTime_Desc VehicleId_UtcTime_Desc 当前每个星期(包括索引)占用大约10 GB的数据,并且主数据库中目前大约有300 GB的数据。 主数据库中的数据表具有自己的文件组,其中包含1个文件,但它与主数据库中的所有其他表位于同一磁盘上。辅助数据库位于不同的磁盘上,但位于同一台计算机上。 我认为,当使用新的表分区(一周)时,我们每周还会运行一次索引重建作业。不执行收缩。 该计算机是具有12 GB内存的8核HP,并且包含主数据库的磁盘正在运行RAID 10。 主意 将存储在主数据库中的数据量限制为最多1个月。至少它可以使数据库更易于管理以进行备份/还原,但是通过这样做,我们可以期望看到性能的提高吗? 在文件组中为当前数据创建2个文件,并将它们分发到2个不同的物理分区中 创建保存当前数据的主从数据库,因此在不同数据库上执行插入和读取操作 将当前数据文件放在SSD磁盘上(镜像是否会对SSD磁盘产生任何性能差异?) 请让我知道是否需要更多信息。影响性能的因素很多,并且可能有许多调整方法。

2
AlwaysOn可用性组自动故障转移不起作用
使用AG设置,我启动了WSFC,并在一个称为DevClusterOnline的可用性组中配置了两个节点。两个节点(主要是DEV-AWEB5,次要是DEV-AWEB6)都运行Windows Server 2008 R2。 如果我检查AG的运行状况,则会得到以下信息: 运行以下查询将返回此结果集: select ar.replica_server_name, availability_group_name = ag.name, ar.availability_mode_desc, ar.failover_mode_desc from sys.availability_replicas ar inner join sys.availability_groups ag on ar.group_id = ag.group_id order by availability_group_name, replica_server_name; 如果断开DEV-AWEB5的连接,则无法连接到组侦听器(DevListener),但可以对其执行ping操作,并且它将响应我的ping操作。副本-DEV-AWEB6进入RESOLVING状态,并且无法访问我的数据库。但是,我可以手动进入Management Studio并将故障转移设置为DEV-AWEB6,然后重新启动并运行,DevListener将再次接受连接。 考虑到这些事实可确认故障转移确实有效,我已同步提交并配置了自动故障转移,因此我不知道安装程序是否出现故障该怎么办。 当我断开DEV-AWEB5的连接时,我希望我的副本将保持连接,因此,DevListener也将保持连接。我希望自动故障转移可以使我透明地连接到AG Listener。从最终用户的角度来看,使用Web系统应该不会注意到其中一台数据库服务器出现故障。 我被困在这里,有人可以启发我做错什么吗?

4
SQL Server 2012复制数据库失败
我想在同一SqlServer中复制数据库。因此,当我使用“复制数据库向导”时,它会引发错误:(我使用测试数据库执行了此步骤,并且工作正常!!!) 配置: 一个用户 方法:“使用SQL管理对象方法” 选择目标数据库的新名称。 错误: 标题:复制数据库向导 作业失败。检查目标服务器上的事件日志以获取详细信息。 - - - - - - - - - - - - - - - 纽扣: 好 在事件日志中: 系统 提供者 [名称] SQLSERVERAGENT 事件ID 208 [资格赛] 16384 3级任务3关键字0x80000000000000 创建时间 [SystemTime] 2014-05-07T06:23:11.000000000Z EventRecordID 123672频道应用程序计算机Server1安全 事件数据 CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B 失败2014-05-07 10:52:50作业失败。作业由用户sa调用。运行的最后一步是步骤1(CDW_Server1_Server1_3_Step)。 日志文件的最后几行: OnProgress,Server1,NT Service \ SQLSERVERAGENT,Server1_Server1_Transfer …

3
遍历值一次剥离1个字符
我想遍历值并一次从值中删除1个字符并显示结果。 因此,如果我有一个带有值的表: ID ___ 34679 13390 89906 我希望结果看起来像这样 Id ---- 4679 679 79 9 3390 390 90 0 9906 906 06 6

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.