Questions tagged «sql-server»

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

3
如何保证SQL Server 2008 R2的插入内容首先缓存在RAM中?
想象一下一个“突发”的数据流,即可能有10,000个事件很快到达,随后一分钟什么也没到达。 您的专家建议:如何编写SQL Server的C#插入代码,以确保SQL立即将所有内容缓存在其自己的RAM中,而不会阻塞我的应用程序,而不会超出将数据馈入所述RAM所需的时间?为此,您是否知道用于设置SQL Server本身的任何模式,或者用于设置我要写入的单个SQL表的模式? 当然,我可以做自己的版本,这涉及在RAM中构造自己的队列-但我不想重塑旧石器时代的石斧。

2
交叉应用产生外部连接
为了回答SQL对分区的计数问题,Erik Darling发布了此代码来解决以下问题COUNT(DISTINCT) OVER (): SELECT * FROM #MyTable AS mt CROSS APPLY ( SELECT COUNT(DISTINCT mt2.Col_B) AS dc FROM #MyTable AS mt2 WHERE mt2.Col_A = mt.Col_A -- GROUP BY mt2.Col_A ) AS ca; 查询使用CROSS APPLY(not OUTER APPLY),为什么执行计划中有外部联接而不是内部联接? 同样,为什么取消注释group by子句会导致内部联接? 我认为数据并不重要,但可以复制kevinwhat在另一个问题上给出的数据: create table #MyTable ( Col_A varchar(5), Col_B int ) insert …

5
当强制实施IsDeleted(软删除)时,合适的索引体系结构是什么?
当前,我们有一个功能齐全的现有数据库和应用程序。我目前无法更改架构。今天,数据库中的每个表都有一个“ IsDeleted” NOT NULL BIT字段,默认值为“ 0”。当应用程序“删除”数据时,它只是将IsDeleted标志更新为1。 我无法理解的是每个表的索引应如何构造。现在,每个查询/联接/等总是执行IsDeleted检查。这是我们开发人员必须遵循的标准。话虽这么说,我试图确定是否需要更改每个表上的所有群集主键索引,以包括主键和IsDeleted BIT字段。另外,由于每个查询/加入/等。必须执行IsDeleted检查,是否适当地假设每个单索引(以及非聚簇索引)都应将IsDeleted字段包括为索引的第一个字段? 我还有一个问题是关于过滤索引的。我知道我可以在诸如“ WHERE IsDeleted = 0”之类的索引上放置过滤器,以减少索引的大小。但是,由于每个联接/查询都必须实现IsDeleted检查,这是否会阻止使用过滤后的索引(因为联接/查询中使用了IsDeleted列)? 请记住,我没有能力更改IsDeleted方法。

1
从索引列上非常大的表中选择SELECT TOP 1非常慢,但不是相反的顺序(“ desc”)
我们有一个大型数据库,大约1TB,在功能强大的服务器上运行SQL Server 2014。几年一切正常。大约2周前,我们进行了全面维护,其中包括:安装所有软件更新;重建所有索引和紧凑的数据库文件。但是,我们没想到在实际负载相同的情况下,在某些阶段数据库的CPU使用率会增加100%以上至150%。 经过大量的故障排除后,我们将其范围缩小到一个非常简单的查询,但找不到解决方案。查询非常简单: select top 1 EventID from EventLog with (nolock) order by EventID 它总是需要约1.5秒!但是,带有“ desc”的类似查询始终大约需要0毫秒: select top 1 EventID from EventLog with (nolock) order by EventID desc PTable大约有5亿行;EventID是ASC数据类型为bigint(标识列)的主聚集索引列(有序)。有多个线程在顶部的数据表中插入数据(较大的EventID),有1个线程从底部的数据表中删除数据(较小的EventID)。 在SMSS中,我们验证了两个查询始终使用相同的执行计划: 聚集索引扫描; 估计行数和实际行数均为1; 估计的执行次数和实际的执行次数均为1; 估计I / O成本为8500(似乎很高) 如果连续运行,则两者的查询成本都是相同的50%。 我更新了索引统计信息with fullscan,问题仍然存在;我再次重建了索引,问题似乎消失了半天,但又回来了。 我通过以下方式打开了IO统计信息: set statistics io on 然后连续运行两个查询,发现以下信息: (对于第一个查询,慢速查询) 表“ PTable”。扫描计数1,逻辑读407670,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。 (对于第二个查询,快速查询) …


2
SQL Server:我们应该使用TCP还是命名管道还是使用默认管道?
从同一LAN中另一台服务器上的.NET 4客户端应用程序连接到SQL Server 2008 R2时,可以设置三种不同的网络协议: TCP协议 命名管道 不要在连接字符串中设置任何内容并使用默认值 什么是最佳做法?选择什么? 附加信息:服务器和客户端上都启用了TCP和命名管道。该应用程序正在使用数据库镜像。客户端和服务器通过快速LAN进行通信。 我们正在对此进行调查,因为我们有罕见且虚假的连接和超时问题。(但是无论如何,我都想知道最佳实践)。 在MSDN上有关于此主题的文章,但它非常笼统且含糊。它不建议或推荐任何有用的东西。

6
尝试查看数据库层次结构时出现“超出了锁定请求超时期限”错误
我的数据库有问题。 我可以运行基本查询,尽管比正常情况要慢得多。 当我尝试在SSMS Object Explorer中查看表,视图或过程的层次结构树时,得到lock request time out period exceeded。 我在此数据库中的对象上运行的SSRS报告不再完成。 与该数据库上存储的过程关联的作业也不会运行。 我尝试使用 sp_who2查找并杀死数据库上的所有连接,但是这并没有解决问题。 这里发生了什么?我该如何解决?

