Questions tagged «sql-server»

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

2
我可以重构该查询以使其并行运行吗?
我有一个查询,大约需要3个小时才能在我们的服务器上运行-而且没有利用并行处理。(中有约115万条记录dbo.Deidentified,其中有300条记录dbo.NamesMultiWord)。该服务器可以访问8个核心。 UPDATE dbo.Deidentified WITH (TABLOCK) SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml), DE461 = dbo.ReplaceMultiWord(DE461), DE87 = dbo.ReplaceMultiWord(DE87), DE15 = dbo.ReplaceMultiWord(DE15) WHERE InProcess = 1; 并且ReplaceMultiword是定义为: SELECT @body = REPLACE(@body,Names,Replacement) FROM dbo.NamesMultiWord ORDER BY [WordLength] DESC RETURN @body --NVARCHAR(MAX) 是否要求ReplaceMultiword阻止制定并行计划?有没有办法重写它以允许并行性? ReplaceMultiword 因为某些替代品是其他替代品的短版,所以它们以降序运行,我希望最长的替代品能够成功。 例如,可能有“乔治华盛顿大学”和“华盛顿大学”。如果首先是“华盛顿大学”比赛,那么“乔治”将被甩在后面。 从技术上讲,我可以使用CLR,但我不熟悉该如何使用。

2
为BULK INSERT配置不受约束的委托
我在Always On可用性组中有一对Microsoft SQL Server 2016节点。我正在尝试对BULK INSERTWindows Server 2016文件服务器故障转移群集上的文件执行(使用SQL Server 2016 Management Studio查询),但是出现以下错误: 消息4861,级别16,状态1 无法批量加载,因为无法打开文件“ \ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt”。操作系统错误代码5(访问被拒绝。)。 无论我使用活动节点名称(nas2.my.domain)还是故障转移群集侦听器(nas.my.domain),都会发生这种情况。 环顾四周后,我发现这是由于SQL Server无法模拟与我连接的用户帐户所致BULK INSERT。 如果使用Windows身份验证连接到SQL Server,则SQL Server服务帐户将在连接到文件服务器时尝试模拟您的用户帐户。如果使用SQL Server身份验证进行连接,它将以SQL Server服务帐户连接到文件服务器。 如果未正确配置委派和模拟(默认状态),则SQL Server服务将无法模拟您的用户帐户,并且将退回尝试以匿名用户身份连接到文件服务器。 可以通过查看文件服务器上的安全事件日志来确认。这些事实以及有关配置不受约束和受约束的委派的指南记录在以下链接中: 如何:约束委派的SQL Server批量插入(访问被拒绝) 批量插入和Kerberos 我已经尝试按照thesqldude指南中的说明进行操作,但是仍然无法正常工作。 我尝试访问的数据库BULK INSERT不是可用性组的一部分,因此只有MSSQL1节点才有意义。文件服务器在NAS2节点上处于活动状态。检查文件服务器上的事件日志确实表明它仍然遇到此问题,并且SQL Server尝试以匿名用户身份验证文件服务器,而不是模拟我的用户帐户。 有人知道出什么事了吗?还是为了使这些指南过时而在SQL Server 2016中进行了某些更改? 文件服务器安全事件日志条目 服务帐户委托 服务帐户SPN SQL …

1
如何强制在一个查询中仅对一次标量UDF求值?
我有一个查询,需要根据标量UDF的结果进行过滤。该查询必须作为单个语句发送(因此我不能将UDF结果分配给局部变量),并且不能使用TVF。我知道由标量UDF引起的性能问题,其中包括强制整个计划以串行方式运行,过多的内存授予,基数估计问题以及缺少内联。对于这个问题,请假设我需要使用标量UDF。 UDF本身的调用成本非常高,但是从理论上讲,查询可以由优化器以合理的方式实现,使得函数只需要计算一次即可。我为这个问题模拟了一个大大简化的例子。以下查询需要6152毫秒才能在我的计算机上执行: SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); 查询计划中的过滤器运算符建议针对每行对该函数进行一次评估: DDL和数据准备: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE (VAL VARCHAR(5)); -- make the function expensive to call INSERT INTO @tbl SELECT [VALUE] FROM STRING_SPLIT(REPLICATE(CAST('Z ' AS VARCHAR(MAX)), 20000), ' '); RETURN 1; …

