我运行了一个数据库引擎优化顾问会话DTA 来优化我的数据库。
DTA 提出了一些统计建议,但是,我注意到有些包含在其他中,例如在我下面的表 ProductIcon 中:
CREATE STATISTICS [_dta_stat_172123954_1_2_3_4_5_12]
ON [dbo].[ProductIcon]
([ClassID], [SegmentID], [GroupID], [Tier1], [LanguageID], [Active])
go
CREATE STATISTICS [_dta_stat_172123954_11_1_2_3_4_5_12]
ON [dbo].[ProductIcon]
([IconTypeID], [ClassID], [SegmentID], [GroupID], [Tier1], [LanguageID], [Active])
go
Run Code Online (Sandbox Code Playgroud)
这是表定义:
IF OBJECT_ID('[dbo].[ProductIcon]') IS NOT NULL
DROP TABLE [dbo].[ProductIcon]
GO
CREATE TABLE [dbo].[ProductIcon] (
[ClassID] INT NOT NULL,
[SegmentID] INT NOT NULL,
[GroupID] INT NOT NULL,
[Tier1] VARCHAR(10) NOT NULL,
[LanguageID] SMALLINT NOT NULL CONSTRAINT [DF_ProductIcon_LanguageID] DEFAULT ((1)),
[Image] VARCHAR(50) NOT NULL CONSTRAINT [DF_ProductIcon_Image] DEFAULT (''),
[Descr] …Run Code Online (Sandbox Code Playgroud) 我想将整个数据库加载到内存中,但是我该怎么做呢?我有大约 256 GB 的内存,我的数据库大约有 200 GB,所以我可以轻松地处理内存。
当我执行select count(*) from table1sqlserver 自动将表加载到内存之后,我可以非常快速地使用表,但我想知道如何将整个数据库加载到内存中?
如果我select count(*) from在每个表上都这样做,我可以更快地工作,但是有没有其他方法可以将整个数据库加载到内存中?我想通过一个命令加载整个数据库,而不是一个select count(*) from表一个表。
我目前正在建立一个使用 MySQL 数据库的网站,该数据库拥有超过 4000 万行数据。我使用一台服务器存储文件和单独的 mysql 服务器。两台服务器有20核,64G内存。
同时,我可以看到在执行最长的 SQL 查询时,我的 MySQL 服务器最多使用两个内核,因此执行最长的查询需要超过 38 秒。看看下面的结果。
用户@主机:dev_data @ localhost []
查询时间:38.113460 锁定时间:0.000514
Rows_sent: 10 Rows_examined: 48683733
如何配置我的 MySQL 服务器,以便它使用所有 20 个内核来处理查询?MySQL 版本是 5.6。
在下面的结果之上。

我有一个要优化的查询,如下所示:
SELECT 1 FROM HugeView
WHERE (Col1 = 'a' AND @val = 1) OR (Col2 = 'a' AND @Val = 0)
(where Col1 and Col2 are on different tables)
Run Code Online (Sandbox Code Playgroud)
如果我对@Val值 (1/0) 进行硬编码- SQL Server 知道构建一个执行计划,在该计划中它只访问Col1或的相关表Col2。
但是当使用一个变量时,所有的表都会HugeView被访问。
您能否建议一种可以帮助 SQL Server 不访问不必要表的方法?
限制:
option (recompile)HugeView不幸的是,上述所有限制都是产品设计和/或开发范围的一部分——我对此无能为力——只能在我拥有的范围内工作。
但是,我知道它@var是 1 或 0,并且可以根据需要创建和查询(并加入)临时表或“真实”表。
另请注意,我没有从Col1or的表中进行选择Col2- 我仅将它们用于过滤。
我尝试在空表上创建和加入,或者top(@somevar)根据@var的值 - 但没有帮助。
UNION ALL不会有帮助,因为在任何情况下优化器都不知道 …
我有 2 个虚拟机:
VM1 - 8 核 32GB 内存
VM2 - 8 核 64GB 内存
我使用 SSIS 目录在两个 VM 上同时运行相同的进程,所有进程都在它自己的 VM 上执行,因此没有信息通过网络传输..Aaa我发现这些进程的加载时间在 VM2 上相当慢。
加载:
VM1- 15m
VM2- 45m
我检查了一些性能指标并进行了一些基本测试...在加载期间我可以看到 Network I/O Waits
VM1- 600 毫秒/秒
VM2- 750 毫秒/秒
我假设这个网络 I/O 等待来自 SSIS,因为 SSIS 正在对 SQL Server 执行查询,然后批量插入信息,等待统计告诉我这两种情况的等待类型都是 ASYNC_NETWORK_IO。
我还使用 SP_SPACEUSED 进行了测试,以查看同时插入两个表中的行数,结果不是非常准确,但 VM1 几乎使插入的行数翻了一番......
我错过了任何进一步的测试吗?你想到的其他检查吗?
performance sql-server optimization sql-server-2016 query-performance
我有一个大型 MySQL 数据库,它有大约 1,500 个表,数据库文件大约为 30GB。我想建议我一些方法来监控我的数据库的整体健康状况以及如何检查 mysql 模式表的健康状况。
如何从整体上监控数据库的运行状况?我使用 mysql workbence,但由于我是新手,我不知道要检查什么!
我目前正在更新旧的标量值函数,希望能够提高它们的效率或将它们更改为内联 TVF。
在对我的重写进行故障排除时,我在原始代码中遇到了一些奇怪的问题,根据我对 SQL 中变量的理解,这似乎没有意义
如果我要写
Declare @var as Integer
Select @var = col1 from table
Run Code Online (Sandbox Code Playgroud)
然后这将始终返回 col1 中的最后一项。但是,在我正在使用的功能中,情况似乎并非如此。最初,有一个 where 子句根据输入更改结果,但是,删除它后,上述属性应该保持不变。在大多数情况下,确实如此,但也有一些情况并非如此。
大纲大致类似于以下内容:
create function f (
@var1 ... )
returns datatype
begin
Declare @temp1 ... (several vars declared here)
select @temp1 = col1, @temp2 = col2, ..., @tempX = max(colX) from(
select col1, col2, ... ,
colX * (case when name = 'X' then 1 else 0)
from table1
INNER JOIN table2 on ...
inner join table3 on ...
left …Run Code Online (Sandbox Code Playgroud) Microsoft Technet 文章建议将辅助文件组创建为默认文件组(请参阅下面的参考)。辅助文件组应该有多个文件,比如四个,每个文件都放在不同的磁盘上。作为同事的补充经验法则,文件数应等于 CPU 内核数。
我的理解是,这种设置非常适合机械旋转磁盘驱动器,因为旋转磁盘驱动器比固态驱动器慢得多,因此可以通过从多个磁头流式传输数据来提高性能。这种理解是否正确?
如果是,那么我的问题是基于成本的优化器是否考虑了较新的固态驱动器?当切换到新的固态驱动器时,旋转硬盘驱动器的性能瓶颈似乎消失了。我们的 IT 运营小组告诉我,虽然我目前被分配了一个虚拟驱动器,但数据实际上存储在 ISCSI SAN 上,它有多个固态驱动器。
这个问题旨在回答对于这种规模的大型数据库来说,最佳设置是什么:
我正在处理的当前项目需要一个可扩展的数据库,该数据库的大小将达到几 TB,用于存储大量日志数据。一周的样本大约有 1.5 亿条记录,我们需要存储 3 年的滚动日志。所以,我现在正在寻找长时间运行的查询来查找数据。我已经将索引调整到几乎所有工作都归因于非聚集索引搜索的程度;优化器不建议添加缺失的索引。
笔记
Microsoft SQL Server 上的许可目前由 CPU 内核决定。因此,在这个问题上投入更多内核是很敏感的,尤其是在这不会提高性能的情况下。
此外,我目前正在 SQL Server 2014 上进行开发,但将迁移到 SQL Server 2017 进行开发和生产。
更新 1
该项目将每晚加载日志,我预计很少(可能没有)更新或删除,因为日志根本不会改变 - 所以它们不会被重新加载。出于分析目的,将读取其他所有内容。
系统表的 PRIMARY 文件组,其中 SECONDARY 默认文件组用于其他所有内容。这样做的原因由本问题底部引用的链接解释。
将为表分区创建单独的文件组。数据库中还有其他足够小的表,它们将驻留在 SECONDARY 文件组中 - 我只对两个表进行分区,其中一个超过 1 亿条记录(按 IDENTITY 行号分区),另一个将进入数十亿条记录(按时间划分[每月])。
我计划在 3 年内按月进行分区。因此,将有 36 个分区。我将为每年创建文件组,然后将 12 个文件放入相应的年度文件组中。分区策略是为了减少读取时间,因为会有大量数据扫描用于分析目的。年度文件组策略严格来说是为了便于 DBA 维护,他们可以通过删除单个文件组来删除一年的数据。
参考:
sql-server optimization filegroups partitioning configuration
今天与一位同事就优化 case 语句进行了有趣的讨论,以及是否最好将具有重叠标准的 case 语句作为单独的 when 子句保留,或者为每个重叠语句创建一个嵌套的 case 语句。
例如,假设我们有一个包含 2 个整数字段的表,a 列和 b 列。这两个查询中的哪一个对处理器更友好?由于我们只使用嵌套语句评估 a=1 或 a=0 一次,这对处理器来说是否更有效,还是创建嵌套语句会消耗该优化?
case 语句的多个标准:
Select
case
when a=1 and b=0 THEN 'True'
when a=1 and b=1 then 'Trueish'
when a=0 and b=0 then 'False'
when a=0 and b=1 then 'Falseish'
else null
end AS Result
FROM tableName
Run Code Online (Sandbox Code Playgroud)
嵌套 case 语句:
Select
case
when a=1 then
case
when b=0 then 'True'
when b=1 then 'Trueish'
end
When a=0 then
case
when b=0 then 'False' …Run Code Online (Sandbox Code Playgroud) 我编写了一个程序来测试对单个数据库表的并发读取。我预计未来会有大量读取(无删除、插入或更新)流量,使用即席查询,这就是我预先测试以模拟这一点的原因。根据下面的日志,您可以看到随着并发读取数量的增加,完成请求所需的时间也会增加。从单个请求的 3 秒到 20 个并发请求的最长 15 秒。
我认为我不是不合理,当我向数据库发送垃圾邮件请求时,我预计它需要更长的时间来处理,但不是这么大的因素。尤其是因为服务器不受 CPU 限制,正如 SQL Server 性能仪表板在 20 个并发请求期间 CPU 使用率为 40% 所证明的那样。
Started 1.
Ended 1. Elapsed milliseconds: 2938
Started 2.
Started 4.
Started 5.
Started 3.
Started 1.
Ended 1. Elapsed milliseconds: 3204
Ended 3. Elapsed milliseconds: 4486
Ended 5. Elapsed milliseconds: 5185
Ended 2. Elapsed milliseconds: 5261
Ended 4. Elapsed milliseconds: 6075
Started 1.
Started 5.
Started 7.
Started 3.
Started 6.
Started 4.
Started 8.
Started 9.
Started 2.
Started …Run Code Online (Sandbox Code Playgroud) optimization ×10
sql-server ×7
mysql ×2
cache ×1
filegroups ×1
functions ×1
innodb ×1
memory ×1
partitioning ×1
performance ×1
statistics ×1
subquery ×1