标签: sql-server

如何知道何时/是否有太多索引?

时不时地运行 Microsoft SQL Server Profiler,它建议我创建一堆新的索引和统计信息(“... 97% 估计改进...”)。

根据我的理解,每个添加的索引都可以使 SQLSELECT查询更快,但也会使UPDATEorINSERT查询变慢,因为必须调整索引。

我想知道的是,我什么时候有“太多”的索引/统计信息?

也许对此没有明确的答案,但有一些经验法则。

performance index sql-server index-tuning

26
推荐指数
2
解决办法
2万
查看次数

不存在系统管理员帐户时如何添加新的系统管理员帐户

在测试期间,我取消了登录的系统管理员权限,现在无法重新添加它(因为我没有系统管理员权限)。

除[sa]帐户外,实例没有其他系统管理员帐户。

我只设置了 Windows 身份验证,所以我LoginMode在注册表中破解了2以便我可以sa使用 SQL 身份验证登录。这确实将登录模式设置为Mixed,但是sa默认情况下用户被禁用,我无法重新启用它,因为我没有系统管理员权限。

如何启用sa登录以便我可以进入并将系统管理员重新分配给我的普通帐户?是否也有一个注册表设置,或者它是否存储在主数据库中?

sql-server

26
推荐指数
4
解决办法
10万
查看次数

使用 SELECT-UPDATE 模式时管理并发

假设您有以下代码(请忽略它很糟糕):

BEGIN TRAN;
DECLARE @id int
SELECT @id = id + 1 FROM TableA;
UPDATE TableA SET id = @id; --TableA must have only one row, apparently!
COMMIT TRAN;
-- @id is returned to the client or used somewhere else
Run Code Online (Sandbox Code Playgroud)

在我看来,这不是正确管理并发性。仅仅因为您有一个事务并不意味着其他人不会读取您在获取更新语句之前所做的相同值。

现在,让代码保持原样(我意识到这作为单个语句更好地处理,甚至使用自动增量/标识列更好)有哪些确定的方法可以使其正确处理并发并防止允许两个客户端获得相同条件的竞争条件身份证价值?

我很确定将 a 添加WITH (UPDLOCK, HOLDLOCK)到 SELECT 会解决问题。该SERIALIZABLE事务隔离级别(因为它拒绝任何人阅读你做了什么,直到移植是在将似乎工作,以及UPDATE:这是假见马丁的答案)。真的吗?它们会同样有效吗?一个比另一个更受欢迎吗?

想象一下做一些比 ID 更新更合法的事情——一些基于你需要更新的读取的计算。可能涉及许多表,其中一些您会写入,而另一些则不会。这里的最佳做法是什么?

写完这个问题后,我认为锁定提示更好,因为这样你只锁定了你需要的表,但我很感激任何人的意见。

PS 不,我不知道最好的答案,真的很想得到更好的理解!:)

sql-server concurrency locking isolation-level

26
推荐指数
3
解决办法
1万
查看次数

子查询的别名与主查询的别名相同

我有一个 SQL 查询,其别名与其子查询的某些别名相同。

例如:

select *
from ROOM r
where ...
         (
              select *
              from ROAD r
              where ...
         )
Run Code Online (Sandbox Code Playgroud)

这很好用,因为子查询的别名似乎隐藏了主要的。

  1. 它会在所有情况下都这样工作吗?
  2. 我会得到未定义的结果吗?
  3. 如果可以这样做,我如何引用主查询的r?

sql-server t-sql subquery alias

26
推荐指数
2
解决办法
4万
查看次数

在多租户数据库架构中处理越来越多的租户

在公共服务器中为每个租户的应用程序实例使用单独的数据库处理数量适中的客户(租户)相对简单,并且通常是正确的方法。目前我正在研究一个应用程序的架构,其中每个租户都有自己的数据库实例。

但是,问题是该应用程序将拥有大量租户(5,000-10,000)和大量用户,单个租户可能有 2,000 个用户。我们需要支持每周由几个租户扩展系统。

此外,所有租户及其用户都将看到一个通用的登录过程(即每个租户不能拥有自己的 URL)。为此,我需要一个集中的登录过程和一种将数据库动态添加到系统并注册用户的方法。

  • 如何稳健地自动化注册和数据库创建过程?

  • 在系统上创建和注册租户数据库的过程是否可能导致性能或锁定问题。如果您认为这可能是一个问题,有人可以建议减轻它的方法吗?

  • 如何以用户凭据与特定租户数据库相关联的方式管理中央身份验证,但用户可以通过公共页面登录(即全部通过相同的登录 URL,但他们的主应用程序将位于某些特定租户的数据库上) )。租户必须能够维护自己的登录名和权限,但中央登录系统必须了解这些。谁能建议一种方法来做到这一点?

  • 如果我需要通过添加多个数据库服务器来“向外扩展”,谁能建议我在跨服务器管理用户身份(模拟等)时可能需要处理哪些问题以及缓解这些问题的某种方法?