3
具有SQL Server 2016 Shard的多租户系统是否应该通过每个租户通过单独的数据库进行租户隔离?
给定用例: 租户数据不应串扰,一个租户不需要另一租户的数据。 每个租户都可能具有较大的历史数据量。 SQL Server托管在AWS EC2实例中。 每个租户在地理位置上都相距遥远。 有意使用第三方可视化工具,例如PowerBI Embedded 预计数据量会随着时间增长 系统的成本受到限制。 没有24/7生产DBA,解决方案必须可维护 解决方案应该能够水平缩放。 租户总数少于50 推荐的体系结构是什么,此用例是否有参考实现?我相信许多人可能已经在企业软件开发中遇到了这个问题。 我认为这与处理多租户数据库体系结构中越来越多的租户不同。在该问题中提到的用例处理的租户数量更多,这与只有极少数(50)的大租户不同。提到的体系结构可能是这里的解决方案,这是我想进一步了解的。

4
驱动器与安装点?
以前的高级DBA在整个公司的每个SQL Server中为我们所有驱动器设置了安装点。新的高级DBA 感到震惊,因为他们想更改我们的标准(主要是我认为,因为他没有使用这些标准的经验)。 基于大量Internet搜索的结果,我找不到任何不使用装载点的原因(SQL Server 2000之后)。 有人知道Windows OS与此主题有关的限制吗? 我最近听到很多关于“操作系统无法识别挂载点”的说法。(不正确,基于我对我们使用的Windows Server版本的研究)。 是否有任何基于证据或经验的原因不将装载点用于SQL Server? 假设用完驱动器号对我们来说不是问题。 据我了解,挂载点对于隔离工作负载非常有用。 任何人都可以确认或驳斥我的理解,即挂载点实际上比每个数据文件,日志文件和tempdb一个驱动器更有效地隔离/隔离不同类型的数据和日志文件(系统数据库文件,用户数据库文件,tempDB)的工作负载?


3
在“创建唯一索引”的“ WHERE”子句中使用“ LEN”函数
我有这张桌子: CREATE TABLE Table01 (column01 nvarchar(100)); 我想在条件为LEN(column01)> = 5的情况下在column01上创建唯一索引 我试过了: CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5; 我有: 表'Table01'上筛选索引'UIX_01'的WHERE子句不正确。 和: ALTER TABLE Table01 ADD column01_length AS (LEN(column01)); CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5; 产生: 无法在表“ Table01”上创建过滤索引“ UIX_01”,因为过滤表达式中的“ column01_length”列是计算列。重写过滤器表达式,使其不包括此列。

2
与有条件的INSERT和SELECT相比,与OUTPUT进行MERGE更好吗?
我们经常遇到“如果不存在,请插入”的情况。丹·古兹曼(Dan Guzman)的博客对如何使此过程具有线程安全性进行了出色的研究。 我有一个基本表,可以简单地将一个字符串分类为一个整数SEQUENCE。在存储过程中,我需要获取该值的整数键(如果存在),或者INSERT获取它的值。dbo.NameLookup.ItemName列上有唯一性约束,因此数据完整性不会受到威胁,但是我不想遇到异常。 这不是一个,IDENTITY所以我无法获得SCOPE_IDENTITY,NULL在某些情况下该值可能是。 在我的情况下,我只需要处理INSERT桌子上的安全性,因此我试图确定使用MERGE这种更好的做法: SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item ON f.ItemName= new_item.val WHEN MATCHED THEN UPDATE SET …

1
ROW_NUMBER()OVER(按B排序,按C排序)不使用(A,B,C)上的索引
考虑以下两个功能: ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C) ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) 据我了解,它们产生的结果完全相同。换句话说,在PARTITION BY子句中列出列的顺序无关紧要。 如果有索引,(A,B,C)我希望优化程序在两个变体中都使用此索引。 但是,令人惊讶的是,优化器决定在第二个变体中进行额外的显式排序。 我已经在SQL Server 2008 Standard和SQL Server 2014 Express上看到了它。 这是我用来复制它的完整脚本。 在Microsoft SQL Server 2014上尝试-12.0.2000.8(X64)2014年2月20日20:04:26版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation Express Edition(64位) 和Microsoft SQL Server 2014(SP1-CU7)(KB3162659)-12.0.4459.0(X64)2016年5月27日15:33:17版权所有(c)Windows NT 6.1(内部版本7601)上的Microsoft Corporation Express Edition(64位):服务包1) …

1
带有SQL Server的多个PVSCSI
关于SQL Server虚拟化,一直在尝试查找有关将数据设备从日志设备分离到不同的准虚拟SCSI(PVSCSI)适配器方面是否对性能产生正面影响的信息,类似于此处所做的。 在客户端上有一种方案,其中添加了附加的PVSCSI,并且日志设备与新的PVSCSI分离,从而显示出可观的性能提升。然而,仍然怀疑是由于这种分离还是仅由于现在存在附加的PVSCSI而引起的。 众所周知,日志磁盘通常以顺序方式写入,而数据磁盘的读/写遵循更随机的模式,将这两种不同类型的文件放在单独的磁盘上会带来性能上的好处。 但是控制器呢?将这些不同的模式保存在单独的PVSCSI控制器中是否也有好处? 有人对此有见识吗? 提前致谢

