标签: sql-server

使用 JOIN 有效地更新表

我有一张表,其中包含家庭的详细信息,而另一个表则包含与这些家庭相关的所有人员的详细信息。对于家庭表,我使用其中的两列定义了一个主键 - [tempId,n]。对于 person 表,我有一个使用其 3 列定义的主键[tempId,n,sporder]

使用主键上的聚集索引所指示的排序,我为每个家庭[HHID]和每个人的[PERID]记录生成了一个唯一 ID (下面的代码片段用于生成 PERID]:

 ALTER TABLE dbo.persons
 ADD PERID INT IDENTITY
 CONSTRAINT [UQ dbo.persons HHID] UNIQUE;
Run Code Online (Sandbox Code Playgroud)

现在,我的下一步是将每个人与相应的家庭相关联,即;将 a 映射[PERID]到 a [HHID]。两个表之间的人行横道基于两列[tempId,n]。为此,我有以下内部连接语句。

UPDATE t1
  SET t1.HHID = t2.HHID
  FROM dbo.persons AS t1
  INNER JOIN dbo.households AS t2
  ON t1.tempId = t2.tempId AND t1.n = t2.n;
Run Code Online (Sandbox Code Playgroud)

我总共有1928783个户籍记录和5239842个人记录。执行时间目前非常高。

现在,我的问题:

  1. 是否可以进一步优化此查询?更一般地说,优化连接查询的拇指规则是什么?
  2. 是否有另一个查询构造可以以更好的执行时间实现我想要的结果?

我已将SQL Server 2008 为整个脚本生成的执行计划上传到 SQLPerformance.com

join sql-server optimization execution-plan

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

SQL Server 最大和最小内存配置

在这个用例中,最小内存和最大内存的正确设置是什么?

该服务器有 8GB 内存,双 Intel Xeon 处理器,运行 Windows Server 2008 R2 / Sql Server 2008 标准版。它正在运行多个大小从 30GB 到 5GB 的数据库。

最初将内存使用设置为默认设置(min=0 max=2,147,483,647)。在这些设置中,sqlservr.exe 占用了大部分内存使用量,并且服务器最终需要每天或两天重新启动。一开始它会正常运行,但在一天之内开始在简单的操作上超时,比如使用主键查找记录。

我已经更改了 min=4,096 和 max=6,144。这导致仅使用 1.4GB 内存。但是,现在所有四个 CPU 都以 50-60% 的 CPU 使用率持续运行。尽管服务器要稳定得多,但任务的执行时间大约要长 1/3。

sql-server memory sql-server-2008-r2

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

SQL Server 最小服务器内存

将 SQL 2008 R2 与 SP2 与具有 64 GB RAM 的服务器一起使用。考虑到 SQL Server 仅限于仅与数据库引擎相关的服务,我已将最大服务器内存设置为 58GB。我有一个关于设置最小服务器内存的问题

如果我将最小服务器内存设置为 48 GB 是否意味着

a) 如果 Windows 向 SQL 发送低内存通知——SQL 服务器将修剪其所有池并尝试将内存使用量保持到 48 GB 的内存?

b) 在 Windows 进行积极的工作集修整的情况下 - 是否会将 SQL 服务器的内存使用量保留为 48 GB,为 SQL 的内存使用量设置“下限”。

c) 对最小服务器内存有什么建议吗?

搜索网络——互联网上有大量关于最大服务器内存的信息,但我读到的地方很少(Brent Ozar 博客中的配置最佳实践)将最小服务器内存设置为服务器上可用 RAM 总量的 50%。

sql-server-2008 sql-server sql-server-2012

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

更新大复制维度 (SQL Server PDW)

我们将SQL Server PDW 设备用于我们的数据仓库。我们仓库中的一个表是一个复制表,大约有 2000 万行。作为我们 ETL 过程的一部分,我们需要使这个维度的旧记录过期;但是,我们看到更新少量记录 (<100) 需要 1 个多小时才能完成。如果可以的话,这是我想改进的地方。

当然,我想到的一个选择是将这个维度从复制更改为分布式。我的测试表明,它可以解决 ETL 过程耗时较长的问题(从 1.5 小时缩短到 30 秒),但是针对此维度的分布式版本的所有连接都会受到影响,因为连接几乎从不基于相同的分布柱子。当我查看其中一些查询的执行计划时,我通常会看到ShuffleMove或BroadcastMove操作。

所以我对 PDW 大师的问题是:

还有什么可以做的以提高此维度的复制版本中更新记录的性能吗?

同样,迁移到分布式表似乎不是最好的解决方案,因为它会影响数百个已编写的 SQL 查询和其他人开发的报告。

data-warehouse sql-server sql-server-pdw

8
推荐指数
2
解决办法
1629
查看次数

