Questions tagged «sql-server»

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

2
LIKE运算符的基数估计(局部变量)
我给人的印象是,LIKE在对未知场景进行所有优化时都使用运算符时,旧的和​​新的CE都使用9%的估计值(假设相关统计数据可用并且查询优化器不必求助于选择性猜测)。 当对信用数据库执行以下查询时,在不同的CE下我得到了不同的估计。在新的CE下,我收到了900行的估计值,而在旧的CE下,我收到了241.416的估计值,我不知道如何得出此估计值。有人能说清楚吗? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName OPTION ( QUERYTRACEON 9481, QUERYTRACEON 9292, QUERYTRACEON 9204, QUERYTRACEON …

2
最大用户连接数
在SQL Server 2012 Standard Edition中,我知道用户连接的最大数量为32,767。如果我朝着这个数字前进,我应该怎么做? 当前有30,000个用户连接,并且这个数字有望增加。

6
我可以依靠顺序读取SQL Server身份值吗?
TL; DR:下面的问题归结为:插入行时,在生成新Identity值和锁定聚集索引中的相应行键之间是否存在机会之窗,外部观察者可以看到更新的值 Identity并发交易插入的价值?(在SQL Server中。) 详细版本 我有一个带有Identity名为的列的SQL Server表CheckpointSequence,这是表的聚集索引(也具有许多其他非聚集索引)的键。通过多个并发进程和线程将行插入表中(处于隔离级别READ COMMITTED,并且没有IDENTITY_INSERT)。同时,有些进程会定期从聚簇索引中读取行,并按该CheckpointSequence列排序(也处于隔离级别READ COMMITTED,并且该READ COMMITTED SNAPSHOT选项处于关闭状态)。 我目前依靠这样的事实,即读取过程永远不会“跳过”检查点。我的问题是:我可以依靠这个财产吗?如果没有,我该怎么做才能实现? 示例:当插入具有标识值1、2、3、4和5 的行时,阅读器在看到具有值4的行之前必须看不到具有值5的行。测试表明该查询包含一个ORDER BY CheckpointSequence子句(和一个WHERE CheckpointSequence > -1子句),只要要读取第4行但尚未提交,就可靠地阻塞,即使第5行已经提交。 我认为至少从理论上讲,这里可能存在一种竞争条件,可能会导致这一假设被打破。不幸的是,关于多个并发事务的工作方式的文档Identity并没有太多说明Identity,而只是说“每个新值都是基于当前的种子和增量生成的”。和“特定交易的每个新值都与表上的其他并发交易不同”。(MSDN) 我的推理是,它必须以这种方式工作: 事务开始(显式或隐式)。 生成标识值(X)。 根据身份值在聚集索引上获取相应的行锁(除非发生锁升级,在这种情况下整个表都被锁定)。 该行已插入。 事务已提交(可能要花很多时间),因此将再次删除该锁。 我认为在第2步和第3步之间,有一个很小的窗口, 并发会话可以生成下一个标识值(X + 1)并执行所有其余步骤, 因此,允许阅读者恰好在该时间点阅读值X + 1,而忽略了X的值。 当然,这种可能性似乎很小。但仍然-可能会发生。可以吗 (如果您对上下文感兴趣:这是NEventStore的SQL Persistence Engine的实现。NEventStore实现一个仅附加事件存储,其中每个事件都获得一个新的,升序的检查点序列号。客户端从按检查点排序的事件存储中读取事件为了执行各种计算,一旦处理了带有检查点X的事件,客户就只考虑“较新的”事件,即带有检查点X + 1及更高版本的事件,因此,至关重要的是永远不能跳过事件,因为它们再也不会被考虑了,我目前正在尝试确定Identity基于-checkpoint的实现是否满足此要求。这些是所使用的确切SQL语句:Schema,Writer的query,读者查询。) 如果我是对的,并且可能出现上述情况,那么我只能看到两种处理方式,但都不令人满意: 在看到X之前看到检查点序列值X + 1时,关闭X + 1并稍后再试。但是,由于Identity当然会产生间隙(例如,当事务回滚时),因此X可能永远不会出现。 因此,相同的方法,但是在n毫秒后接受间隔。但是,我应该假定n的值是多少? 还有更好的主意吗?

9
使用T-SQL测试字符串是否是回文
我是T-SQL的初学者。我想确定输入字符串是否是回文,如果不是,则输出= 0,如果是,则输出= 1。我仍然在弄清楚语法。我什至没有收到错误消息。我正在寻找不同的解决方案和一些反馈,以更好地理解和了解T-SQL的工作原理,并且变得更好-我仍然是一名学生。 正如我所看到的,关键思想是将最左边和最右边的字符相互比较,检查是否相等,然后将左边的第二个字符与最后一个的第二个字符进行比较,依此类推。我们做一个循环:如果字符彼此相等,我们继续。如果到达末尾,则输出1;否则,输出0。 您能否批评一下: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , @StringLeftLength Int ) RETURNS Binary AS BEGIN SET @ n=1 SET @StringLength= Len(String) WHILE @StringLength - @n >1 IF Left(String,@n)=Right(String, @StringLength) SET @n =n+1 SET @StringLength =StringLength -1 RETURN @Binary …