5
如何隐藏/禁用表而不删除表以检查冗余?
我必须维护和扩展一个旧的旧系统,其中包含不再使用的Web服务方法和数据库表。由于我不能完全确定这些表是否确实是多余的,因此恐怕会删除它们。 还有其他方法可以达到相同的效果(不能再使用表)而不删除它们吗?我的想法是将它们Deleted从当前的默认设置转移到其他模式(例如)dbo。 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; 架构方法是否还有其他选择或有任何缺点?

4
使用SQL Server FILESTREAM时保持(部分)备份较小
我有一个数据库,其中有近1TB的FILESTREAM数据不需要备份(如果删除了该数据,则会在几个小时内自动重新创建,因此并不重要)。大多数数据每两天更改一次,因此差异备份并不能真正帮助减小容量。 我有工作,我需要通过恢复模式设置的方式备份Full,创建一个单独FILEGROUP的FILESTREAM,然后取的只有“主”的备份FILEGROUP。造成的问题是日志文件(也已备份)现在不必要地很大,因为它包含FILESTREAM数据。 SIMPLE恢复模式使我无法执行特定FILEGROUPs的备份,因此我也不认为这是一个选择。 我的想法只是将FILESTREAM数据移到一个单独的数据库中,但是现在我失去了参照完整性,并且肯定还会继承许多其他问题。 有什么方法可以在Simple恢复模式下创建部分备份(无需将FILESTREAM表设置为只读)?如果没有,我的问题是否还有其他合理的解决方案?

1
SQL Server在哪里将表的IDENTITY VALUE物理存储在哪里?
我希望有人可以指出我在这个方向上的正确方向。到目前为止,这是我的工作。 SELECT * FROM sys.identity_columns是一个提供“ last_value”的系统视图,但是该视图的定义使用了内部函数IdentityProperty(colName, 'LastValue')-因此是死胡同(不是从系统表中拉出它)。 互联网上的任何地方(我看过的地方)都建议使用DBCC IDENT_...命令来发现该值,但这仍然使我不清楚其实际存储位置。 因此,我开始DBCC PAGE(TestDB,1,1325,3)针对测试工具数据库搜索单个页面,并使用RESEED命令在值10和12之间重新设定种子。 在执行此操作时,我注意到上的十六进制值IAM: Header,IAM: Single Page Allocations并且IAM: Extent Alloc Status Slot 1所有值都已更改。(并且意识到它们无论如何都会随着bUse1值的变化而定期变化,而bUse1值本身也会逐渐变化)。 所以另一个死胡同,我全都没主意了。我还能在哪里搜索? 我正在运行SQL Server2014。我对内部知识有无限的渴望,并且还没有遇到像这样难以捉摸的东西。它引起了我的注意,因为从理论上讲,它(一个绝对值)存储在某个位置,并且应该(可以说)是可定位的。在我探索内部存储的数据/元数据的位置时,这个特殊的值使我感到难以捉摸。我猜测/希望有人会来告诉我,您可以接受,DBCC PAGE但我找错了地方。

1
我可以提高膨胀系统表的性能吗?
背景: 我有大量的数据库,其中包含大量的VIEW和大量的SYNONYM。例如,一个分贝具有超过10k的VIEW和2+百万个SYNONYM。 一般问题: 涉及sys.objects(通常是系统表)的查询往往很慢。涉及sys.synonyms的查询是冰河。我想知道如何才能提高性能。 具体示例 此命令由第三方工具运行。在应用程序和SSMS中速度都很慢: exec sp_tables_rowset;2 NULL,NULL 我的问题: 如何使运行速度更快? 我尝试过的内容: 如果SET STATISTICS IO ON我得到以下输出: (受影响的2201538行)表'sysobjrdb'。扫描计数1,逻辑读28,物理读0,预读0,lob逻辑读0,lob物理读0,lob 预读0。表'sysschobjs'。扫描计数1,逻辑读53926,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。 我已经能够更新基础系统表上的统计信息。这已在我的SQL 2008 R2或更高版本的环境中起作用: UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN 我还能够执行索引维护。这适用于我的SQL 2012或更高版本的环境。例如,运行sp_help 'sys.sysschobjs'标识了表上的索引,然后从那里创建并运行以下命令: ALTER INDEX clst ON sys.sysschobjs REORGANIZE ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE ALTER INDEX nc2 ON …


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.