数据库管理员

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

1
在JOIN子句中使用OR时奇怪的查询计划-持续扫描表中的每一行
我正在尝试生成一个示例查询计划,以说明为什么对两个结果集进行UNIONing可能比在JOIN子句中使用OR更好。我写的查询计划让我感到困惑。我将StackOverflow数据库与Users.Reputation上的非聚集索引一起使用。 查询是 CREATE NONCLUSTERED INDEX IX_NC_REPUTATION ON dbo.USERS(Reputation) SELECT DISTINCT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId OR Users.Id = Posts.LastEditorUserId WHERE Users.Reputation = 5 查询计划位于https://www.brentozar.com/pastetheplan/?id=BkpZU1MZE,对我来说查询时间为4:37分钟,返回了26612行。 我以前从未见过从现有表中创建过这种恒定扫描的样式-我不熟悉为什么在用户输入的单行通常使用恒定扫描的情况下,每行都要进行恒定扫描的原因例如SELECT GETDATE()。为什么在这里使用它?在阅读此查询计划时,我将非常感谢一些指导。 如果我将该OR拆分为一个UNION,它将生成一个标准计划,该计划在12秒内运行,并返回相同的26612行。 SELECT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId WHERE Users.Reputation = 5 UNION SELECT Users.Id …


1
从运行在本地服务帐户上的SQL Server运行域用户拥有的SSIS包
我想运行一个包含传输SQL Server对象任务的SSIS包。涉及的服务器在同一域中,但是SQL Server服务在本地服务帐户上运行。因此环境如下所示: 域 服务器1 在本地帐户上运行的SQL Server 在文件系统上:SSIS包 在SQL Server代理中:作业 服务器2 在本地帐户上运行的SQL Server 为了能够登录到两台服务器,我创建了一个域帐户用作服务帐户。当我使用该域帐户登录到Server 1,然后从文件系统执行该程序包时,每个步骤都会成功。但是,当我尝试将作业添加到SQL Server时,遇到以下问题之一: 情况1.职位所有者:本地帐户;运行SSIS步骤作为域帐户的代理。当我将作业所有者设置为本地帐户,但将作业作为域帐户的代理运行时,作业本身将成功执行,但是程序包会抛出如下错误 执行失败,出现以下错误:“目录'LocalApplicationData'不存在。”。 可以通过在服务器1上为域用户创建具有管理员权限的登录名来解决此错误,但这显然不是理想的解决方案。将帐户添加到SQL Server代理/ DTS组之一也不起作用。 情况2.作业所有者:域帐户;运行SSIS步骤作为域帐户的代理。当我同时为该域帐户设置作业所有者和“以用户身份运行”时,该作业将完全无法启动,并出现以下错误: 无法确定作业的所有者(域\域用户)Job name是否具有服务器访问权限(原因:无法获取有关Windows NT组/用户“域\域用户”的信息,错误代码0x5。[SQLSTATE 42000](错误15404)) 。 我相信最后一个错误是因为SQL Server在本地帐户上运行,并且therfor无法查看哪些权限域帐户具有该权限。 什么是使作业正常运行的正确方法?情况2对我来说比较干净,但是似乎不可能,因为SQL Server在本地帐户上运行。情况1也可以,但是不会在我的SQL Server上授予域用户管理权限。 更新: @JonSeigel和@Brownstone先生: 这似乎是问题的原因是由于缺少权限。但是,该错误是关于不存在的“ LocalApplicationData”-为每个帐户生成的文件夹之一。我已经使用运行包的凭据登录了服务器(从而创建了配置文件目录),并尝试了配置文件目录的几种权限组合。即使手动授予该特定目录上的几乎所有权限,我也会遇到上述错误。 在进行更多研究时,我遇到了一个论坛线程,网址为http://www.sqlservercentral.com/Forums/Topic391332-148-1.aspx#bm391441,这非常相似-尽管也没有解决方案。
10 sql-server  ssis 



2
文档中sys.dm_exec_query_stats警告的实际影响是什么?
该文档的sys.dm_exec_query_stats状态如下: 如果服务器上当前正在执行工作负载,则对sys.dm_exec_query_stats的初始查询可能会产生不准确的结果。可以通过重新运行查询来确定更准确的结果。 我有时会在活动工作负载期间查询该DMV,并且希望获得准确的结果。我不知道如何在实践中应用上述警告。我应该总是查询DMV两次并使用第二个结果集,因为这样会更准确吗?这感觉有些牵强。我是否需要了解DMV可能不准确的方式,以便将其纳入分析?如果是这样,会出现什么样的错误:缺失的行,过时的值,不一致的行或其他? sys.dm_exec_query_stats在活动工作负载期间使用的最佳做法是什么?
10 sql-server  dmv 

2
将我的sa用户锁定
因此,我试图在Microsoft SQL Server Management Studio 2019中更改一些设置。我将登录模式从混合(Windows和SQL身份验证)更改为仅Windows,现在我无法使用sa帐户登录,但我无法有另一个具有管理员权限的帐户。 我该怎么办?任何建议将不胜感激。

