因此,在基本编码和测试过程中,我们看到多个表的 Identity 值出现了巨大的无模式跳跃。我们不知道任何服务器故障或尝试进行批量操作,但 DBA 正在查看日志。
差距不是典型的 1,000 或 10,000 与服务器重启等情况。
对于Application_NO具有 2,320 行的表,其间隔为10,410,345
Transaction_Payment_NO 对于包含 685 条记录的表,跳出惊人的 1,712,149,313 条记录。
关于什么可能导致如此大且看似随意的跳跃的任何想法?
我们的 SQL Server 面临性能问题。
7 台服务器,都运行相同的应用程序,都存在相同的问题。
SELECT @@VERSION
Microsoft SQL Server 2017 (RTM-CU19) (KB4535007) - 14.0.3281.6 (X64) Jan 23 2020 21:00:04 Copyright (C) 2017 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)
当您查看累积的服务器总等待统计信息时,会显示 99% ASYNC_NETWORK_IO。我们首先假设这是由应用程序引起的。然而:
当我们获取查询(从应用程序捕获)并从 SSMS 中将其作为测试运行时,执行后忽略结果。当我们通过 TCP 连接运行它时,大约需要 6 秒,通过命名管道连接运行它大约需要 50 秒。我们得到的结果非常慢。
(不考虑执行后的结果,查询给出的结果为 57k 行 227 列,大小为 221MB。)
它是核心版本,因此我们无法使用本地连接。我们测试了使用 TCP 和命名管道进行远程连接。
通过 TCP
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time …Run Code Online (Sandbox Code Playgroud) 我们实现了一个 Google 风格的搜索,其中在前端触发去抖动后运行 SQL 查询。(我们知道 SQL 可能是错误的技术,但我在这里陷入了启动混乱。)查询:
SELECT
TOP(50) [Name], [Surname]
FROM
[dbo].[Clients]
WHERE
[Name] LIKE @SearchTerm + '%' OR
[Surname] LIKE @SearchTerm + '%'
Run Code Online (Sandbox Code Playgroud)
这是一个相当大的表,所以我在两列上添加了两个非聚集索引以帮助加快速度:
CREATE NONCLUSTERED INDEX [IX_Patients_Name] ON [dbo].[Clients]
(
[Name] ASC
)
INCLUDE([Surname]);
CREATE NONCLUSTERED INDEX [IX_Patients_Surname] ON [dbo].[Clients]
(
[Surname] ASC
)
INCLUDE([Name]);
Run Code Online (Sandbox Code Playgroud)
我的想法是 SQL 会在两列上进行索引查找,但查询优化器似乎决定使用索引扫描。
对于这个简单的用例,这可能不是一个真正的问题,但我们有更复杂的版本,具有多个连接等。
有什么方法可以优化此查询以使用搜索吗?
我正在考虑获得 Microsoft DBA 认证,但是试图找出我应该学习的确切证书有点令人困惑。
我的公司使用本地 SQL Server 2017,但似乎 Azure 数据库变得非常流行。那么,现场会消失吗?
“MCSA:SQL 2016 数据库管理”是我需要的吗?
如果我收到“MCSA:SQL 2016 数据库管理”,我是否能够管理 Azure DB?那有多不同?
谢谢
我正在通过 BCP 创建一些报告以通过电子邮件发送。
create TABLE ##tempsss
(
create TABLE ##JOB_DataAssociacao_verContrato
(
F1 VARCHAR(6)
,F2 VARCHAR(200)
,F3 VARCHAR(22)
,F4 char(1)
,F5 varchar(10)
,F6 varchar(15)
,F7 varchar(30)
,F8 varchar(10)
,F9 VARCHAR(18)
) --it needs to be varchar to be able to use header
)
insert into ##tempsss
SELECT
...fields...
FROM some table or view
go
-------------------------------------------------------------
--passo 2 --
exec xp_cmdshell 'bcp "select ''field1'',''field2'',''field3'' UNION ALL select * from table or view" queryout "filepath\filename.xls" -U sa -P password -w -S servername'
------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) 我有一张桌子,除了每个 groupID 的最大日期之外,我还想在其中提取所有内容。有没有简单的方法来做到这一点?
这是我想要做的:
SELECT
groupId,
Types,
MAX(Dates) as date
FROM TableData
Where Dates < Max(dates)
GROUP BY
groupId,
Types
//The table looks as follows:
ID | GroupID | Date
1 | A | 10-10-2020 -> don't show
2 | A | 09-10-2020
3 | A | 08-10-2020
4 | B | 10-10-2020 -> don't show
5 | B | 09-10-2020
6 | B | 08-10-2020
//Expected result:
GroupID | Date
A | 09-10-2020
A | 08-10-2020
B | 09-10-2020 …Run Code Online (Sandbox Code Playgroud) 我的云提供商阻止我访问fn_LocalTimeToUTC和fn_UTCToLocalTime.
我将如何在不使用这些函数的情况下在 SQL 中手动和直接获得这两个函数提供的相同功能?
为了进一步简化,我们所有的用户都在英国。
我正在 SQL Server 2017 上运行加密备份。
进行测试恢复,失败:
RESTORE DATABASE [test]
FROM DISK = N'\\DPH-DD-SLI-001\SLI_SQL_Backups\Encrypted\DPH-SQL-SLI-12P\BTBLEAD\FULL\DPH-SQL-SLI-12P_BTBLEAD_FULL_20201021_185145.bak'
WITH NORECOVERY, REPLACE;
RESTORE DATABASE [test]
FROM DISK = N'\\DPH-DD-SLI-001\SLI_SQL_Backups\Encrypted\DPH-SQL-SLI-12P\BTBLEAD\DIFF\DPH-SQL-SLI-12P_BTBLEAD_DIFF_20201022_071002.bak'
WITH NORECOVERY;
Run Code Online (Sandbox Code Playgroud)
Processed 199264 pages for database 'test', file 'BTBLEAD_Data' on file 1.
Processed 2 pages for database 'test', file 'BTBLEAD_Log' on file 1.
RESTORE DATABASE successfully processed 199266 pages in 446.348 seconds (3.487 MB/sec).
Msg 3136, Level 16, State 1, Line 6 This differential backup cannot be restored
because the database has not been restored to …Run Code Online (Sandbox Code Playgroud) SQL Server 是否支持对同一数据库表的并行批量插入?
对我的特定用例的一些说明:
Session.bulk_insert_mappings()方法同时插入20k条数据。我的具体问题:
sql-server-2008 sql-server concurrency bulk-insert sql-server-2017
考虑以下情况。我有一个系统版本的表“测试”。我还有一个表,其中包含我上次检查该表中已修改行的时间。
CREATE TABLE [Delta]
(
Tablename NVARCHAR(50) NOT NULL,
Proccess UNIQUEIDENTIFIER NOT NULL,
LastDelta DATETIME2 NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
我现在想创建一个执行此查询的视图
Fake syntax
SELECT *
FROM [test]
FOR SYSTEM_TIME AS OF (select LastDelta from Delta where TableName = 'Test')
Run Code Online (Sandbox Code Playgroud)
提供日期时间的唯一选项是固定值或参数吗?参数对视图没有用处,固定值也无济于事。
我可以用我自己的查询模拟“for system_time as of”的效果,但我想知道是否有一种我错过的方法,如“假语法”或类似的所示。
sql-server ×10
backup ×1
bcp ×1
bulk-insert ×1
certificate ×1
concurrency ×1
functions ×1
identity ×1
optimization ×1
select ×1
t-sql ×1
waits ×1