database-design sql-server

26
推荐指数
2
解决办法
8162
查看次数

如何有效地检查多列上的 EXISTS?

这是我定期遇到的一个问题,但尚未找到好的解决方案。

假设如下表结构

CREATE TABLE T
(
A INT PRIMARY KEY,
B CHAR(1000) NULL,
C CHAR(1000) NULL
)
Run Code Online (Sandbox Code Playgroud)

并且要求是确定可空列中的任何一个B或C实际上是否包含任何NULL值(如果是,则是哪个(些))。

还假设该表包含数百万行(并且没有可用的列统计信息可以查看,因为我对此类查询的更通用解决方案感兴趣)。

我可以想到几种方法来解决这个问题,但都有弱点。

两个单独的EXISTS声明。这将具有允许查询在NULL发现a 后尽早停止扫描的优点。但是如果两列实际上都不包含NULLs,那么将导致两次完整扫描。

单一聚合查询

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
Run Code Online (Sandbox Code Playgroud)

这可以同时处理两列,因此最坏的情况是一次完整扫描。缺点是即使它NULL在查询的很早的时候在两列中都遇到了 a ,最终仍会扫描整个表的其余部分。

用户变量

我可以想到第三种方式来做到这一点

BEGIN TRY
DECLARE @B INT, @C INT, @D …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

26
推荐指数
2
解决办法
11万
查看次数

尝试查看数据库层次结构时出现“超出锁定请求超时期限”错误

我在使用数据库时遇到问题。

  1. 我可以运行基本查询,尽管比正常情况慢得多。

  2. 当我尝试在 SSMS 对象资源管理器中查看表、视图或过程的层次结构树时,我得到lock request time out period exceeded.

  3. 我在此数据库中的对象上运行的 SSRS 报告不再完成。

  4. 与存储在此数据库中的过程相关的作业也不会运行。

我尝试使用sp_who2查找并终止数据库上的所有连接,但这并没有解决问题。

这里发生了什么?我该如何解决这个问题?

sql-server-2008 sql-server

26
推荐指数
4
解决办法
15万
查看次数

试图找出值最后一次改变的时间

我有一个表,其中有一个 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')
Run Code Online (Sandbox Code Playgroud)

结果应该是:

Taco_ID      Taco_date
1            2012-07-01 00:00:05
Run Code Online (Sandbox Code Playgroud)

(因为 00:05 是最后一次Taco_Value更改。)

sql-server t-sql sql-server-2008-r2

26
推荐指数
4
解决办法
4万
查看次数

在维护计划中创建备份数据库任务时,“备份集将过期:”选项有什么用

在备份数据库时,我想使用“备份集将过期: ”选项来删除/覆盖旧的数据库备份。我无法使用此选项。

关于如何在创建维护计划时使用“备份集将过期:”选项的任何建议将不胜感激。

sql-server backup maintenance

26
推荐指数
1
解决办法
7万
查看次数

授予文件系统访问 SQLSERVERAGENT 虚拟帐户的权限

我正在尝试NT Service\SQLSERVERAGENT根据此问题中的标记答案授予Windows 帐户文件系统访问权限。我相信这是一个虚拟服务帐户,它不会显示在控制面板 -> 用户帐户区域中。

如何授予此服务帐户访问文件系统的权限?具体来说,在 Windows 7 上。

我已经阅读了几种方法,但似乎没有一种方法适合我。我尝试了 PowerShell 方法,但 AD 命令不是有效命令。我什至下载并安装了这些命令所需的 Windows 补丁。我还了解到我应该能够通过 SQL Server 配置管理器或 Management Studio 执行此操作。不过,我似乎无法弄清楚在哪里调整这些权限。

SQL Server 代理进程无法启动,并显示以下错误消息:

Login failed for user 'NT SERVICE\SQLSERVERAGENT'.  
Reason: Failed to open the explicitly specified database 'msdb'.  
[CLIENT: <local machine>]
Run Code Online (Sandbox Code Playgroud)

根据我的谷歌搜索,它与此帐户的权限有关。

我不确定数据库是否已损坏,但它说数据库处于正常状态。SQL Server 代理登录是sysadmin和public组的一部分。

sql-server permissions sql-server-agent

26
推荐指数
1
解决办法
8万
查看次数