Questions tagged «sql-server»

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

6
如何有效地检查多个列上的EXISTS?
这是我定期遇到的一个问题,尚未找到一个好的解决方案。 假设下面的表结构 CREATE TABLE T ( A INT PRIMARY KEY, B CHAR(1000) NULL, C CHAR(1000) NULL ) 要求是确定可为空的列中的任何一个B或C实际上是否包含任何NULL值(以及是否包含任何值)。 还要假设该表包含数百万行(并且没有可用的列统计信息,因为我对此类查询的更通用解决方案感兴趣)。 我可以想到几种解决方法,但都有缺点。 两个单独的EXISTS语句。这样的好处是,一旦NULL找到a,查询就可以立即停止扫描。但是,如果两列实际上都不包含,NULL则将进行两次完整扫描。 单一汇总查询 SELECT MAX(CASE WHEN B IS NULL THEN 1 ELSE 0 END) AS B, MAX(CASE WHEN C IS NULL THEN 1 ELSE 0 END) AS C FROM T 这可能会同时处理两个列,因此最糟糕的情况是一次完整扫描。缺点是,即使NULL在查询的两个很早就在两列中都遇到了a …

2
如何知道何时/是否索引过多?
时不时地运行Microsoft SQL Server Profiler,它建议我创建一系列新的索引和统计信息(“ ... 97%的预期改进...”)。 据我了解,每个增加的索引都可以使SQL SELECT查询更快,但由于必须调整索引,因此SQL UPDATE或SQL 查询的速度也会INSERT变慢。 我想知道的是,什么时候会有“太多”的索引/统计信息? 也许对此没有明确的答案,但有一些经验法则。

5
归档旧数据
由于数据库太大,我们当前遇到一些性能问题。有过去10年存储的数据,我看不出为什么必须将2年以上的数据与新数据存储在同一表中的原因。 现在,由于我在管理数据库方面没有很丰富的经验,因此我正在寻找归档旧数据的最佳方法。 信息 数据库中总共有约310'000'000条记录。 数据库在硬盘上需要250 GB。 服务器版本为具有兼容级别SQL Server 2005(90)的SQL Server 2008,但我们计划很快升级到SQL Server 2012 我考虑过两种可能性: 新资料库 在生产服务器上创建一个与之相似的数据库,并将所有旧数据插入新数据库中。 缺点:由于我们的环境中不允许使用链接服务器,因此如果需要,将很难加入旧数据 历史架构 使用与生产数据库相同的表创建新的模式fe [hist]。在新架构的这些新表中插入所有旧数据。 优势:易于加入,如果将来需要旧数据 您是否更喜欢其中一种解决方案? 为什么? 还有更好的可能性吗? 是否有现有工具可轻松实现此任务? 还有其他想法吗? 提前致谢 编辑 附加问题: 新创建的存档表是否还需要主键/外键? 还是应该只包含列但没有键/约束?

7
尝试查找值最后一次更改的时间
我有一个具有ID,值和日期的表。该表中有许多ID,值和日期。 记录会定期插入此表中。ID将始终保持不变,但有时值会更改。 如何编写一个查询,该查询将为我提供ID以及最近一次更改值的时间?注意:该值将始终增加。 从此样本数据中: Create Table Taco ( Taco_ID int, Taco_value int, Taco_date datetime) Insert INTO Taco Values (1, 1, '2012-07-01 00:00:01'), (1, 1, '2012-07-01 00:00:02'), (1, 1, '2012-07-01 00:00:03'), (1, 1, '2012-07-01 00:00:04'), (1, 2, '2012-07-01 00:00:05'), (1, 2, '2012-07-01 00:00:06'), (1, 2, '2012-07-01 00:00:07'), (1, 2, '2012-07-01 00:00:08') …

3
模拟死锁的代码
我正在测试我的应用程序,我需要一些代码来稳定地模拟数据库站点上的死锁(如果可能,请使用sql脚本)。 谢谢。 添加: 重现仅涉及一张表的死锁

