nvarchar(100)
保存 100 个字节对,如此处所述。LEFT([Your String], 100)
将字符串截断为 100 个字符,如此处所述。这些不一样。
愚蠢的是,我使用了LEFT([Your String], 100)
希望保持[Your String]
在nvarchar(100)
. 正确解决这个问题的惯用方法是什么?我考虑过使用CAST
,但我对隐式截断字符串感到不舒服。
我运行一个长而复杂的查询,在 SSMS 中返回 30 多个字段和 77,000 多行。结果到网格。结果都是以文本为主。SSMS 网格在几秒 (3 - 4) 秒后开始填充结果,但查询执行时间为 2 分钟。这 2 分钟的大部分时间都是附加到 SSMS 网格中的结果。
查询什么时候“完成”?当行开始追加到 SSMS 网格时,它是在前 3 - 4 秒内完成的吗?剩下的 1 分 56 秒只是网格 UI 更新结果吗?如果查询在 3 - 4 秒后“完成”,那么我不应该考虑优化它,对吗?相反,如果查询直到 SSMS 中停止执行(整整两分钟)才完成,那么我应该能够考虑优化它?
我正在 AWS RDS PostgreSQL 实例上运行数据仓库。大多数繁重的工作都是在夜间批处理期间完成的,并且我们经常使用截断重建策略,对于大型表(100M 行)也是如此。
这似乎会导致 autovacuum 问题,在夜间批次 2 到 4 之间,前 10 个 SQL 语句中的 7 个是针对大型表的 VACUUM ANALYZE 语句:
它们占用了我的 RDS 系统
并将字节平衡降至 0,之后机器速度大大减慢:
显然,将 VACUUM ANALYZE 推迟到稍后的时间范围(当机器几乎空闲时)会更明智。
阅读一些文档后,我可以想到两种策略来完成此任务:
autovacuum_cost_delay
一个合理的值。因为这通常会推迟 Vacuum 处理(或者可能仅针对这些表将其设置为合理的值)。然而,在这种情况下,什么是合理的值呢?我读到默认值为 2 毫秒。200ms 应该大多少?10秒?1分钟?60分钟?
我正在寻找一个合理的值来开始测试或其他可以帮助我的建议。
注意。该机器为 2cpu、16GB m6g.large,这些是 autovauccum 相关参数的当前设置:
额外信息 @jjanes是的,它几乎没有达到0的字节平衡,但是,这是我实际上设法实现的一个仔细的平衡。我经常遇到这样的情况:实际上跌到0后需要很长时间才能恢复。例子
然后我的机器也开始增加读/写延迟和 DiskQueueDepth
夜间批量加载涉及很多表(目前约900张),这些表都是在23点到6点30分之间通过作业加载/转换的,最繁忙的时间是2点到4点。许多桌子都很小,只有少数桌子相当大。
@jjanes & @frank-heikens,哪个后续版本确实有所不同?这是从 14 迁移到 15 之前和之后的情况的两张截图: 之前: 之后 :
更新实施了@Laurence Albe 的建议。观察结果:
我正在尝试从活动数据库复制数据库,但我的辅助设备上的连接似乎被阻止。我正在使用 ASM just4info。
目标数据库:
监听器.ora:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = MELISA)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=MELISA)
(ORACLE_HOME=/u01/app/oracle/product/19/dbhome_1)
)
)
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=ON # line added by Agent
tnsnames.ora:
MELISA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = MELISA)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MELISA)
)
)
LISTENER_MELISA =
(ADDRESS = (PROTOCOL = TCP)(HOST = MELISA)(PORT = 1521))
PELISA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PELISA)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PELISA)
)
)
LISTENER_PELISA =
(ADDRESS = (PROTOCOL = TCP)(HOST = PELISA)(PORT = 1521))
辅助的:
监听器.ora:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PELISA)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PELISA)
(ORACLE_HOME=/u01/app/oracle/product/19/dbhome_1)
)
)
tnsnames.ora
LISTENER_PELISA =
(ADDRESS = (PROTOCOL = TCP)(HOST = PELISA)(PORT = 1521))
PELISA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PELISA)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PELISA)
)
)
MELISA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = MELISA)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MELISA)
)
)
LISTENER_MELISA =
(ADDRESS = (PROTOCOL = TCP)(HOST = MELISA)(PORT = 1521))
lsnrctl 状态:
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 05-JAN-2024 09:45:43
Uptime 0 days 0 hr. 5 min. 15 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/diag/tnslsnr/PELISA/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PELISA)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "+ASM_DG_DATA" has 1 instance(s).
Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "+ASM_DG_FRA" has 1 instance(s).
Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "PELISA" has 1 instance(s).
Instance "PELISA", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully
辅助数据库使用 spfile 处于 nomount 状态,当尝试连接到 rman 时,出现以下错误:
connected to target database: MELISA (DBID=3534003804)
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04006: error from auxiliary database: ORA-12528: TNS:listener: all appropriate instances are blocking new connections
我不太确定,这里可能出了什么问题,我停止了防火墙,因为它是测试机。
提前致谢。
我正在尝试使用以下查询将表分区切换为临时表:
create partition function [PFCT_T](datetime2) as range right for values ()
create partition scheme [PSCH_T] as partition [PFCT_T] all to ([primary])
create table T(A1 datetime2 not null, A2 int not null) on [PSCH_T](A1)
create clustered columnstore index [CIX_T] on dbo.T
insert into T(A1, A2) values ('2024-01-01 00:00:00', 1)
select top 0 * into #T from T
create clustered columnstore index [CIX_#T] on #T
alter table T switch partition 1 to #T
--Results in:
--Msg 608, Level 16, State 1, Line 15
--No catalog entry found for partition ID 5620492390548766720 in database 23. The metadata is inconsistent. Run DBCC CHECKDB to check for a metadata corruption.
是否无法将分区切换到临时表(它适用于普通表)或者我错过了什么?
我有一个具有唯一索引的表:
CREATE UNIQUE INDEX IF NOT EXISTS tb_sha256_key_idx ON blob_props (sha256, key);
我想在数据库迁移时将其更改为主键,有两种方法:
ALTER TABLE tb ADD CONSTRAINT tb_pkey PRIMARY KEY USING INDEX tb_sha256_key_idx;
DROP INDEX tb_sha256_key_idx
进而ALTER TABLE tb ADD PRIMARY KEY (sha256, key);
sha256
并且key
不是空列(所以它应该可以正常工作)。
我对这两种方法有一些担忧,我正在争论哪一种是数据库迁移期间使用的正确方法:
第二种方法更好,因为通过删除/创建,我们将显着提高索引聚类因子及其由于碎片而产生的大小。从性能的角度来看,这是更可取的。但是在大表上创建索引会导致临时文件很大(这就是为什么我们大多数时候使用 REINDEX 并仅作为最后手段创建新索引)。
想要进一步讨论并获得有关该场景的一些主张和/或更多意见。
以下查询转换表示 13k 行 x 2 列的打包 CSV 的单个字符串。A 列是一个 bigint。B 列是一个smallint。
declare
@dataCsv nvarchar(max) = '29653,36,19603,36,19604,36,29654,36'; -- abbreviated, actually 13k rows
with Input as
(
select Value,
Row = row_number() over (order by (select null)) - 1
from string_split(@dataCsv, ',') o
)
--insert into PubCache.TableName
select 78064 as CacheId,
convert(bigint, i.Value) as ObjectId,
convert(smallint, i2.Value) as BrandId
from Input i
inner hash join Input i2 -- hash to encourage string_split() only once per column
on i2.Row = i.Row + 1
where i.Row % 2 = 0
order by i.Row
执行计划: https://www.brentozar.com/pastetheplan/?id =By0hYPmd6
如计划所示,convert() 的评估发生在连接之前,因此有时(取决于输入的长度),它会失败
nvarchar 值“37645”的转换溢出了 INT2 列。使用更大的整数列。
暂时更改从smallint 到int 的转换可以完成查询,并且检查BrandId 列输出表明,在本示例中它始终只包含值“36”。
有没有一种简单的方法可以将转换(smallint,i2.Value)延迟到连接之后,以便仅转换那些预期的CSV位置?
我意识到还有其他方法来打包字符串流(例如使用多个变量,或交错不同的分割字符等),但我对出于此问题的目的以这种方式解决此示例不感兴趣。谢谢!
示例代码:
show timezone;
TimeZone
---------------
Europe/Berlin
(1 row)
create table foo (ts timestamp without time zone);
insert into foo values ('2023-10-28 23:58:00');
insert into foo values ('2023-10-29 00:58:00');
insert into foo values ('2023-10-29 01:58:00');
select (ts at time zone 'utc' at time zone 'Europe/Berlin')::timestamptz as x from foo order by x;
x
------------------------
2023-10-29 01:58:00+02
2023-10-29 02:58:00+01 <<<<------
2023-10-29 02:58:00+01
(3 rows)
如果标记线不是
2023-10-29 02:58:00+02
?
我的理解是,欧洲/柏林的时钟在凌晨 3 点倒退,因此UTC '2023-10-29 00:58:00'
应该对应于时钟倒退02:58:00
之前,因此仍然是 +02,或者如果您愿意的话,也可以是 CEST。我错了吗?
我在 SQL Server 中创建了一个作业。该作业定期运行以下语句:
Select NationalIDNumber from HumanResources.Employee where BusinessEntityID = '1'
我想将这个查询的结果保存到一个txt文件中。我在我创建的作业的“步骤”选项卡上单击了“高级” 。我在那里写了路径,但是当作业运行时,没有记录添加到txt文件中。
我还应该怎么做才能将作业结果添加到txt中?
高级选项卡:输出文件 -->D:\Data2\JobOutput.txt
系统视图sys.dm_db_index_usage_stats
有几个列反映系统查询对索引的使用情况。但是,这是什么意思?为什么系统要查询我的表?
该文档不是特别有帮助:
栏目名称 | 数据类型 | 描述 |
---|---|---|
系统搜索 | 大整数 | 系统查询的查找次数。 |
系统扫描 | 大整数 | 系统查询的扫描次数。 |
系统查找 | 大整数 | 系统查询的查找次数。 |
系统升级 | 大整数 | 系统查询的更新次数。 |