Questions tagged «sql-server»

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

3
我应该在完整备份期间停止事务日志备份吗?
我有两个计划以不同间隔运行的SQL Agent作业。第一项作业每天运行一次完整备份。第二个作业每十五分钟运行一次事务日志备份。 随着数据库的增长,完全备份花费的时间比最初计划的还要长(即使使用压缩)。而且我从日志中注意到,事务日志备份现在正在同时运行。 我是否应该更改事务日志备份的计划,以便在运行完整备份时不运行该计划?有关系吗?

5
重新启动SQL Server会加快速度吗?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 8年前。 我注意到一些DBA非常频繁地重新启动SQL Server,有时甚至每晚重新启动一次。我相信他们这样做是为了释放一些内存,或者也可能加快查询速度。我知道重启后必须重新编译查询计划,但是即使包括在内,我也想知道这种做法是否有净收益。 每天重新启动SQL Server会使其运行速度更快吗?

4
设置varchar(8000)有什么后果?
由于varchar占用的磁盘空间与字段大小成正比,因此是否有任何原因为什么我们不总是将varchar定义为最大值,例如varchar(8000)在SQL Server上? 在创建表上,如果我看到有人在做什么,varchar(100)我应该告诉他们不,你错了,你应该怎么做varchar(8000)?


4
从SQL Server 2000开始,“避免基于递增键创建聚簇索引”是神话吗?
我们的数据库由很多表组成,其中大多数表使用整数代理键作为主键。这些主键中大约有一半在标识列上。 数据库开发始于SQL Server 6.0。 从一开始就遵循的规则之一是,避免在这些索引优化技巧中找到基于递增键创建聚簇索引的方法。 现在使用SQL Server 2005和SQL Server 2008,给人留下深刻的印象,那就是情况已经改变。同时,这些主键列是表聚集索引的最佳首选。

2
对于每种类型的查询,我都需要单独的索引,还是一个多列索引可以工作?
我已经有点知道这个问题的答案了,但是我总是觉得好像我还需要进一步探讨这个话题。 我的基本理解是,一般而言,仅包含您可能在任何给定时间查询/排序的所有字段的单个索引可能不太有用,但是我已经看到了这种类型的东西。就像这样,有人想:“好吧,如果我们将所有这些东西都放在一个索引中,数据库就可以使用它来查找所需的东西”,而从未见过针对某些实际查询运行的执行计划。 想象一个这样的表: id int pk/uid name varchar(50) customerId int (foreign key) dateCreated datetime 我可能会看到包含name,customerId和dateCreated字段的单个索引。 但是我的理解是,这样的索引不会在查询中使用,例如: SELECT [id], [name], [customerId], [dateCreated] FROM Representatives WHERE customerId=1 ORDER BY dateCreated 对于这样的查询,在我看来,一个更好的主意是使用包括customerIdand dateCreated字段的索引,该customerId字段为“ first”。这将创建一个索引,该索引将以某种方式组织数据,以使该查询可以快速找到所需内容(按所需顺序)。 我看到的另一件事,也许与第一件事一样频繁,是每个字段上的单独索引。所以,每一个上name,customerId和dateCreated领域。 与第一个示例不同,在我看来,这种安排有时至少部分有用。查询的执行计划可能表明,至少它是使用上的索引customerId来选择记录,但没有使用带有dateCreated字段的索引来对记录进行排序。 我知道这是一个广泛的问题,因为对任何特定表集上的任何特定查询的特定答案通常是查看执行计划说的将要执行的操作,否则将表和查询的详细信息纳入其中帐户。另外,我知道这取决于查询的运行频率,而不是为其维护特定索引的开销。 但是我想我要问的是作为索引的一般“起点”,为特定的,经常被拉的查询以及WHERE或ORDER BY子句中的字段具有特定索引的想法是否有意义?
22 sql-server  index 

7
需要将SQL Server迁移到MySQL
我在Windows服务器上的SQL Server 2008上有一个数据库,我想将所有数据移到Ubuntu服务器上的MySQL数据库中。我尝试将SQL Server导入和导出向导与MySQL ODBC驱动程序一起使用,并且它可以正确访问两个数据库,但是不存在包含用于类型转换的规范的xml文件,并且该规范对于我而言无法正确创建。有谁知道如何创建类型转换文件或在哪里可以找到更好的工具来传输此数据?