5
两个日期列的SARGable WHERE子句
对于我来说,我有一个关于可保存性的有趣问题。在这种情况下,它是关于两个日期列之间的差异使用谓词。设置如下: USE [tempdb] SET NOCOUNT ON IF OBJECT_ID('tempdb..#sargme') IS NOT NULL BEGIN DROP TABLE #sargme END SELECT TOP 1000 IDENTITY (BIGINT, 1,1) AS ID, CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1], CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2] INTO #sargme FROM sys.[messages] AS [m] ALTER TABLE [#sargme] ADD …

4
为什么在每晚备份的简单恢复模式下事务日志会继续增长
在立即将其标记为重复之前,我已阅读Mike Walsh的“ 为什么事务日志保持增长或空间不足?,但我认为这无法解决我的情况。我浏览了十几个类似的问题,但相关的问题大多只是说“重复”并指出了麦克的问题。 详细信息:我在SQL Server 2008 R2上有一堆约500MB的数据库,全部处于简单恢复模式(不是我的选择),每晚进行完整备份,并具有约200MB的数据文件和约300MB的日志文件。日志不会立即增长到300MB,而是会在几个月后缓慢增长。至少根据sp_who2和活动监视器,它们中的任何一个都没有打开的事务。如果我右键单击数据库并选择属性,它会告诉我大约有50MB可用空间。特别是在备份之后,整个日志是否不应该免费?在简单模式下,只要没有未完成的事务,日志是否不应该免费? log_reuse_wait_descfrom sys.databases说“什么都没有”,根据上面提到的问题和答案,它说它不应该等待任何东西来重用空间。 如果我执行“ DBCC SHRINKFILE”,则日志文件会缩小到1MB,因此它愿意回收空间。我可以设置一些可以每周缩小日志并防止事情失控的事情,但是我对为什么SQL Server可以做到这一点感到困惑。 我可以理解是否有一些需要300MB记录的疯狂交易,但是我们没有做任何极端的事情,只是基本的OLTP。来自Mike的问题/答案: 简单恢复模型-通过上面的介绍,最简单的是首先讨论简单恢复模型。在此模型中,您要告诉SQL Server-可以使用事务日志文件进行崩溃和重新启动恢复(您确实没有选择。在这里查找ACID属性,应该很快就可以理解),但是一旦您没有,出于崩溃/重新启动恢复目的而不再需要它,请继续并重用日志文件。 SQL Server在简单恢复中侦听此请求,并且仅保留进行崩溃/重新启动恢复所需的信息。一旦SQL Server确定它可以恢复,因为数据已经被硬化到数据文件中(或多或少),则已硬化的数据将不再在日志中被使用,并被标记为截断-这意味着它将被重新使用。 它一直在说应该重新使用日志空间,但是随着几个月来的缓慢增长,似乎并没有。 我想念什么?是否可以阻止SQL Server将数据识别为“已强化”并释放日志? (编辑) 行动后报告-又一点知识是危险的 在发现这是一个“普遍的问题”之后,感觉就像我对7个月前发生的事情以及我所学到的希望为其他人节省一些悲痛的事情做了解释。 首先,当您查看数据库的属性时,在SSMS中看到的可用空间就是数据文件中的可用空间。您可以通过在数据库上运行以下命令来查看此文件,然后发现SSMS报告的可用空间是FileSizeMB与UsedSpaceMB之间的差异: SELECT DB.name, MF.physical_name, MF.type_desc AS FileType, MF.size * 8 / 1024 AS FileSizeMB, fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB, mf.name LogicalName FROM sys.master_files …

2
在SQL Server中,当在仅具有聚集索引的表上强制执行索引查找时,是否可以保证没有显式ORDER BY子句的订单?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 4年前。 更新2014-12-18 对于主要问题“否”的压倒性回答,更有趣的回答集中在第2部分,即如何用显式解决性能难题ORDER BY。尽管我已经标记了答案,但是如果有一个性能更好的解决方案,我也不会感到惊讶。 原版的 之所以出现这个问题,是因为我可以找到的解决特定问题的唯一极其快速的解决方案,只有在没有ORDER BY子句的情况下才能起作用。以下是产生问题所需的完整T-SQL,以及我提出的解决方案(如果有问题,我正在使用SQL Server 2008 R2。) --Create Orders table IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP TABLE #Orders CREATE TABLE #Orders ( OrderID INT NOT NULL IDENTITY(1,1) , CustID INT NOT NULL , StoreID INT NOT NULL , Amount FLOAT …
24 sql-server 

