Questions tagged «sql-server»

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

1
未使用的NONCLUSTERED INDEX仍然可以提高查询速度吗?
这是一种奇怪的情况,但我希望有人能回答。 在进行一些性能问题排查期间,我们按照的要求将NONCLUSTERED INDEX添加到了表中sp_BlitzIndex。第二天,我们检查了它的使用情况,结果显示0次读取(0次扫描/搜索,0次单例查找),因此我们将其禁用。 在第二分钟,我们收到了抱怨应用程序缓慢(性能问题)的投诉,这是我们在添加INDEX时首先尝试检查并解决的问题。 现在,从理论上讲,这听起来纯属巧合。可证明,可衡量的是,未使用 INDEX 。禁用它不会导致查询性能下降。但它几乎TOO巧合。 题 因此,我的问题就很简单了: 它是在所有可能的,一个非聚集索引,其使用提供的统计(从动态管理视图/ sp_BlitzIndex)显示NO使用,还是已经帮助受影响的表以某种方式查询性能?

1
如何使用COLUMNS_UPDATED检查某些列是否已更新?
我有42列的表格和一个触发器,当其中38列更新时,触发器应该做一些事情。因此,如果其余4列已更改,则需要跳过逻辑。 我可以使用UPDATE()函数并创建一个大IF条件,但更喜欢做一些简短的事情。使用COLUMNS_UPDATED,我可以检查某些列是否全部已更新? 例如,检查第3、5和9列是否已更新: IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; 因此,请20为column 3和的5值以及1为column的值,9因为它是在第二个字节的第一位中设置的。如果我将语句更改为OR它,则将检查列3和5或列9是否已更新? 如何OR在一个字节的上下文中应用逻辑?

4
查询以选择联接上的最大值
我有一个用户表: |Username|UserType|Points| |John |A |250 | |Mary |A |150 | |Anna |B |600 | 和级别 |UserType|MinPoints|Level | |A |100 |Bronze | |A |200 |Silver | |A |300 |Gold | |B |500 |Bronze | 我正在寻找一个查询来获取每个用户的级别。类似于以下内容: SELECT * FROM Users U INNER JOIN ( SELECT TOP 1 Level, U.UserName FROM Levels L …

3
我的用户属于哪个广告组登录?
我不确定是否为该问题选择了正确的标题。我真正要追求的是,​​给定单个Windows AD用户,我想找出有权访问此服务器中特定数据库的Windows AD组(登录)的列表。 当我运行以下查询时 select name, principal_id, type, type_desc, default_schema_name, create_date, modify_date, owning_principal_id, sid, is_fixed_role from sys.database_principals 在我的服务器上 Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)2011年6月17日00:54:03版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation标准版(64位) 我得到以下结果(部分列表): 我需要知道特定登录名的所有权限。此登录名可以通过AD组访问我的服务器/数据库。 1)从上面的列表中,我的登录名属于哪个广告组? 我一直在下面进行此操作,但是我真的很想找出该用户所属的AD组(根据上图可以访问此服务器的列表)的列表。 首先,我以相关用户身份执行 EXECUTE AS LOGIN='mycompany\HThorne' DECLARE @User VARCHAR(20) SELECT @USER = SUBSTRING(SUSER_SNAME(), CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME())) 我确保我拥有正确的凭据 …


