对检查表的记录上次更新、修改或删除时间的一些研究使我找到了称为 ora_rowscn 的伪列。
首先,我这样做:
select max(ora_rowscn) from tablename;
我记下了这个数字。然后我执行插入、更新和删除,检查每个之前和之后的最大值。它似乎随着每种类型的变化而增加。
如果您想知道我为什么要这样做,我们会在 C# windows 服务中缓存实体列表。此服务在两个负载平衡的服务器上运行,因此每个服务器都有一个单独的实例运行。当服务器 A 上发生更新时,服务器 B 需要知道它。我想要做的是将 max(ora_rowscn) 缓存到一个变量中。每次我们的应用程序插入、更新或删除一条记录时,它都会从数据库中获得一个新的最大值。如果值不同,那么它显然知道它需要从数据库中获取一个新列表。
所以我的实际问题是:是否还有其他我应该注意的问题可能会导致插入、更新或删除记录而不增加该值?
编辑:有人可以添加ora_rowscn为标签吗?
我想做这个
INSERT INTO AdminAccounts (Name)
SELECT Name
FROM Matrix
Run Code Online (Sandbox Code Playgroud)
但我不想创建重复项。即,我几周前运行了它并且需要更新数据。
有时在具有多列的表中插入数据时,如果插入语句不应该失败,知道必须指定哪些列会很有用。
我写了这个查询来找出哪些列不可为空、标识、计算、时间戳和没有默认值。
select *
from sys.columns
where object_id = object_id('<table>') and
is_nullable = 0 and
is_identity = 0 and
is_computed = 0 and
default_object_id = 0 and
type_name(system_type_id) <> 'timestamp'
Run Code Online (Sandbox Code Playgroud)
此检查中是否应包含任何其他属性?
我正在尝试将数据导入库存类型数据库。这是我的表格(为简洁起见被截断):
创建类型主机为 enum ('Physical', 'Virtual', 'Hypervisor', 'Other');
创建表主机(
id 串行主键,
主机名 varchar(40),
角色hostrole
);
创建表接口(
id 串行主键,
名称 varchar(20),
主机 int 在删除级联上引用主机(id),
mac macaddr
);
我知道我可以将 a 嵌套select到一个insert语句中,我的问题是我是否可以insert将 an嵌套到 an 中insert(如果可以,该怎么做)。这是我试图运行的语句:
插入界面
(姓名,
苹果电脑,
主持人)
价值观
('eth0',
'00:50:56:9d:34:d4',
(插入主机(主机名,主机角色)值('foobar','Virtual')返回 id)
);
错误出现在嵌套插入的“进入”处。我可以一次性完成此操作,还是必须进行单独的查询才能执行此插入操作?
下面是我正在使用的 MySQL 表布局。基本上,我想增加浏览量、观察者和查询,因为它们通过网站的前端发生。我的问题是如何在第一次访问 ID: 1106 或 1107 时使用 MySQL 插入创建一个新的 _views 行?
ID 键值 ----- ----- ------ 1104 _reserve 10000 1104 _views 100 第 1104 章 1104 _inquiries 1 1105 _reserve 1500 1106 _reserve 24000 第 1106 章 1107 _reserve 45300
我的 SQL Server 2008 R2 实例有问题。上周的表现突然崩溃了。所有插入都非常非常缓慢。它需要比以前长4-5倍。在硬件上我们没有发现任何缺陷。一个月前我们遇到了同样的问题,但一周后问题消失得很快。
我不是这些方面的专家,但我注意到实例上所有数据库的性能都很差。CPU 和磁盘未达到极限,因此应该不是硬件性能问题。
我将使用此查询查看缓存页数:
select
count(*)as cached_pages_count,
obj.name as objectname,
ind.name as indexname,
obj.index_id as indexid
from sys.dm_os_buffer_descriptors as bd
inner join
(
select object_id as objectid,
object_name(object_id) as name,
index_id,allocation_unit_id
from sys.allocation_units as au
inner join sys.partitions as p
on au.container_id = p.hobt_id
and (au.type = 1 or au.type = 3)
union all
select object_id as objectid,
object_name(object_id) as name,
index_id,allocation_unit_id
from sys.allocation_units as au
inner join sys.partitions as p
on au.container_id = p.partition_id …Run Code Online (Sandbox Code Playgroud) 我正在尝试插入一个字符串化的 JSON,如下所示:
'{"test": "string with \"escaped quotes\" does not work"}'
Run Code Online (Sandbox Code Playgroud)
进入 MySQL JSON 字段,但我总是收到错误消息:
SQL 错误 (3140):无效的 JSON 文本:“对象成员后缺少逗号或‘}’。”
在值(或列)中的位置 24 '{"test": "带有"转义引号"的字符串不起作用"}'。
知道什么可能导致问题吗?
完整的INSERT声明是:
INSERT INTO test(json_test)
VALUES ('{"test": "string with \"escaped quotes\" does not work"}');
Run Code Online (Sandbox Code Playgroud) 以下是同一事物的两种不同语法。
带有COPY TABLE AS SELECT( CTAS)。
CREATE TABLE main
AS
SELECT *
FROM other;
Run Code Online (Sandbox Code Playgroud)作为单独的语句CREATE TABLE和INSERT INTO
CREATE TABLE main (like other);
INSERT INTO main
SELECT *
FROM other;
Run Code Online (Sandbox Code Playgroud)我观察到的CTAS比明显快CREATE TABLE.. INSERT。第一个需要 20 秒才能完成执行。第二个语法二需要 1 分 15 秒才能完成执行。
差异的原因可能是什么?
我正在开发一个数据仓库。我们每晚刷新的一个临时表有大约 1000 万行。我们正在使用自定义构建的 ETL 工具,我无法对其进行太多更改。该工具像这样加载这个临时表:
truncate stage_table;
insert into stage_table with (tablockx) (column1, column2, etc...)
exec load_stage_table @batch_id = @batch_input
Run Code Online (Sandbox Code Playgroud)
的内容load_stage_table有一些设置和选择语句。我无法分享确切的代码,但这是一个基本示例。
create table load_stage_table
(
@batch_id varchar(max) = null
)
as
-- <update batch_id in batch_table>
-- collect data
select
column1 = table1.column1,
column2 = table2.column2,
...
from table1
join table2
on table2.id = table1.table2_id
-- many more similar joins
Run Code Online (Sandbox Code Playgroud)
问题是,当我按照 ETL 工具运行的方式运行存储过程时,运行时间几乎是 30 分钟。但是,如果我修改存储过程以在内部包含插入语句,则只需 1 分钟。
create table load_stage_table
(
@batch_id varchar(max) = null
)
as
-- …Run Code Online (Sandbox Code Playgroud) performance sql-server insert sql-server-2016 exec query-performance
我有一个dbo.Groups定义如下的表:
CREATE TABLE dbo.Groups
(
GroupID int NOT NULL IDENTITY (1,1) PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)
该表实际上只包含一IDENTITY列。
有时我想一次插入多行并获取生成的 ID。(我已经有一个预定义的表变量,@output其中包含ID要在OUTPUT子句中使用的单个列。)
现在我知道如果它是单行我将如何进行:
INSERT INTO
dbo.GroupID
OUTPUT
inserted.GroupID INTO @output (ID)
DEFAULT VALUES
;
Run Code Online (Sandbox Code Playgroud)
但我希望能够一次性插入两个或更多。实际数量由此查询返回的行数决定:
SELECT
*
FROM
dbo.MySource
;
Run Code Online (Sandbox Code Playgroud)
因此,如果查询返回一行,我想插入一行dbo.Groups并返回生成的GroupID. 如果它是一百行,那么我希望插入一百行并同时生成和返回一百个 ID。
一种明显的方法是在循环中一次插入一行。我想避免这种情况,而是使用基于集合的方法,类似于
INSERT INTO
dbo.GroupID
OUTPUT
inserted.GroupID INTO @output (ID)
SELECT
... -- what?
FROM
dbo.MySource
;
Run Code Online (Sandbox Code Playgroud)
有没有办法IDENTITY在(最好)单个语句中只用一列将多行插入到表中?
insert ×10
mysql ×3
sql-server ×3
performance ×2
postgresql ×2
bulk-insert ×1
cache ×1
ctas ×1
delete ×1
exec ×1
identity ×1
json ×1
mysql-5.7 ×1
oracle-10g ×1
row ×1
update ×1
upsert ×1