1
查找上次更新表的时间
查询: SELECT name AS TableName, create_date AS CreatedDate, modify_date as ModifyDate FROM sys.tables order by ModifyDate; ...会告诉我上次创建和修改表的时间(从DDL角度来看)。但是我想知道上一次实际数据是从表中插入还是从表中删除。是否可以在SQL Server中获得此权限?

3
启用触发器后,记录删除速度缓慢
以为通过以下链接可以解决此问题-解决方法可以正常工作-但补丁程序没有解决。与Microsoft支持人员一起解决。 http://support.microsoft.com/kb/2606883 好的,所以我有一个问题想扔给StackOverflow看看是否有人有想法。 请注意这是与SQL Server 2008 R2 问题:启用触发器后,从具有15000条记录的表中删除3000条记录需要3-4分钟,而禁用触发器则仅需要3-5秒。 表格设定 我们将两个表称为Main和Secondary。辅助数据库包含我要删除的项目的记录,因此在执行删除时,我会加入到辅助数据库表。进程在delete语句之前运行,以用要删除的记录填充辅助表。 删除声明: DELETE FROM MAIN WHERE ID IN ( SELECT Secondary.ValueInt1 FROM Secondary WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7' ); 该表有很多列和大约14个不同的NC索引。在确定引发问题的原因之前,我尝试了多种尝试。 打开页面锁定(默认情况下我们已关闭) 手动收集统计数据 禁用自动收集统计信息 验证索引的健康状况和碎片 从表中删除聚簇索引 检查执行计划(没有显示为丢失的索引,对于实际删除,成本为70%,对于记录的合并/合并,成本约为28% 扳机 该表具有3个触发器(每个触发器分别用于插入,更新和删除操作)。我修改了删除触发器的代码以使其返回,然后选择一个以查看触发了多少次。在整个操作过程中,它仅触发一次(如预期)。 ALTER TRIGGER [dbo].[TR_MAIN_RD] ON [dbo].[MAIN] AFTER DELETE AS SELECT 1 RETURN 回顾 启用触发器-语句需要3-4分钟才能完成 关闭触发器-语句需要3-5秒才能完成 …


4
当包裹在TVF中时,为什么此查询的速度大大降低?
我有一个相当复杂的查询,它仅需几秒钟即可运行,但是当包装到一个表值函数中时,它要慢得多。我实际上并没有完成它,但是它运行了十分钟而没有结束。唯一的变化是用日期参数替换了两个日期变量(用日期文字初始化): 七秒钟内运行 DECLARE @StartDate DATE = '2011-05-21' DECLARE @EndDate DATE = '2011-05-23' DECLARE @Data TABLE (...) INSERT INTO @Data(...) SELECT... SELECT * FROM @Data 至少跑十分钟 CREATE FUNCTION X (@StartDate DATE, @EndDate DATE) RETURNS TABLE AS RETURN SELECT ... SELECT * FROM X ('2011-05-21', '2011-05-23') 之前,我已经使用带有RETURNS @Data TABLE(...)子句的多语句TVF编写了该函数,但是将其替换为内联结构并没有进行明显的更改。TVF的长时间运行是实际SELECT * FROM X时间;实际上创建UDF只需几秒钟。 …

2
为什么:r SQLCMD命令在后期部署脚本中标记为错误?
我曾经使用过后期部署脚本工作过几次,并且总是直观地使用构建操作“ PostDeploy”,因为这就是事实。现在,我第一次尝试遵循脚本模板中的内置指令来使用":r somescript.sql"语法。 立即将这一行标记为错误: “ SQL80001':'旁边的语法错误” 我发现了将PDS设置为“无操作”的建议。这没有帮助,错误仍然存​​在。我在这里想念什么?

2
为什么将SQL Server用户添加到“执行卷维护任务”中可以极大地提高数据库大小调整的速度?
如果我想用创建5GB数据库 CREATE DATABASE [test] CONTAINMENT = NONE ON PRIMARY ( NAME = N'test', FILENAME = N'E:\2012\test.mdf' , SIZE = 5529600KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'test_log', FILENAME = N'E:\2012\test_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) 我的SSD 需要1分钟。 但是当我将SQL Server用户添加到 Perform volume maintenance tasks …

1
解决仅通过索引视图相关的2个表的死锁
我遇到了陷入僵局的情况,我想我已经缩小了罪魁祸首的位置,但是我不确定该如何解决。 这是在运行SQL Server 2008 R2的生产环境中。 为了让您对情况略有简化: 我有3个表,定义如下: TABLE activity ( id, -- PK ... ) TABLE member_activity ( member_id, -- PK col 1 activity_id, -- PK col 2 ... ) TABLE follow ( id, -- PK follower_id, member_id, ... ) 该member_activity表具有定义为的复合主键member_id, activity_id,因为我只需要以这种方式在该表上查找数据。 我也有一个非聚集索引follow: CREATE NONCLUSTERED INDEX [IX_follow_member_id_includes] ON follow ( …

2
在SQL Server中,读锁如何工作?
假设我有以下长期运行的查询 UPDATE [Table1] SET [Col1] = 'some value' WHERE [Col2] -- some clause which selects thousands of rows 并假设上面的查询运行时执行了以下查询 SELECT * FROM [Table1] 在第一个查询完成之前,第一个查询是否会阻止第二个查询运行?如果是这样,则第一个查询是否阻止第二个查询在所有行上运行,或者仅在WHERE子句中涉及的行上运行? 编辑: 假设第二个查询是 SELECT [Col1], [Col2] FROM [Table1] WHERE [Col2] -- some clause whose matching elements overlap those from -- the clause in the first query and …

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.