Questions tagged «sql-server»

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

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%。对于相同的负载,我进行了并排比较。

1
SHRINKFILE失败-为什么增加文件大小可以解决?
我正在运行一些SHRINKFILE操作来清理文件组中的一堆微小的不必要文件。对于其中一种收缩,以下命令将导致错误: DBCC SHRINKFILE (N'myfile' , EMPTYFILE)' 无法缩小数据库ID x的文件ID x,因为它正在被另一个进程缩小或为空 它不是空的也不是收缩的。它正在除我以外的任何人当前未使用的数据库上运行。自动收缩功能未启用,也从未启用过。但是,如果真的很重要,在我开始使用该数据库之前,会定期对其进行手动收缩。 在SQLServerCentral上,十年前的一个线程建议在文件中添加一些MB,因为“重新设置内部计数器或开关会告诉它现在不在收缩中”。 这很有效-很棒。但是,谁能更详细地说明SQL Server内部的工作原理/原因?

5
如何通过SSMS拒绝对SQL Server的某些登录访问,但如何通过.Net SqlClient数据提供程序访问
在这种情况下,开发人员没有任何UPDATE权限,但是他们使用应用程序并看到连接字符串->他们知道一些SQLLogin1具有UPDATE权限的SQL帐户(示例)中的密码。目前,我们的操作还不够完善,有时还需要修改生产数据(目前还没有GUI)。 与其联系DBA并要求他修改数据,开发人员将(不当地)使用SQL帐户SQLLogin1(具有修改数据的权限),并通过SQL Server Management Studio连接以自己修改数据。 DBA无法更改密码,SQLLogin1除非开发人员看到新的连接字符串和新密码,因为使用的应用程序连接字符串SQLLogin1由开发人员维护。 题: 有一种方法可以拒绝对SQLLogin1SQL登录名的访问,但仅当它通过SSMS连接时才可以? 同时,如果SQLLogin1通过.Net SqlClient Data Provider(program_name中的sys.dm_exec_sessions)连接,则必须允许其登录。 这样,我们不想让Developer使用来通过SSMS进行连接SQLLogin1,而使用的应用程序SQLLogin1仍然可以进行连接。

3
筛选条件未正确应用于“群集列存储”索引
使用下面的示例,谓词是相同的,但是top语句(正确)返回0行,bottom语句返回1-即使谓词不匹配: declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ' declare @tableId int = null declare @total decimal(10, 2) = 5.17 SELECT 1 FROM [dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All])) WHERE Barcode = @barcode AND StatusID = 1 AND TableID = @tableID AND @total <= Total SELECT 1 FROM [dbo].[transaction] WHERE Barcode = @barcode AND StatusID = 1 AND …

4
在此SQL语句中使用双重内部联接的原因是什么?
我正在看这个旧的SQL查询。我无法得到的一点是为什么它在同一列上两次内部连接同一表。我说的是Table1和Table1,别名为“ Table1Alias”, SELECT DISTINCT othercolumns, Table1Alias.columna FROM maintable INNER JOIN secondarytable ON maintable.id1 = secondarytable.a_id1 INNER JOIN table1 ON secondarytable.id2 = table1.id3 INNER JOIN table1 Table1Alias ON secondarytable.id2 = Table1Alias.id3 INNER JOIN thirdtable ON table1.id4 = thirdtable.id5 INNER JOIN fourthtable ON thirdtable.id6 = fourthtable.id7 INNER JOIN fivetable ON thirdtable.id8 = …
10 sql-server 

1
什么规则确定何时SQL Server使用CTE作为“优化围栏”?
不久前,Brent Ozar发表了一篇文章,详细介绍了SQL Server和PostgreSQL之间的一些区别: SQL Server与PostgreSQL之间的两个重要区别 第一点(“ CTE是优化栅栏”)引起了我的注意,因为很明显,在所提供的示例中,SQL Server将CTE和主查询组合在一起,并将其优化为单个查询(与之相反的行为是, PostgreSQL)。 但是,此行为似乎与我在其他博客和培训课程中看到的示例相反,在这些示例中,SQL Server确实将CTE视为优化围栏,从而可以更好地使用索引,提高性能等。例如: 选择星号的更好方法 因此,似乎SQL Server有时会“荣誉” CTE作为优化的围栏。是否有可用的良好资源来记录已知情况的特定列表,在这些情况下,SQL Server将可靠地认可CTE作为优化范围(或相反的行为)?

