Questions tagged «sql-server»

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

1
搜寻,然后您应扫描…在分区表上
我已经在Itzik Ben-Gan的 PCMag中阅读了这些文章: 搜寻并您应扫描第一部分:当优化程序未优化 搜寻时,您应扫描第二部分:升序键 我目前所有分区表都遇到“最大分组”问题。我们使用Itzik Ben-Gan提供的技巧来获取max(ID),但有时它无法运行: DECLARE @MaxIDPartitionTable BIGINT SELECT @MaxIDPartitionTable = ISNULL(MAX(IDPartitionedTable), 0) FROM ( SELECT * FROM ( SELECT partition_number PartitionNumber FROM sys.partitions WHERE object_id = OBJECT_ID('fct.MyTable') AND index_id = 1 ) T1 CROSS APPLY ( SELECT ISNULL(MAX(UpdatedID), 0) AS IDPartitionedTable FROM fct.MyTable s WHERE $PARTITION.PF_MyTable(s.PCTimeStamp) = …

2
是否可以强制优化器在此分区视图中消除不相关的表?
我正在测试大型表的不同体系结构,并且看到的一个建议是使用分区视图,即将大型表分解为一系列较小的“分区”表。 1,2,3,4 在测试这种方法时,我发现有些东西对我来说并没有太大意义。当我在事实视图的“分区列”上进行过滤时,优化程序仅在相关表上进行搜索。此外,如果我在维度表的该列上进行过滤,则优化程序会消除不必要的表。 但是,如果我在维度的其他方面进行过滤,则优化器将在每个基本表的PK / CI上进行搜索。 这是有问题的查询: select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where o.ObservationDateKey >= 20000101 and o.ObservationDateKey <= 20051231 group by od.[Year]; select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.DateKey …

1
插入与OUTPUT相关的子查询表
我正在修改数据库的结构。表FinancialInstitution的几列内容必须转移到表Person中。FinancialInstitution通过外键链接到“人”。每个金融机构都需要其相应人员的ID。因此,对于在Person中插入的每个新行,此新行的ID(IDENTITY)必须复制回FinancialInstitution的相应行中。 显而易见的方法是迭代的T-SQL代码。但是我有兴趣知道是否只有基于集合的操作才有可能做到这一点。 我以为这样的请求的内部层是这样的: INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1) OUTPUT inserted.Id, FinancialInstitution.Id SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email FROM FinancialInstitution; 不幸的是,看来OUTPUT无法以这种方式建立关联...

2
通过网络以较低的停机时间迁移大型SQL Server数据库的最佳方法
问题定义 我们的数据库服务器需要转移到另一个数据中心。它在Microsoft SQL Server 2012 Enterprise(64位)上运行,并包含两个大约2TB和1TB的数据库。 为此,几乎没有停机时间甚至没有停机时间将是理想的。 工作量 这些数据库用于.NET网站,并且会不断更新。 周末不可用它是可以接受的。在切换到新数据库之前,当前正在使用的数据库将保持唯一。 理想情况下,只需更改DNS条目以指向新的数据库服务器,同时确保不更新数据库,即可进行该切换。 此外,只要将从一台服务器切换到另一台服务器的停机时间(停机时间)保持在较低水平,此操作所花费的时间并不重要。 考虑的方法 备份还原 过去已经做到了这一点,但是即使通过内部网络完成,也要花费大量的停机时间,因此比通过Internet 更有效 日志传送 据我了解,该方法将通过配置主/从服务器并将主数据库的精确副本传输到只读的从服务器,从而最大程度地减少停机时间。如上所述,不需要访问从属服务器,我们只需要一种在不破坏数据的情况下拥有主数据库副本的方法。 就资源利用率而言,它似乎也相当有效,并且不会对主服务器性能产生太大影响。 我对这种方法可能不对,请随时纠正我。 数据库镜像 我不太了解这种方法,但似乎是一个有效的选择。不需要实时同步,并且主机的性能非常重要,因此,如果选择这种方法,异步将是必经之路。 还有其他选择吗? 该服务器直接在裸机硬件上运行,因此不幸的是不能选择较低级别的解决方案。也许有更好的方法可以做到这一点? 约束条件 如上所述,这些数据库很大,难以维护,但这是另一个问题。 SQL Server的版本将相同(Microsoft SQL Server 2012 Enterprise 64位)。 它必须在两个数据中心之间通过网络传输,因此很有可能在Internet上传输。不幸的是,无法将磁盘从一个站点发送到另一个站点进行初始同步。为传输提供某种安全性将是理想的,但是我们会尽力解决这种情况。 这应该可以很好地概述我们对这项任务的需求,希望你们中的某些人不得不面对这种情况。

1
为什么SQL Server 2012 Express在服务器上使用9.5GB的RAM?
我正在构建一个计划将SQL Server 2012 Express嵌入为主要数据存储的应用程序。在我的开发机(带有3GB RAM的Win7-32​​)上进行测试时,我从未观察到该sqlservr.exe进程使用超过1GB的RAM,正如我从发布的SQL Server Express版的硬件扩展限制中所期望的那样。 然后,我将应用程序移动到服务器级计算机(具有16GB RAM的Win Server 2008R2 64位)上以评估其性能,并惊讶地发现该sqlservr.exe过程迅速扩展到大约9.5GB RAM并停留在那里。 我重新启动了几次,以查看是否有效果,但是每次,该过程迅速恢复到约9.5GB。现在,我当然很高兴SQL Server Express使用我的RAM,但是我想知道这是否是预期的行为,这样我就不会再依赖基于不正确的RAM使用情况的性能级别了。 仅供参考,根据我的说法SELECT @@VERSION,服务器计算机上SQL Server的版本为: Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 我的9.5GB号码来自任务管理器中的“私人工作集”号码。来自DBCC memorystatus(尽管在现在处于空闲状态的服务器上)输出的第一张表如下: …

2
如何保留SQL Server存储过程修订的历史记录
注意:我并不是在问完整的版本控制。 有没有办法自动保留SQL Server上存储过程的历史记录。 与Google文档自动保留文档版本历史记录以及维基百科自动保留文章版本历史记录相似。 我不希望更新存储过程的用户也必须维护存储过程的存储库。这是太多的工作,人们不会做。 希望这是我可以在SQL Server中启用的功能... (实际上,存储过程是指函数,触发器等。基本上,所有内容都在“可编程性”下。) 我首先发布到/programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions,因为我怀疑它将在那里获得更多的意见。

4
有没有一种方法可以在TSQL中生成表创建脚本?
有没有一种方法可以完全通过T-SQL从现有表中生成创建脚本(即不使用SMO,因为T-SQL无法访问SMO)。假设一个存储过程接收一个表名并返回一个包含给定表的创建脚本的字符串? 现在,让我描述一下我所面临的情况,因为可能有不同的方法来解决这个问题。我有一个包含数十个数据库的实例。这些数据库都具有相同的架构,所有相同的表,索引,等等。它们是作为第三方软件安装的一部分创建的。我需要一种与他们合作的方式,以便可以以临时方式汇总来自他们的数据。dba.se的好人已经在这里为我提供了帮助。如何在其他数据库中创建触发器? 当前,我需要找到一种从所有数据库的表中进行选择的方法。我已将所有数据库名称记录到一个名为的表中,Databasees并且编写了以下脚本以对所有数据库名称执行select语句: IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp select * into #tmp from Database1.dbo.Table1 where 1=0 DECLARE @statement nvarchar(max) = N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1' DECLARE @LastDatabaseID INT SET @LastDatabaseID = 0 DECLARE @DatabaseNameToHandle varchar(60) DECLARE @DatabaseIDToHandle int SELECT TOP …

3
如何与有特权的孩子建立一对多关系?
我想建立一对多关系,其中对于每个父母,一个或零个孩子被标记为“收藏夹”。但是,并不是每个父母都会有一个孩子。(例如,将父母视为本网站上的问题,将孩子视为答案,将喜欢的事物作为接受的答案。)例如, TableA Id INT PRIMARY KEY TableB Id INT PRIMARY KEY Parent INT NOT NULL FOREIGN KEY REFERENCES TableA.Id 我看到的方式可以将以下列添加到TableA中: FavoriteChild INT NULL FOREIGN KEY REFERENCES TableB.Id 或TableB的以下列: IsFavorite BIT NOT NULL 第一种方法的问题在于它引入了可为空的外键,据我所知,它不是标准化形式。第二种方法的问题是,需要做更多的工作以确保最多一个孩子是最爱的。 我应该使用哪种标准来确定使用哪种方法?或者,还有其他我没有考虑的方法吗? 我正在使用SQL Server 2012。

1
SQL查询组合,无重复
我需要一个可以在(或作为)函数中使用的查询,并检索n值的所有组合。我需要长度为k的所有组合,其中k = 1..n。 扩展的样本输入和结果,因此输入具有3个值而不是2个-但是,输入值的数量可能从1到n不等。 示例:输入:具有多行一列中的值的表 Value (nvarchar(500)) ------ Ann John Mark 输出#1:表,其值串联在一栏中 Ann John Mark Ann,John John,Mark Ann,Mark Ann,John,Mark

4
合并语句自身陷入僵局
我有以下过程(SQL Server 2008 R2): create procedure usp_SaveCompanyUserData @companyId bigint, @userId bigint, @dataTable tt_CoUserdata readonly as begin set nocount, xact_abort on; merge CompanyUser with (holdlock) as r using ( select @companyId as CompanyId, @userId as UserId, MyKey, MyValue from @dataTable) as newData on r.CompanyId = newData.CompanyId and r.UserId = newData.UserId and …

2
聚集索引和非聚集索引之间的性能差异
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我正在阅读Clustered和Non Clustered Indexes。 Clustered Index-它包含数据页。这意味着完整的行信息将出现在“聚簇索引”列中。 Non Clustered Index-它仅包含“聚簇索引”列(如果可用)或“文件标识符+页码+页面中的总行数”形式的行定位器信息。这意味着查询引擎必须采取其他步骤才能找到实际数据。 查询 -如何检查的性能差异与实际例子的帮助,因为我们知道,表只能有一个Clustered Index,并且提供sorting在Clustered Index Column和Non Clustered Index不提供sorting,可支持999 Non Clustered Indexes中SQL Server 2008,并在249 SQL Server 2005。

2
什么会导致镜像会话超时然后故障转移?
我们有两个运行SQL Server 2005 SP4且具有累积更新3的生产SQL Server。这两个服务器都在相同的物理计算机上运行。DELL PowerEdge R815具有4个12核心CPU和512GB(yes GB)的ram,以及用于所有SQL数据库和日志的10GB iSCSI SAN连接的驱动器。操作系统是带有所有SP和Windows更新的Microsoft Windows Server 2008 R2企业版。操作系统驱动器是3个72GB 2.5英寸15k SAS驱动器的RAID 5阵列。SAN是具有48个10k SAS 3.5英寸驱动器的Dell EqualLogic 6510,在RAID 50中进行配置,分割为两个SQL Server的多个LUN,并且也共享一台Exchange机器和几台VMWare服务器。 我们有20多个数据库,其中有11个使用见证服务器以高可用性进行了镜像。见证服务器是运行SQL Server实例的低功耗计算机,该实例仅用于提供见证服务。最大的镜像数据库为450GB,可生成约100-300 iops。数据库镜像监视器报告当前的发送速率约为100kb至10mb /秒,并且镜像提交开销(通常为0毫秒)。镜像服务器与主体保持一致没有问题。 我们一直在经历镜像故障转移。有时,单个数据库将进行故障转移,而有时几乎所有数据库将同时进行故障转移。例如,昨晚,我们进行了11个数据库故障转移中的10个,其​​余的数据库保持可访问性,直到我手动对其进行故障转移。 我已经经历了一些故障排除步骤来尝试确定问题,但是到目前为止,仍无法解决问题: 1)该机器随附Broadcom BCM5709C NetXtreme II 4端口千兆网络适配器,我们最初将其用作主要网络连接。此后,我们在两台计算机上都安装了Intel PRO / 1000 PT双端口服务器适配器,以消除NIC的问题。 2)所有数据库每晚都有一个自动完整备份,以及有关镜像数据库的日志备份。日志文件的使用情况受到监控,很少使用超过15%。主数据库的日志文件为125GB,由159个虚拟日志文件组成,大小从511MB到1GB不等。TempDB位于其自己的LUN上,由24 x 2GB文件组成。 3)在见证服务器上的SQL Server登录没有显示以下任何错误:与数据库“ Data”的镜像连接“ TCP://SQL02.DOMAIN.INET:5022”的超时在30秒后没有响应。检查服务和网络连接。 主服务器和辅助服务器上的SQL Server登录显示与镜像有关的消息: 30秒钟后,到“ TCP://SQL01.DOMAIN.INET:5022”的镜像连接超时,数据库“ Data”无响应。检查服务和网络连接。 …