5
识别未使用的存储过程
明年,我正在帮助清理几个SQL Server环境。 我们大约有10,000个存储过程,并且估计只有大约1000个存储过程是定期使用的,而另外200个左右的存储过程很少使用,这意味着我们有很多工作要做。 由于我们有多个部门和团队可以访问这些数据库和过程,因此我们并不总是调用这些过程的人,这意味着我们必须确定正在调用的过程。最重要的是,我们希望在几个月而不是几天内确定这一点(这消除了一些可能性)。 一种解决方法是使用SQL Server Profiler和跟踪正在调用的程序,并将它们与我们拥有的程序列表进行比较,同时标记是否使用了这些程序。从那时起,我们可以将程序转移到其他模式,以防部门尖叫。 Profiler在这里使用最有效的方法吗?和/或你们有没有做过类似的事情并找到了另一种方法/更好的方法呢?



3
持久计算列上的索引需要键查找才能获取计算表达式中的列
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 6年前。 我在表上有一个持久的计算列,该表只是由串联的列组成,例如 CREATE TABLE dbo.T ( ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY, A VARCHAR(20) NOT NULL, B VARCHAR(20) NOT NULL, C VARCHAR(20) NOT NULL, D DATE NULL, E VARCHAR(20) NULL, Comp AS A + '-' + B + '-' …

3
为什么“ SELECT @@ IDENTITY”返回一个小数?
我正在使用Dapper从ASP.NET MVC 3(.NET 4.0)应用程序对SQL Server 2008 R2 Express实例执行以下查询。 INSERT INTO Customers ( Type, Name, Address, ContactName, ContactNumber, ContactEmail, Supplier) VALUES ( @Type, @Name, @Address, @ContactName, @ContactNumber, @ContactEmail, @Supplier) SELECT @@IDENTITY 的调用connection.Query<int>(sql, ...)引发了无效的强制转换异常。我已经调试了它,就在Dapper调用return GetValue的时候SqlDataReader。 返回类型GetValue为Object,在调试器中检查它的显示类型是装箱的十进制数。 如果将select更改为SELECT CAST(@@IDENTITY as int),则GetValue的返回是装箱的int,并且不会引发异常。 Id列绝对是int类型;为什么要SELECT @@IDENTITY返回小数? 一些其他信息: 该数据库是全新的。 客户表是我添加到其中的唯一对象。数据库中没有其他(用户)表,视图,触发器或存储过程。 数据库中有10行,Id为1,2,3,4,5,6,7,8,9,10(即,该列未超出int的限制)。 我的表定义是 CREATE TABLE [dbo].[Customers]( [Id] [int] …

1
执行计划显示了昂贵的CONVERT_IMPLICIT操作。我可以通过索引解决此问题,还是需要更改表?
我有一个非常重要,非常缓慢的观点,它的where子句中包含一些非常丑陋的条件。我也知道联接是粗联接和慢联接,varchar(13)而不是整数标识字段,但想改进下面使用此视图的简单查询: CREATE VIEW [dbo].[vwReallySlowView] AS AS SELECT I.booking_no_v32 AS bkno, I.trans_type_v41 AS trantype, B.Assigned_to_v61 AS Assignbk, B.order_date AS dateo, B.HourBooked AS HBooked, B.MinBooked AS MBooked, B.SecBooked AS SBooked, I.prep_on AS Pon, I.From_locn AS Flocn, I.Trans_to_locn AS TTlocn, (CASE I.prep_on WHEN 'Y' THEN I.PDate ELSE I.FirstDate END) AS PrDate, I.PTimeH AS …
24 sql-server  view 

1
语言和DATEFORMAT安全哪些日期/时间文字格式?
很容易证明,由于SET LANGUAGE,SET DATEFORMAT或登录名的默认语言,除了以下两种格式外,许多其他日期/时间格式都容易引起误解: yyyyMMdd -- unseparated, date only yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T 即使没有T的这种格式,也可能看起来像是有效的ISO 8601格式,但是它在几种语言中均失败: DECLARE @d varchar(32) = '2017-03-13 23:22:21.020'; SET LANGUAGE Deutsch; SELECT CONVERT(datetime, @d); SET LANGUAGE Français; SELECT CONVERT(datetime, @d); 结果: Die Spracheneinstellung wurde auf Deutschgeändert。 消息242,第16级,状态3国家 地图上的Eines varchar-Datentyps,日期从WereaußerhalbdesgültigenBereichs开始。 法语的最佳语言翻译。 消息242,级别16,状态3 转换日期类型为dénéesvalchar hors …

1
在生产环境中收缩Tempdb的最佳实践
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 5年前。 在SQL Server 2008中收缩Temporary db时,最佳做法是什么? 使用以下内容有风险吗? use tempdb GO DBCC FREEPROCCACHE -- clean cache DBCC DROPCLEANBUFFERS -- clean buffers DBCC FREESYSTEMCACHE ('ALL') -- clean system cache DBCC FREESESSIONCACHE -- clean session cache DBCC SHRINKDATABASE(tempdb, 10); -- shrink tempdb dbcc shrinkfile ('tempdev') -- shrink …

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.