Questions tagged «sql-server»

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


1
如何在SQL Server 2008中强制删除数据库
我试图强制删除数据库,但是删除数据库后,当我尝试重新创建数据库时,出现了错误 无法创建文件C:\ Program Files ..... [数据库名称] .mdf,因为它已经存在 这是我的强制删除数据库的查询 Use master; ALTER database [databasename] set offline with ROLLBACK IMMEDIATE; DROP database [databasename]; 我了解到,以上查询正在删除数据库,但并未删除.ldf和.mdf文件。如何彻底删除数据库? 普通查询 Drop database [databasename] ; //deletes the database completely, including the ldf and mdf's. 如何强制删除数据库,该数据库也会删除.mdf和.ldf文件?

4
使用LEFT JOIN或NOT EXISTS之间的最佳实践
在使用LEFT JOIN或NOT EXISTS格式之间有最佳实践吗? 相对于另一个使用什么有什么好处? 如果没有,则应首选? SELECT * FROM tableA A LEFT JOIN tableB B ON A.idx = B.idx WHERE B.idx IS NULL SELECT * FROM tableA A WHERE NOT EXISTS (SELECT idx FROM tableB B WHERE B.idx = A.idx) 我在Access中使用SQL Server数据库查询。

8
SQL Server的MAXDOP设置算法
设置新的SQL Server时,我使用以下代码来确定设置的良好起点MAXDOP: /* This will recommend a MAXDOP setting appropriate for your machine's NUMA memory configuration. You will need to evaluate this setting in a non-production environment before moving it to production. MAXDOP can be configured using: EXEC sp_configure 'max degree of parallelism',X; RECONFIGURE If this instance is hosting a …


4
索引搜索与索引扫描
在查看运行缓慢的查询的执行计划时,我注意到一些节点是索引查找,而某些节点是索引扫描。 索引搜索和索引扫描之间有什么区别? 哪个表现更好? SQL如何选择一个? 我意识到这是3个问题,但我认为回答第一个问题将解释其他问题。

3
检查约束只有三列之一为非空
我有一个(SQL Server)表,其中包含3种类型的结果:FLOAT,NVARCHAR(30)或DATETIME(3个单独的列)。我想确保对于任何给定的行,只有一列具有结果,其他列为NULL。实现此目的最简单的检查约束是什么? 为此,本文试图将捕获非数字结果的功能改造为现有系统。在表上添加两个新列并添加约束以防止每行出现多个结果是最经济的方法,不一定是正确的方法。 更新:抱歉,数据类型为snafu。可悲的是,我不打算将指示的结果类型解释为SQL Server数据类型,而只是一般术语,现在已修复。

1
默认情况下,我可以从SQL Server获取哪些事件信息?
我经常在人们想知道某件事是否发生,何时发生或由谁执行操作的问题上遇到疑问。在很多情况下,SQL Server不会单独跟踪此信息。例如: 谁最后执行存储过程dbo.MyProcedure? 谁更新salary了dbo.Employees表格中的列? 谁最后dbo.Orders从Management Studio 查询表格? 但是默认情况下,SQL Server 会临时跟踪其他一些事件,这些事件可以本地回答有关的问题,例如: 上一次在AdventureWorks数据库中发生自动增长是什么时候? 谁删除了dbo.EmployeeAuditData表格,何时删除? 今天发生了多少与内存相关的错误? 我如何获得此信息,以及该信息可以使用多长时间?

5
写入varchar和nvarchar之间的差异
当前在SQL Server 2012数据库中,我们正在使用varchar,并且我们想要更改它nvarchar。我已经生成了一个脚本来做到这一点。 我的问题是,SQL Server在写入varchar列与写入列方面有什么区别nvarchar?我们有许多我关心的后端程序。 编辑: 不确定是否有帮助,但是列没有索引,f / k或约束。

7
编写一个简单的银行架构:如何使我的余额与他们的交易记录保持同步?
我正在为一个简单的银行数据库编写模式。基本规格如下: 数据库将针对用户和货币存储交易。 每个用户每种货币都有一个余额,因此每个余额只是针对给定用户和货币的所有交易的总和。 余额不能为负。 银行应用程序将专门通过存储过程与其数据库进行通信。 我希望该数据库每天可以接受成千上万的新交易,并且可以平衡更高数量级的查询。要非常快地用完余额,我需要预先对其进行汇总。同时,我需要保证余额永远不会与其交易历史相矛盾。 我的选择是: 有一个单独的balances表,然后执行下列操作之一: 将交易应用到transactions和balances表。TRANSACTION在存储过程层中使用逻辑,以确保余额和交易始终保持同步。(由Jack支持。) 将交易应用到transactions表格,并使用触发器balances为我更新交易金额。 将事务应用于balances表,并具有一个触发器,该触发器transactions为我在表中添加一个具有事务量的新条目。 我必须依靠基于安全性的方法来确保在存储过程之外无法进行任何更改。否则,例如,某些过程可能会直接将事务插入transactions表中,而根据计划1.3,相关余额将不同步。 有一个balances索引视图可以适当地汇总事务。存储引擎保证余额与事务保持同步,因此我不需要依靠基于安全性的方法来保证这一点。另一方面,由于视图-甚至是索引视图-都没有CHECK约束,因此我不能再将余额强制为非负数。(由Denny支持。) 仅具有一个transactions表,但具有一个附加列来存储该交易执行后立即生效的余额。因此,用户和货币的最新交易记录也包含其当前余额。(下面由安德鲁建议;由garik提出。) 当我第一次解决这个问题时,我阅读了这 两个讨论并决定选择2。作为参考,您可以在此处看到其基本实现。 您是否设计或管理了这样的具有高负载配置文件的数据库?您如何解决此问题? 您认为我做出了正确的设计选择吗?我有什么要记住的吗? 例如,我知道对transactions表的架构更改将需要我重建balances视图。即使我在归档事务以保持数据库较小(例如,通过将它们移动到其他地方并用汇总事务替换),每次架构更新都必须从数千万个事务中重建视图,这可能意味着每个部署的停机时间会大大增加。 如果要使用索引视图,如何保证没有余额是负数? 归档交易: 让我详细说明一下归档事务和上面提到的“摘要事务”。首先,在这样的高负载系统中,定期归档将是必要的。我想保持余额与交易记录之间的一致性,同时允许将旧交易移至其他位置。为此,我将使用每位用户和货币金额的摘要替换每一批已归档的交易。 因此,例如,以下交易清单: user_id currency_id amount is_summary ------------------------------------------------ 3 1 10.60 0 3 1 -55.00 0 3 1 -12.12 0 已归档并替换为: user_id currency_id amount is_summary ------------------------------------------------ 3 1 -56.52 1 …



5
为什么将ALTER COLUMN设置为NOT NULL会导致大量日志文件增长?
我有一个表,其中有64m行,其数据占用磁盘上4.3 GB的空间。 每行大约是30个字节的整数列,外加一个NVARCHAR(255)用于文本的可变列。 我添加了一个NULLABLE列,具有data-type Datetimeoffset(0)。 然后,我为每一行更新了该列,并确保所有新插入的内容在该列中都放置了一个值。 一旦没有NULL条目,我就运行以下命令使我的新字段成为必填项: ALTER TABLE tblCheckResult ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL 结果是事务日志大小从6GB大幅增加到36GB以上,直到空间用完为止! 有谁知道SQL Server 2008 R2在做什么,以使这个简单的命令取得如此巨大的增长?

6
使用窗口功能的日期范围滚动总和
我需要计算日期范围内的滚动总和。为了说明这一点,使用AdventureWorks示例数据库,以下假设语法将完全满足我的需要: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; 可悲的是,RANGE窗口框架范围当前在SQL Server中不允许间隔。 我知道我可以使用子查询和常规(非窗口)聚合来编写解决方案: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) FROM Production.TransactionHistory AS TH2 …

6
死锁的主要原因是什么,可以防止死锁吗?
最近,我们的一个ASP.NET应用程序显示了一个数据库死锁错误,要求我检查并修复该错误。我设法找到导致死锁的原因是存储过程正在严格更新游标中的表。 这是我第一次看到此错误,并且不知道如何有效地跟踪和修复它。我尝试了所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份专栏。 后来,我发现为脚本编写部署脚本的开发人员陷入困境。我添加了一个主键,问题就解决了。 我感到很高兴,回到了我的项目,并做了一些研究以找出造成这种僵局的原因... 显然,导致死锁的是循环等待条件。没有主键的更新显然要比使用主键的更新花费更长的时间。 我知道这不是一个明确的结论,这就是为什么我在这里发布... 缺少主键是问题所在吗? 除了互斥,保留和等待,没有抢占和循环等待之外,还有其他导致僵局的条件吗? 如何防止和跟踪死锁?

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.