数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

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”列是计算列。重写过滤器表达式,使其不包括此列。


1
事务ID换行后,如何比较xmin和txid_current()?
除其常规列外,Postgres表还具有各种可用的系统列。其中一个xmin存储用于创建行的事务ID。它的数据类型是xid,一个四字节整数,在某个点回绕(即不一定唯一)。该函数txid_current()依次返回当前事务ID,但返回as bigint,因为它“用“ epoch”计数器扩展,因此在安装期间不会回绕”(引用手册)。 如果尚未发生事务折回,则两个值似乎匹配: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) 但是我想知道:这两个值是否总是可比的?据我了解,txid_current()在交易ID换行后(最多2 ^ 32个交易),将继续提供唯一的值,并且xmin将从零开始。这意味着两者都开始在那个时候返回不同的值? 如果是这样,是否有一种方法可以提取结果的常规xid值txid_current(),使其与xmin表中的条目匹配(例如,转换txid_current()为整数)? 编辑:更加清楚地表明,我关心在事务ID换行之后会发生什么,这很可能在2 ^ 32个事务之前发生。感谢DanielVérité在评论中指出这一点。

1
postgres_fdw性能慢
以下针对外部对象的查询大约需要5秒钟才能在320万行上执行: SELECT x."IncidentTypeCode", COUNT(x."IncidentTypeCode") FROM "IntterraNearRealTimeUnitReflexes300sForeign" x WHERE x."IncidentDateTime" >= '05/01/2016' GROUP BY x."IncidentTypeCode" ORDER BY 1; 当我在普通表上执行相同的查询时,它将在0.6秒内返回。执行计划完全不同: 普通表 Sort (cost=226861.20..226861.21 rows=4 width=4) (actual time=646.447..646.448 rows=7 loops=1) Sort Key: "IncidentTypeCode" Sort Method: quicksort Memory: 25kB -> HashAggregate (cost=226861.12..226861.16 rows=4 width=4) (actual time=646.433..646.434 rows=7 loops=1) Group Key: "IncidentTypeCode" -> Bitmap Heap …


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; 架构方法是否还有其他选择或有任何缺点?

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.