目前我们在同一驱动器上获得了 TEMPDB 数据(数据文件数:2)和日志文件。
在监控过程中,我们发现了 TempDB 上的 I/O 问题。
我们有一个额外的驱动器可用 - 我们应该将 TempDB 日志文件移动到新驱动器,还是应该将第二个 TEMPDb 数据文件移动到新驱动器上以帮助我们减少 I/O 问题?
例如,从这样的表开始:
create table t as
select 'A' as x, level as y from dual connect by level<=5
union all
select 'B' as x, level+2 as y from dual connect by level<=5
union all
select 'C' as x, level as y from dual connect by level<=3
union all
select 'D' as x, level+2 as y from dual connect by level<=3;
alter table t add primary key (x, y);
select * from t;
X Y
- -
A 1
A 2
A …Run Code Online (Sandbox Code Playgroud) 我最近听到了这样的建议:“如果您使用的是 DISTINCT,我会挑战您修复您的代码。” 但是,我想知道这个建议背后的考虑因素,以及这是否意味着我应该以不同的方式处理以下问题。
问题背景
我有一个非规范化的日期维度表(Kimball 星型架构)。在这张表中,我折叠了几个第三范式表:日期、绝对周、绝对月和年。对于这些折叠表中的每一个,我都有一个表示唯一标识的列、一个文本名称列和一个数字手动排序索引。这是显示结构的示例行,数字仅用于说明(为便于阅读采用垂直形式):
为了便于理解,我选择使用日期维度表,但该问题可以转换为任何其他涉及层次结构的维度表。
问题概要
我想用相关的文本字段检索一组不同的周和月组合。
可能的解决方案
1. 与众不同
SELECT DISTINCT MonthId, WeekId, YearName, MonthName, WeekName
FROM DimDate
Run Code Online (Sandbox Code Playgroud)
请注意,我不能排除 MonthId 或 WeekId,因为我不能假设自由文本字段是唯一的。
2. 分组依据
SELECT MIN(YearName), MIN(MonthName), MIN(WeekName)
FROM DimDate
GROUP BY MonthId, WeekId
Run Code Online (Sandbox Code Playgroud)
3. 行号
WITH grp AS (
SELECT …Run Code Online (Sandbox Code Playgroud) 它已建议该DDL在逻辑上进行这样的事情:
begin
COMMIT;
perform any appropriate pre-DDL trigger code;
do the ddl;
perform any appropriate post-DDL trigger code;
COMMIT;
exception
when others then
ROLLBACK;
raise;
end;
Run Code Online (Sandbox Code Playgroud)
这表明触发器中的任何错误都会导致 DDL 回滚。是这种情况吗?
从这个初始数据:
select level as foo, mod(ora_hash(level),4) as bar from dual connect by level<9;
/*
FOO BAR
---------------------- ----------------------
1 3
2 2
3 3
4 3
5 2
6 0
7 3
8 2
*/
Run Code Online (Sandbox Code Playgroud)
我想获取foo, bar, prev_foo每一行prev_foo的值,其中是foo最近的“上一个”行(由foo唯一的排序定义)的值,使得bar该行中的值大于bar当前行中的值。换句话说,我想要这个结果:
/*
FOO BAR PREV_FOO
---------------------- ---------------------- ----------------------
1 3
2 2 1
3 3
4 3
5 2 4
6 0 5
7 3
8 2 7
*/
Run Code Online (Sandbox Code Playgroud)
我如何实现这一目标?
我已经将 PostgreSQL 与 PGAdmin III 一起使用了一段时间,但一直困扰着我,有一个插件菜单选项是空的。我在谷歌上搜索了一些并在这里和那里找到了一个插件,但我想知道是否有我错过的存储库?
如果您不知道 repo 但知道其他插件,请也让我知道它们。
对于以下数据,我希望能够删除一些行并插入其他行并给出以下结果。这是否可以通过单个语句(例如使用merge语句)实现?
create table product(product_id integer primary key);
insert into product(product_id) values(1);
insert into product(product_id) values(2);
insert into product(product_id) values(3);
create table split( parent_id integer not null references product,
child_id integer not null references product,
primary key(parent_id, child_id) );
insert into split(parent_id, child_id) values(1,2);
insert into split(parent_id, child_id) values(1,3);
create table sale(sale_at date, product_id integer references product);
insert into sale(sale_at, product_id) values(sysdate, 1);
insert into sale(sale_at, product_id) values(sysdate, 1);
insert into sale(sale_at, product_id) values(sysdate, 1);
insert into …Run Code Online (Sandbox Code Playgroud) CLUSTER大表上的命令可能需要很长时间,并且在运行时会阻止对表的读取和写入。
我不需要按索引顺序对表中的数据进行严格排序,我只希望通常一起查询的行更有可能位于同一个数据库块中,而不是均匀地分散在表中(这是它们的分布)由于日期插入表格的方式的性质,自然有)。
它可以产生很大的不同。在下面的示例中,唯一的区别是insert有一个额外的,order by mod(g,10)以便测试数据由 预先聚类host_id。当获取一个特定host_id.
是否有某种方法可以在没有排它锁和cluster命令的日志记录开销的情况下实现这种集群?
create schema stack;
set search_path=stack;
--
create table foo(host_id integer, bar text default repeat('a',400));
insert into foo(host_id) select mod(g,10) from generate_series(1,500000) g;
create index nu_foo on foo(host_id);
explain analyze select count(bar) from foo where host_id=1;
/*
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=30188.66..30188.67 rows=1 width=404) (actual time=1129.858..1129.859 rows=1 loops=1)
-> Bitmap Heap Scan on foo (cost=919.27..30066.46 rows=48883 width=404) (actual time=253.149..1110.013 …Run Code Online (Sandbox Code Playgroud) 该文件说:
限制和级联删除是两个最常见的选项。RESTRICT 防止删除引用的行。NO ACTION 意味着如果检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,则这是默认行为。(这两个选择之间的本质区别是 NO ACTION 允许将检查推迟到事务的后期,而 RESTRICT 不允许。) CASCADE 指定当删除引用的行时,应自动删除引用它的行以及。还有另外两个选项:SET NULL 和 SET DEFAULT。当引用的行被删除时,这些会导致引用行中的引用列分别设置为空值或它们的默认值. 请注意,这些并不能免除您遵守任何约束条件。例如,如果操作指定了 SET DEFAULT 但默认值不满足外键约束,则操作将失败。
但是没有说明on delete set null如果只有一个外键列可以为空,或者如果它只是将可空部分设置为空,是否会失败,是吗?
我在数据库中通过清理看到以下数量的登录、注销和注销:
SQL> select action_name, count(*) qty
from Dba_audit_session
group by action_name
order by 1; 2 3 4
ACTION_NAME QTY
--------------------------- ----------
LOGOFF 1946180
LOGOFF BY CLEANUP 754683
LOGON 1026
Run Code Online (Sandbox Code Playgroud)
登录少于注销的 0.1% 是没有意义的。
任何想法为什么?
oracle ×5
postgresql ×3
sql-server ×2
audit ×1
cascade ×1
clustering ×1
ddl ×1
foreign-key ×1
oracle-9i ×1
pgadmin ×1
query ×1
rollback ×1
trigger ×1