3
在大型表上创建聚集索引的无痛方法?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 因此,我们有一个客户站点抱怨性能严重下降。我看了一眼,很明显,问题出在因为Somebody Else(grrrr)设计了一个表,该表包含大约2000万条记录而没有聚簇索引。 现在,我想在该表上创建聚簇索引-但是在我的测试环境中,我的create index命令已经运行了一个小时,但仍未完成。客户站点是一个工作日为24/7的车间,在创建索引时无法承受一个小时的停机时间。 是否有一些不那么费力的方法来创建索引,该索引要么可以快速完成工作,要么以某种聪明的方式完成工作,而这种忙碌的工作不会完全破坏服务器的性能? 我们正在使用SQL Server企业版。

4
将结果限制在前2个排名行中
在SQL Server 2008中,我RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)用来返回带有的数据集RANK。但是我每个分区都有数百条记录,因此我将从1、2、3 ...... 999列中获取值。但我只希望RANKs每个最多2 个PARTITION。 例: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 History 7 Joe 80 Geography 8 Tim 100 …

5
为什么需要定期重启才能保持实例正常运行?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我们已经在SQL 2005上提供了一个生产数据库服务器。一切正常运行了一段时间,但是几周后,我们发现性能明显下降。仅重新启动SQL Server才能使性能恢复正常。 一些背景: 运行1200多个数据库(大多数是单租户,一些是多租户)。在任何人只讲讲多租户讲座之前,有充分的理由保持这种结构…… RAM是16 GB。重新启动后,SQL Server很快就可以恢复到15 GB的使用率。 活动的数据库连接大约有80个连接-考虑到每个进程每个Web服务器有一个连接池,我们认为这很健康-因此我们没有连接泄漏问题。 我们在非高峰时间尝试了几种方法:-运行DBCC DROPCLEANBUFFERS(带有CHECKPOINT)以清除数据缓存。它无效,也不会清除任何RAM使用情况。-运行FREEPROCCACHE和FREESYSTEMCACHE清除查询计划和存储的proc缓存。没有效果。 显然,在活动的生产环境中重新启动SQL Server是不理想的。我们缺少了一些东西。还有其他人经历吗? 更新:2012年4月28日 仍在解决此问题。我已将SQL Server的内存降低到10 GB,只是为了排除与操作系统的争用。我正在接近缩小范围,但是下一步需要一些帮助。 这是我发现的,重新启动SQL Server之后,页面文件在12.3 GB和12.5 GB之间徘徊。它将保持这种状态数天。服务器线程总数将介于850和930之间-连续几天也稳定且一致(sqlserver取决于流量,稳定在55和85之间)。 然后,有一个“事件”。我不知道事件是什么,我无法在日志中看到它,并且在事件发生的一周中的任何一天或时间都看不到任何一致的信息,但是突然之间,他的页面文件跳到了14.1或14.2。 GB,并且线程数跳到1750和1785之间。 在发生这种情况时检查perfom,其中有900多个线程是sqlserver。所以我去sp_who2看看这些线程是从哪里来的...而且只有大约80个使用过的数据库连接。 所以....有谁知道我如何找到SQL Server上这900个线程的其余位置以及它们在做什么? 更新:2012年6月1日 仍在与问题作斗争。对于仍然阅读此书的人来说,线程跳转的问题已得到解决。这是由自动的ComVault备份软件引起的。它正在创建一个线程,尝试备份不再存在的数据库(它正在维护以前的数据库列表),而不是仅备份当前数据库。 但是-问题仍然存在,我们必须每周重新启动,花几天时间。与Rackspace团队合作,看看他们是否可以阐明任何想法。

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.