4
如何将表中的最大行数限制为仅1
我的SQL Server数据库中有一个配置表,该表只能有一行。为了帮助将来的开发人员理解这一点,我想防止添加多行数据。我选择为此使用触发器,如下所示... ALTER TRIGGER OnlyOneConfigRow ON [dbo].[Configuration] INSTEAD OF INSERT AS BEGIN DECLARE @HasZeroRows BIT; SELECT @HasZeroRows = CASE WHEN COUNT (Id) = 0 THEN 1 ELSE 0 END FROM [dbo].[Configuration]; IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0 BEGIN RAISERROR ('You should not add more than one row …

1
为什么CREATE INDEX…WITH ONLINE = ON会在几分钟内阻止对表的访问?
我有一个现有表: CREATE TABLE dbo.ProofDetails ( ProofDetailsID int NOT NULL CONSTRAINT PK_ProofDetails PRIMARY KEY CLUSTERED IDENTITY(1,1) , ProofID int NULL , IDShownToUser int NULL , UserViewedDetails bit NOT NULL CONSTRAINT DF_ProofDetails_UserViewedDetails DEFAULT ((0)) ); 该表有150,000,000行。系统以24x7x365运行,因此没有定期发生的维护时段。 我想向表添加索引,并且使用SQL Server企业版,我应该能够做到这一点而不会阻止对表的写访问。我使用的命令是: CREATE INDEX IX_ProofDetails_ProofID_Etc ON dbo.ProofDetails (ProofID, IDShownToUser) INCLUDE (UserViewedDetails) WITH (ONLINE=ON , ALLOW_ROW_LOCKS=ON , …

4
授予运行SQL Server作业的权限
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我在MSSQL Server 2005上有一份工作,希望允许任何数据库用户运行。 我不担心安全性,因为作业实际工作的输入来自数据库表。仅运行作业,而不向该表添加记录将无济于事。 我只是找不到如何授予工作公开权限。 有什么办法吗?在这一点上,我唯一能想到的就是让这项工作持续运行(或按计划进行),但是由于它只需要很少做任何实际工作(也许每几个月一次),我确实希望这项工作能够尽快完成,这似乎不是最佳解决方案。

1
FlushCache消息在特定时间出现在日志中
最近,我们一直在遇到许多数据库性能问题,并且我一直在尝试看看是否能找出原因。我们没有DBA(我是软件开发人员),所以我有点像在指点翅膀,而且我在网上找到的许多内容对我来说就像是一门外语。 我们每天早上都重新启动SQL Server,因为这是它在工作日内运行的唯一方式。我注意到每天凌晨5点左右,我们开始每两分钟在日志中收到此消息: FlushCache:针对DB 9:0用97168 ms的7432次写入清理了11848个buf(避免了8139个新的脏buf) 最后未完成的目标:4,avgWriteLatency 32 平均吞吐量:0.72 MB /秒,I / O饱和度:11635,上下文切换18849 这些数字当然每次都会有所不同,但是在我重新启动服务器之前,该消息一遍又一遍地重复着相同的消息。我不确定如何解释这一点,我一直在尝试向Google寻求它,而我所收集的只是这意味着I / O可能有问题,并且花费的时间比预期的要长。我们最近改用了SSD,因此我认为这应该不是写问题。 有人能对此有所启示吗?

1
在SQL Server中,为什么向后扫描聚集索引不能不使用并行性?
我一直在阅读有关SQL Server内部的信息,每本书或博客都提到了有关向后扫描的内容。 向后扫描聚集索引不能使用并行性 唯一说些什么的是下面的这篇文章。该帖子说,SQL Server团队没有实现向后扫描所需的优化。https://www.itprotoday.com/sql-server/descending-indexes 由于叶级页面是使用双向链接列表链接的,因此我不明白为什么向后扫描与向前扫描不同。任何澄清都非常感激。

5
仍然是避免将默认端口用于SQL Server的最佳实践吗?
从历史上看,作为安全最佳实践的一部分,建议不要使用默认端口连接到SQL Server。在具有单个默认实例的服务器上,默认情况下将使用以下端口: SQL Server服务-端口1433(TCP) SQL Server浏览器服务-端口1434(UDP) 专用管理员连接-端口1434(TCP) 问题: 这个建议仍然有用吗? 是否应该更改上述所有端口?

1
普通的SELECT查询计划中的“恒定扫描”和“左外部联接”来自何处?
我有这张桌子: CREATE TABLE [dbo].[Accounts] ( [AccountId] UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWID(), -- WHATEVER other columns ); GO CREATE UNIQUE CLUSTERED INDEX [AccountsIndex] ON [dbo].[Accounts]([AccountId] ASC); GO 该查询: DECLARE @result UNIQUEIDENTIFIER SELECT @result = AccountId FROM Accounts WHERE AccountId='guid-here' 使用包含单个“索引搜索”的查询计划执行-符合预期: SELECT <---- Clustered Index Seek 该查询的作用相同: DECLARE @result UNIQUEIDENTIFIER SET …

4
为什么批量插入被认为是危险的?
此问题是从Information Security Stack Exchange 迁移的,因为可以在Database Administrators Stack Exchange上回答。 迁移 2年前。 我想了解为什么一般的网络安全团队(我处理过的一个以上的组织BULK INSERT)对于向应用程序和数据库程序员授予(例如TSQL)权限是一成不变的?我无法相信“填补磁盘滥用”的借口,除非我遗漏了一些东西,因为最终结果与执行类似操作的应用程序没有什么不同: for (long i = 0; i < LONG_MAX; ++i) executeSQL("INSERT INTO table VALUES(...)"); 并且INSERT是具有基本写权限的任何人都可以执行的常见DML命令。 为了使应用程序受益,BULK INSERT它效率更高,速度更快,并且使程序员无需解析SQL之外的文件。 编辑:我最初在信息安全站点上问这个问题是有原因的-不是DBA反对使用BULK INSERT,而是“信息保证”(IA简称-网络安全人员)正在迫使该问题。我让这个问题再讲一两天,但是如果批量操作确实确实绕过了约束或触发器,我可以看到这是一个问题。

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.