1
为什么UPDLOCK导致SELECT挂起(锁定)?
我在SQL SERVER中有一个选择可以锁定整个表。 这是设置脚本(请确保您不覆盖任何内容) USE [master] GO IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB') DROP DATABASE LockingTestDB GO CREATE DATABASE LockingTestDB GO USE [LockingTestDB] GO IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable') DROP TABLE LockingTestTable GO CREATE TABLE LockingTestTable ( Id int IDENTITY(1, 1), Name …

1
当where子句对`value()`进行过滤时,为什么不使用二级选择索引?
设定: create table dbo.T ( ID int identity primary key, XMLDoc xml not null ); insert into dbo.T(XMLDoc) select ( select N.Number for xml path(''), type ) from ( select top(10000) row_number() over(order by (select null)) as Number from sys.columns as c1, sys.columns as c2 ) as N; 每行的样本XML: <Number>314</Number> …

1
如何解决RESOURCE_SEMAPHORE和RESOURCE_SEMAPHORE_QUERY_COMPILE等待类型
我们试图找出运行缓慢的sql服务器查询从以下配置之一托管的服务器(大小为300 GB)中命中/获取数据的根本原因: Windows Server 2003 R2,SP2,企业版,16 GB RAM,12 CPU 32位 SQL Server 2005 SP4企业版32位。 我们已经通知企业升级到64位需要一个多月的时间。 但是对于当前问题,如果可以解决内存压力或最终得出结论以增加RAM,则我们正在尝试收集数据。 完成的操作:重新索引和更新统计信息适用于此数据库。 如下图所示,我们已经注意到过去5天在加载时间内运行的信号量等待类型: 以下查询后很少有信息:缓冲区大小= 137272 SELECT SUM(virtual_memory_committed_kb) FROM sys.dm_os_memory_clerks WHERE type='MEMORYCLERK_SQLBUFFERPOOL' 和以下每个查询的信号量内存= 644024 SELECT SUM(total_memory_kb) FROM sys.dm_exec_query_resource_semaphores 以下是从dm_exec_query_resource_semaphores和sys.dm_exec_query_memory_grantsdvv 收集的更多信息 因此,从上面收集的信息和每个SP_Blitz数据来看,资源信号似乎是问题所在。 与可用的16 GB RAM相比,是否为资源信号ID分配的内存'target_memory_kb'太低。 注意*运行8小时的每次分析“ target_memory_kb”始终小于1 GB,而可用的16 GB是多少? 这里可能是什么问题以及如何解决,请提出建议 谢谢

1
SQL Server的优化器如何估计联接表中的行数?
我在AdventureWorks2012数据库中运行此查询: SELECT s.SalesOrderID, d.CarrierTrackingNumber, d.ProductID, d.OrderQty FROM Sales.SalesOrderHeader s JOIN Sales.SalesOrderDetail d ON s.SalesOrderID = d.SalesOrderID WHERE s.CustomerID = 11077 如果查看估算的执行计划,则会看到以下内容: 初始索引查找(右上)使用IX_SalesOrderHeader_CustomerID索引并在文字11077上进行搜索。其估计值为2.6192行。 如果使用DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM,则表明值11077在两个采样键11019和11091之间。 11019和11091之间的不同行的平均数为2.619718,或舍入为2.61972,这是为索引搜索显示的估计行的值。 我不了解的部分是针对SalesOrderDetail表的聚集索引查找的估计行数。 如果我运行DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID'): 因此,SalesOrderID(我要加入)的密度为3.178134E-05。这意味着1 / 3.178134E-05(31465)等于SalesOrderDetail表中唯一SalesOrderID值的数量。 如果在SalesOrderDetail中有31465个唯一的SalesOrderID,则分布均匀,每个SalesOrderID的平均行数为121317(总行数)除以31465。平均值为3.85561 因此,如果要循环遍历的估计行数是2.61972,并且要返回的平均值是3.85561,则我认为估计行数将是2.61972 * 3.85561 = 10.10062。 但是估计的行数是11.4867。 我认为我对第二个估算值的理解是不正确的,不同的数字似乎表明了这一点。我想念什么?

2
SQL Server索引更新死锁
我有2个查询,当同时运行时会导致死锁。 查询1-更新索引(index1)中包含的列: update table1 set column1 = value1 where id = @Id 在table1上获取X-Lock,然后在index1上尝试X-Lock。 查询2: select columnx, columny, etc from table1 where {some condition} 在index1上获取S-Lock,然后在table1上尝试S-Lock。 有没有办法在保持相同查询的同时防止死锁?例如,我是否可以在更新之前以某种方式对更新事务中的索引进行X锁定,以确保表和索引访问的顺序相同-这样可以防止死锁? 隔离级别为“已提交读”。已为索引启用行锁和页锁。同一条记录可能同时参与这两个查询-从死锁图中我看不出来,因为它没有显示参数。 死锁图

1
统计。多列直方图可能吗?
我正在考虑以下情况:我有两根高密度色谱柱,但这些色谱柱不是独立的。 定义 这是我出于测试目的而创建的表的定义。 CREATE TABLE [dbo].[StatsTest]( [col1] [int] NOT NULL, --can take values 1 and 2 only [col2] [int] NOT NULL, --can take integer values from 1 to 4 only [col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different [col4] AS ((10)*[col1]+[col2]) …

2
sys.allocation_units和sp_spaceused上的空间使用情况
众所周知的事实是DMV不能保存有关页数和行数的准确信息。但是,当您更新统计信息时,我看不到为什么他们不这样做。 我正在使用一个监视工具,想知道每个索引和数据的磁盘大小,等等。最终我想找到正确的填充因子,以及其他东西。 我的函数使用的空间和旧的sp_spaceused在空间使用上有所不同,但在记录数上却没有。 您能看到我选择的商品中缺少什么吗? 这是sp_spaceused(然后我将数字转换为MB): sp_spaceused 'tblBOrderRelationship' go select 318008/1024.00 AS reserved, 140208/1024.00 AS data, 177048/1024.00 AS index_size, 752/1024.00 AS unused 但是,当我在下面的\下面的图片中运行我的select,代码时,我得到的数字略有不同。 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT schema_name(t.schema_id) as SchemaName, t.NAME AS TableName, t.type_desc, t.is_ms_shipped, t.is_published, t.lob_data_space_id, t.filestream_data_space_id, t.is_replicated, t.has_replication_filter, t.is_merge_published, t.is_sync_tran_subscribed, --t.is_filetable, i.name as indexName, i.type_desc, i.is_unique, …

1
使用非聚集索引更新不同行时出现死锁
我正在解决一个死锁问题,但我发现在id字段上使用聚集索引和非聚集索引时,锁的行为有所不同。如果将聚集索引或主键应用于id字段,则似乎可以解决死锁问题。 我有不同的事务对一个不同的行进行一个或多个更新,例如事务A将仅更新ID = a的行,事务B将仅触摸ID = b的行,等等。 而且我知道没有索引,更新将获取所有行的更新锁,并在必要时隐式转换为排他锁,这最终将导致死锁。但是我无法找出为什么非聚集索引仍然存在死锁(尽管命中率似乎下降了) 数据表: CREATE TABLE [dbo].[user]( [id] [int] IDENTITY(1,1) NOT NULL, [userName] [nvarchar](255) NULL, [name] [nvarchar](255) NULL, [phone] [nvarchar](255) NULL, [password] [nvarchar](255) NULL, [ip] [nvarchar](30) NULL, [email] [nvarchar](255) NULL, [pubDate] [datetime] NULL, [todoOrder] [text] NULL ) 死锁跟踪 deadlock-list deadlock victim=process4152ca8 process-list process id=process4152ca8 taskpriority=0 logused=0 …

3
多语句事务中不允许使用ALTER DATABASE语句
我已经从此处下载了基于AdventureWorks的内存中示例,并遵循了随附文档中描述的所有步骤。但是,当我尝试在SQL Server Management Studio中运行脚本时,出现错误消息: 多语句事务中不允许使用ALTER DATABASE语句 错误指向第9行,即: IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX') ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] CONTAINS MEMORY_OPTIMIZED_DATA GO 由于这是(或多或少)正式的Microsoft文档,所以我认为这是我做错的事情,但是我不知道这是什么。


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.