2
为什么子查询将行估算值减少到1?
考虑以下人为但简单的查询: SELECT ID , CASE WHEN ID <> 0 THEN (SELECT TOP 1 ID FROM X_OTHER_TABLE) ELSE (SELECT TOP 1 ID FROM X_OTHER_TABLE_2) END AS ID2 FROM X_HEAP; 我希望此查询的最终行估计等于X_HEAP表中的行数。无论我在子查询中执行的操作与行估计无关紧要,因为它无法过滤出任何行。但是,在SQL Server 2016上,由于子查询,我看到行估计减少为1: 为什么会这样?我该怎么办? 使用正确的语法很容易重现此问题。这是一组可以做到的表定义: CREATE TABLE dbo.X_HEAP (ID INT NOT NULL) CREATE TABLE dbo.X_OTHER_TABLE (ID INT NOT NULL); CREATE TABLE dbo.X_OTHER_TABLE_2 …

8
为什么允许所有人都使用sa登录名是一种不好的做法?
甚至Microsoft 都不鼓励使用SQL Server身份验证模式,但是我们的应用程序要求使用它。 我已经读到,最好的做法是不让用户sa直接使用登录名,而是使用Windows身份验证并允许这些帐户(或帐户组)具有sysadmin特权。 这根本不是一回事吗?优点/缺点是什么? 最佳实践如何提高SQL Server实例的安全性? 这仅适用于生产实例还是我们的内部开发实例?

1
由于文件路径错误,备份时SQL Server 2017崩溃
我试图还原数据库,而SQL Server一直崩溃。我会在SSMS中收到一条消息,说存在网络传输错误(由于崩溃导致连接断开)。我检查了日志,发现没有什么比SQL Server意外关闭更重要。然后,我将不得不重新启动该服务。 我将问题缩小到GUI试图运行的脚本。问题是当进行尾日志备份时,备份文件的路径错误。它应该是D:\mapbenefits\... BACKUP LOG [mapbenefits] TO DISK = N'D:mapbenefits_LogBackup_2019-02-21_13-58-24.bak' WITH NOFORMAT, NOINIT, NAME = N'mapbenefits_LogBackup_2019-02-21_13-58-24', NOSKIP, NOREWIND, NOUNLOAD, NORECOVERY , STATS = 5 我有两个问题。 如何解决此问题?我尝试进入服务器设置,并且备份路径D:没有斜杠。如果我添加斜杠,则gui会将其删除。这是SSMS v17.9.1。我可以选择,D:\mapbenefits\并且可以,但是我想要D:\DATABASE\... 这是错误吗?SQL服务器是否应该仅由于路径输入错误而崩溃?修复文件路径后,它就没有问题了。我可以随时通过复制文件路径来重现。 如果我运行查询以检查版本,则会得到CU13,但是如果进入设置,则会看到版本14.0.1000.169。 看起来这是一个错误并且可以复制,所以我将其发布到了这里:https : //feedback.azure.com/forums/908035-sql-server/suggestions/36920542-incorrect-filepath-with-backup-log-command-原因

3
是否已从SQL Server 2016安装媒体中删除Management Studio?
我只是尝试安装SQL Server 2016 Enterprise,但我注意到默认情况下未安装Management Studio。我还注意到安装指南中有指向SSMS的单独链接,该链接指向https://msdn.microsoft.com/zh-cn/library/mt238290.aspx 做出此决定的原因是什么? 在上述URL上注明了以下内容: 此普遍可用的SSMS版本是免费的,不需要安装和使用SQL Server许可证。 也许就是这个吗?
25 sql-server  ssms 

1
顺序-NO CACHE vs CACHE 1
在SQL Server 2012+中,SEQUENCE声明使用NO CACHE和声明使用之间有区别CACHE 1吗? 顺序1: CREATE SEQUENCE dbo.MySeqCache1 AS INT START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999 NO CYCLE CACHE 1; GO 顺序2: CREATE SEQUENCE dbo.MySeqNoCache AS INT START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999 NO CYCLE NO CACHE; GO 两者之间有什么区别吗?在SQL Server 2012+环境中使用时,它们的行为会有所不同吗?