1
为SQL Server中的所有连接设置ARITHABORT ON的后果是什么?
因此,我确定SQL Server的行为不稳定是由于.Net SqlClient数据提供程序的默认设置为SET ARITHABORT OFF。话虽如此,我已经阅读了各种文章,讨论了实现此目标的最佳方法。对我来说,我只想采用一种简单的方法,因为SQL Server遭受了麻烦,而且我的查询调优还没有完全跨应用程序(显然,SET在sp中添加不能正常工作)。 在Erland Sommarskog 关于该主题的精彩文章中,他基本上建议通过更改要SET ARITHABORT ON为连接发布的应用程序来采用安全的方法。但是,在dba.stackexchange 问题的此答案中,Solomon Rutzky 提供了实例范围和数据库范围的方法。 在此设置整个实例范围时,我在这里缺少什么后果?正如我所看到的...由于SSMS ON默认情况下已设置了此设置,所以我认为在ON所有服务器范围内都设置此服务器范围没有什么害处。归根结底,我只需要此SQL Server才能执行最重要的任务。

1
生成名称列的排列和组合
我有以下示例数据用于排列和组合。 create table tbltest ( name varchar(50), addres varchar(100) ); insert into tbltest values('Sam Mak John','Street 1 HNo 101 USA'); insert into tbltest values('Donatella Nobatti','HNo 101 UK'); insert into tbltest values('Sam Buca','Main Road B Block UAE'); insert into tbltest values('Juan Soponatime','Hight Street CA'); insert into tbltest values('Aaron Spacemuseum','HNo A10 100 …

5
SQL在分区上计数不同
我有一个包含两列的表,我想计算Col_B上的不同值(以Col_A为条件)。 MyTable Col_A | Col_B A | 1 A | 1 A | 2 A | 2 A | 2 A | 3 b | 4 b | 4 b | 5 预期结果 Col_A | Col_B | Result A | 1 | 3 A | 1 | 3 A | …

5
在SQL Server的同一列上使用多个外键
SQL Server允许我在列上创建多个外键,并且每次使用不同的名称时,我都可以创建另一个引用同一对象的键。基本上所有键都定义相同的关系。我想知道在同一列中定义多个外键并引用另一个表中的同一列的用途。SQL Server允许我们做这样的事情有什么好处?

3
将标量函数转换为TVF函数以并行执行-仍在串行模式下运行
发布后,我的一个查询正在串行执行模式下运行,我注意到在视图中使用了两个新功能,该视图在从应用程序生成的LINQ to SQL Query中引用。因此,我将那些SCALAR函数转换为TVF函数,但查询仍在串行模式下运行。 早些时候,我在其他一些查询中将标量转换为TVF,它解决了强制串行执行的问题。 这是标量函数: CREATE FUNCTION [dbo].[FindEventReviewDueDate] ( @EventNumber VARCHAR(20), @EventID VARCHAR(25), @EventIDDate BIT ) RETURNS DateTime AS BEGIN DECLARE @CurrentEventStatus VARCHAR(20) DECLARE @EventDateTime DateTime DECLARE @ReviewDueDate DateTime SELECT @CurrentEventStatus = (SELECT cis.EventStatus FROM CurrentEventStatus cis INNER JOIN Event1 r WITH (NOLOCK) ON (cis.Event1Id = r.Id) WHERE (r.EventNumber …

1
浮点数的不确定性和
让我指出一个明显的拳头:我完全理解浮点类型不能准确表示十进制值。这不是这个!但是,浮点计算应该是确定性的。 既然已经解决了,让我向您展示我今天观察到的奇怪案例。我有一个浮点值列表,我想总结一下: CREATE TABLE #someFloats (val float); INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5); SELECT STR(SUM(#someFloats.val), 30, 15) FROM #someFloats; DROP TABLE #someFloats; -- yields: -- 13.600000000000001 到目前为止,一切都很好-这里不足为奇。我们都知道1.2不能完全用二进制表示形式,因此期望“不精确”的结果。 现在,当我左联接另一个表时,会发生以下奇怪的事情: CREATE TABLE #A (a int); INSERT INTO #A (a) VALUES (1), (2); CREATE TABLE #someFloats (val …

2
使用WSRM限制最大CPU使用率SQL SERVER
我有一台运行SQL Server实例的物理服务器。 我注意到该服务器通常以100%的CPU使用率运行。 我的IT团队对此并不满意,建议我们为操作系统保留32个内核中的2个。 效果很好,现在最大使用量峰值接近90%。此外,不再报告从各个用户进行缓慢的数据检索。 是否有任何理由不以这种方式使用WSRM(Windows系统资源管理器),而不是使用SQL资源调控器?

1
来自系统健康状况扩展事件的错误流程利用?
我最近一直在努力了解存储在系统健康状况扩展事件事件文件中的数据或度量。 我们正在尝试使用此处提供的系统健康状况来实施性能指标的数据收集 有报告提供了从名为“系统运行状况”的事件中收集的指标,如CPU利用率,其他进程利用率等。 scheduler_monitor_system_health_ring_buffer_recorded 对于少数繁忙的服务器,我无法理解为什么报告中列为“ SQL CPU利用率”的字段“ process_utilization”大部分时间都高于100。在高峰时间,它在120-160之间变化,因此该报告是始终显示CPU高于100,即使我从服务器活动监视器中检查也是如此。 我已经在Github中提出了这个问题,但似乎没有解决方法或没有回应。 因此,我的问题是 如何使用记录的系统运行状况环形缓冲区获取服务器的SQL CPU利用率的准确数字? 报告还显示了根据其报告计算出的以下2个字段的计数器 100-System_idle-process_utilization和OtherProcessUtil 100-system_idle作为SystemUtil 这些OtherProcessUtil和SystemUtil需要/有什么帮助? 我还看到每次每次的内存利用率始终显示为100。这似乎也不正确。有人注意到吗? 其他工具(例如Idera和sentry)(我测试过)没有显示相同服务器的CPU使用率超过100%。对于相同的负载,我进行了并排比较。

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.