2
为什么这样更快并且使用安全吗?(第一个字母在字母表中)
长话短说,我们正在用很小的人表中的值更新小的人表。在最近的测试中,此更新大约需要5分钟才能运行。 我们偶然发现了似乎最简单的优化方法,该方法似乎完美无缺!现在,同一查询可以在不到2分钟的时间内运行,并且可以完美地产生相同的结果。 这是查询。最后一行添加为“优化”。为什么查询时间急剧减少?我们错过了什么吗?这会在将来引发问题吗? UPDATE smallTbl SET smallTbl.importantValue = largeTbl.importantValue FROM smallTableOfPeople smallTbl JOIN largeTableOfPeople largeTbl ON largeTbl.birth_date = smallTbl.birthDate AND DIFFERENCE(TRIM(smallTbl.last_name),TRIM(largeTbl.last_name)) = 4 AND DIFFERENCE(TRIM(smallTbl.first_name),TRIM(largeTbl.first_name)) = 4 WHERE smallTbl.importantValue IS NULL -- The following line is "the optimization" AND LEFT(TRIM(largeTbl.last_name), 1) IN ('a','à','á','b','c','d','e','è','é','f','g','h','i','j','k','l','m','n','o','ô','ö','p','q','r','s','t','u','ü','v','w','x','y','z','æ','ä','ø','å') 技术说明:我们知道要测试的字母列表可能还需要几个字母。我们还意识到使用“ DIFFERENCE”时明显的错误余量。 查询计划(常规): https : //www.brentozar.com/pastetheplan/? id …

3
由于varchar(max),将溢出溢出排序到tempdb
在具有32GB的服务器上,我们正在运行SQL Server 2014 SP2,最大内存为25GB,我们有两个表,在这里您可以找到两个表的简化结构: CREATE TABLE [dbo].[Settings]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceId] [int] NULL, [typeID] [int] NULL, [remark] [varchar](max) NULL, CONSTRAINT [PK_Settings] PRIMARY KEY CLUSTERED ([id] ASC) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Resources]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceUID] [int] NULL, CONSTRAINT [PK_Resources] PRIMARY KEY CLUSTERED ([id] ASC) …

2
大量添加逗号的最佳方法
我已经开始了一项新工作,其中涉及查看一大堆数字。是否有一种简单的方法可以将逗号添加到int或decimal字段以使其可读? 例如,SQL Server输出左侧的列,但出于我的理智,我需要使其看起来像右侧的列: 2036150 -> 2,036,150 ...或者我不得不写一些令人发指的东西 left(right(vandalized_data),6),3) + ',' + right(left(vandalized_data),6),3) 功能? 完美的做法是在显示网格中添加逗号,然后在输出中添加纯整数。

1
EXCEPT运算符背后的算法是什么?
在SQL Server的幕后,Except运算符如何工作的内部算法是什么?是否在内部对每行进行哈希处理并进行比较? David Lozinksi进行了一项研究,即SQL:在尚不存在的新记录中插入新记录的最快方法。与下面的结果紧密相关。 假设:我认为Left join最快,因为它只比较1列,而Except花费的时间最长,因为它必须比较All列。 有了这些结果,现在我们的思维是“除了自动且内部对每一行进行哈希处理?”。我看了看执行计划,它确实利用了一些哈希。 背景:我们的团队正在比较两个堆表。表A将不在表B中的行插入到表B中。 堆表(来自旧文本文件系统)没有主键/向导/标识符。一些表具有重复的行,因此我们找到了每一行的哈希,并删除了重复项,并创建了主键标识符。 1)首先,我们运行一个except语句,排除(hash列) select * from TableA Except Select * from TableB, 2)然后我们在HashRowId的两个表之间进行左联接比较 select * FROM dbo.TableA A left join dbo.TableB B on A.RowHash = B.RowHash where B.Hash is null 令人惊讶的是,例外声明插入是最快的。 结果实际上与David Lozinksi的测试结果很接近

1
尽管没有任何行受到影响,但触发触发
这更像是一个普遍的问题,但是这个问题的动机是我在使用SQL Server时遇到的一个问题。 我将此触发器附加到表上的Insert事件中,该事件包含一些逻辑,作为副作用,如果没有插入行,它将引发错误。经过进一步调查,我发现尽管没有插入行,但触发器仍在触发。 在DML触发器上的Microsoft文档中使用的语言似乎与以下行为矛盾: DML触发器是一种特殊的存储过程,当发生DML事件而该事件会影响触发器中定义的表或视图时,它会自动生效。 这是DBMS的默认行为吗?没有行受到影响时,是否有特定的原因触发触发器?

1
为什么不能使用sys.query_store_plan加入消除功能?
以下是查询存储遇到的性能问题的简化: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; 该plan_id列被记录为的主键sys.query_store_plan,但是执行计划未按预期使用联接消除: 没有从DMV投影任何属性。 DMV主键plan_id不能复制临时表中的行 使用A LEFT JOIN,因此无法T消除中的任何行。 执行计划 为什么会这样?在这里如何做才能消除连接?

2
根据更改日志计算库存数量
假设您具有以下表结构: LogId | ProductId | FromPositionId | ToPositionId | Date | Quantity ----------------------------------------------------------------------------------- 1 | 123 | 0 | 10002 | 2018-01-01 08:10:22 | 5 2 | 123 | 0 | 10003 | 2018-01-03 15:15:10 | 9 3 | 123 | 10002 | 10004 | 2018-01-07 21:08:56 | 3 4 …

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.