“清理”在启用即时文件初始化的情况下创建的 SQL Server 数据库文件?

我在我们的 SQL Server 上启用了即时文件初始化,因此数据库文件的“空”部分在分配之前不会归零。我的理解是,这意味着该文件可能包含“已删除”的数据。

所以现在我想在公司外部发送一个数据库的副本(可能是一个备份文件)。但是,文件中存在所有潜在的敏感“已删除”数据。现在我想将文件中未使用的部分归零。

那可能吗?我想我可以创建一个新数据库并复制所有内容,或者可能将数据库的副本还原到另一台服务器而不启用即时文件初始化,然后使用 ShrinkFile 命令积极删除数据库文件的大部分或全部未使用部分,但是有没有更省力省时的方法呢?理想情况下是一个命令,告诉 SQL 将文件归零,就像没有启用即时文件初始化一样。

sql-server sql-server-2008-r2

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

SQL Server - 例如,如何确定理想的内存?

我们有一些虚拟机分配了 X 内存。这个内存量有点随机。它被分配给机器,因为这是物理机器拥有的内存量,因为供应商的建议,或者因为我们对我们认为实例需要多少内存做出了最佳猜测。

我理解内存越多越好,但我也想避免在不需要时向 VM 过度分配内存。另一台机器可以更好地利用内存。

确定每个实际处于活动状态和正在使用的实例的理想内存量的最佳方法是什么?除了页面预期寿命之外,我们还应该查看其他计数器吗?我们有实例的 PLE 为 10k+,而其他实例的 PLE 为 100k+。

任何见解都非常感谢。谢谢,山姆

sql-server memory

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

聚集索引压缩与表压缩 - 它们是一回事吗?

如果我在表的聚集索引上设置压缩(页或行),这与在表上设置压缩相同吗?

SQL Server 为两者提供了选项,这表明它们是不同的,但我的印象是聚簇索引和表本质上是同一件事,我对聚簇索引如何工作的心理模型告诉我压缩聚簇索引还必须压缩表。

sql-server sql-server-2008-r2 compression

8
推荐指数
2
解决办法
5982
查看次数

SQL Server 2008 R2 标准版中的数据加密选项?

我正在帮助一位朋友在 SQL Server 2008 R2 标准版上设置数据加密。根据最初的研究,我认为我可以使用 TDE,但没有意识到它仅适用于 SQL Server 的 Enterprise 或 DataCenter 版本。在进一步研究 SQL Server 2008 R2功能后,我发现它确实允许“数据加密和密钥管理”,但我不确定它的含义或如何实现它。

什么是最有效和低成本的数据加密方法?我应该通过 SQL Server 做一些事情还是只使用第三方工具来加密数据库和备份所在的整个卷?此外,如果有人可以指出一种使用标准版中提供的“数据加密”的方法,我将不胜感激。每次我在 sql server 上搜索加密时,我都会以如何使用 TDE 而告终,而在当前情况下,对于企业规模而言,购买企业版是不可行的。

加密的原因 - HIPAA 合规性。如果可以访问文件系统以进行数据库或备份,则数据将被加密并且无法使用。这可能包括对机器的物理访问或通过本地管理员访问。

sql-server sql-server-2008-r2 encryption

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

创建具有较大初始大小的新数据库

我想创建一个包含 200GB 数据文件 ( .mdf) 和 50GB 日志文件 ( .ldf)的新数据库。

但是它很慢(大约15分钟,仍然没有创建)。而且非常耗时。这是正常的吗?如果是,它做什么需要时间?我可以提高它的创建速度吗?

我正在使用 SQL Server 2008 R2、Windows Server 2008R2、16GB RAM(我在 ssms 中将其限制为 12GB)和 Core i7 Cpu

sql-server

8
推荐指数
2
解决办法
5118
查看次数

GROUP BY 与 MAX 与仅 MAX

我是一名程序员,正在处理一个大表,其方案如下:

UpdateTime, PK, datetime, notnull
Name, PK, char(14), notnull
TheData, float
Run Code Online (Sandbox Code Playgroud)

有一个聚集索引 Name, UpdateTime

我想知道什么应该更快:

SELECT MAX(UpdateTime)
FROM [MyTable]
Run Code Online (Sandbox Code Playgroud)

或者

SELECT MAX([UpdateTime]) AS value
from
   (
    SELECT [UpdateTime]
    FROM [MyTable]
    group by [UpdateTime]
   ) as t
Run Code Online (Sandbox Code Playgroud)

对该表的插入以具有相同日期的 50,000 行的块为单位。所以我认为分组可能会简化MAX计算。

而不是试图找到最多 150,000 行,按 3 行分组,然后计算MAX会更快?我的假设是否正确或 group by 也很昂贵?

performance sql-server group-by query-performance

8
推荐指数
2
解决办法
9409
查看次数