4
我应该明确拒绝不应该更新的列吗?
我习惯在非常安全的环境中工作,因此我将权限设计为非常精细。我通常要做的一件事是显式地DENY使用UPDATE不应该更新的列的功能。 例如: create table dbo.something ( created_by varchar(50) not null, created_on datetimeoffset not null ); 设置值后,永远不要更改这两列。因此,我明确DENY了UPDATE他们的权限。 最近,在一个团队会议中,开发人员提出了一个观点,即确保字段永远不会更新的逻辑应该包含在应用程序层而不是数据库层中,以防“他们出于某种原因需要更新值”。对我来说,这听起来像是典型的开发者心态(我知道,我曾经是一个!) 我是公司的高级架构师,我一直致力于使应用程序正常运行所需的最少特权。所有权限都会定期审核。 在这种情况下,最佳做法是什么?

4
带问号的蓝色图标-这是什么意思?
SQL Server实例是可访问的,似乎还不错。 Microsoft SQL Server 2016(SP1-CU2)(KB4013106)-13.0.4422.0(X64) 2017年3月6日14:18:16版权所有(c)Windows Server 2012 R2 Standard 6.3(Build 9600)上的Microsoft Corporation Enterprise Edition(64位) :)(管理程序) 但是白色问号是什么意思? 这些图标在我刷新时不会消失。我是sql server内部的sysadmin,外部是该框中的管理员。 我注意到的另一件事,您可以在下面的图片中看到。这是2个不同的Management Studio会话。 在最上面的一个,我以我自己的身份登录DBA and sysadmin,在第二个上,我与Management Studio一起run as a different user使用,并且我使用了用于复制的域帐户,而不是sysadmin。 第二台也有blue icon此服务器和其他服务器中的,而我的是正常的绿色服务器。

3
样本大小的异常行为可用于统计信息更新
我一直在研究抽样阈值,并使用SQL Server(2012)的统计信息更新,并注意到一些奇怪的行为。基本上,在某些情况下,即使使用相同的数据集,采样的行数似乎也有所不同。 我运行此查询: --Drop table if exists IF (OBJECT_ID('dbo.Test')) IS NOT NULL DROP TABLE dbo.Test; --Create Table for Testing CREATE TABLE dbo.Test(Id INT IDENTITY(1,1) CONSTRAINT PK_Test PRIMARY KEY CLUSTERED, TextValue VARCHAR(20) NULL); --Insert enough data so we have more than 8Mb (the threshold at which sampling kicks in) INSERT INTO …

2
将列从NOT NULL更改为NULL-到底发生了什么?
我们有一个包含2.3B行的表。我们想将列从NOT NULL更改为NULL。该列包含在一个索引中(而不是聚集索引或PK索引)。数据类型没有改变(它是一个INT)。只是可空性。声明如下: Alter Table dbo.Workflow Alter Column LineId Int NULL 在停止该操作之前,该操作花费了超过10(我们甚至还没有让它运行完毕,因为这是一项阻塞操作,并且花费了太长时间)。我们可能会将表复制到开发服务器,以测试实际需要多长时间。但是,我很好奇,是否有人知道从NOT NULL转换为NULL时SQL Server在做什么?另外,是否需要重建受影响的索引?生成的查询计划不会指示正在发生的事情。 有问题的表是群集的(不是堆)。

1
结合交易触发
假设我们有以下情况: 我们有一张桌子(假设Table_A),其中有一个触发器INSERT。触发工作是table_B根据中的插入值更新其中的某些行table_A。 现在,当我们在表中简单地插入一行时,一切正常,但是在通过事务插入数据的情况下呢?触发器将等待所有事务语句成功运行,还是在识别到插入后立即触发?如果触发器在识别出第一个插入后立即触发,那么如果事务在最后一行失败,会发生什么?有什么机制可以解决这种情况吗?

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.