Oracle 的DBMS_ADVANCED_REWRITE 文档页面解释了如何声明查询重写并删除它们,但没有解释如何列出数据库中所有声明的重写。
是否可以列出所有声明的重写?
Oracle 的DBMS_ADVANCED_REWRITE 文档页面解释了如何声明查询重写并删除它们,但没有解释如何列出数据库中所有声明的重写。
是否可以列出所有声明的重写?
我创建了 2 个相同的表,由整数列分区。在其中一个表中,计算列,在另一个表中,不计算列。
当我使用计算列查询表并使用聚集索引对单个分区进行排序(假设输出数据已经排序,因此不需要额外的排序)时,它会扫描整个表。
CREATE PARTITION FUNCTION pf_test(int) AS RANGE RIGHT FOR VALUES(1, 2, 3, 4)
GO
CREATE PARTITION SCHEME ps_test AS PARTITION pf_test ALL TO([PRIMARY])
GO
CREATE TABLE test_computed
(
ID BIGINT NOT NULL,
ID_C AS CAST(ID % 4 AS INT) PERSISTED,
PRIMARY KEY CLUSTERED (ID, ID_C) ON ps_test(ID_C)
) ON ps_test(ID_C)
GO
CREATE TABLE test_not_computed
(
ID BIGINT NOT NULL,
ID_C INT NOT NULL,
PRIMARY KEY CLUSTERED (ID, ID_C) ON ps_test(ID_C)
) ON ps_test(ID_C)
GO
INSERT INTO test_computed(ID)
SELECT TOP 1000000 ROW_NUMBER() OVER(ORDER BY GETDATE())
FROM sys.all_columns a
CROSS JOIN sys.all_columns b
GO
INSERT INTO test_not_computed(ID, ID_C)
SELECT TOP 1000000
ROW_NUMBER() OVER(ORDER BY GETDATE()),
ROW_NUMBER() OVER(ORDER BY GETDATE()) % 4
FROM sys.all_columns a
CROSS JOIN sys.all_columns b
GO
数据相同,但每个查询的执行计划不同。
SELECT TOP 100 *
FROM test_computed
WHERE $partition.pf_test(ID_C) = 1
ORDER BY ID DESC
SELECT TOP 100 *
FROM test_not_computed
WHERE $partition.pf_test(ID_C) = 1
ORDER BY ID desc
真实的表有数十亿行;我们使用分区来避免扫描整个表。
SQL Server 版本是
Microsoft SQL Server 2019 (RTM-CU26) (KB5035123) - 15.0.4365.2 (X64)
2024 年 3 月 29 日 23:02:47 版权所有 (C) 2019 Microsoft Corporation
Developer Edition(64 位),Windows Server 2022 Standard 10.0(内部版本 20348) :)
我的 Postgres 表有一个范围列,其中包含带时区的时间戳。我已在范围的下限上创建了一个索引,如下所示:
CREATE INDEX bdg_sys_period_start_idx ON building USING btree (lower(sys_period));
现在我尝试运行以下查询:
select * from building where lower(sys_period) > '2024-05-12 10:31:14.481545+01'::timestamptz;
接下来是有趣的部分。我对表运行 ANALYZE,然后对查询运行 EXPLAIN。我得到了以下结果:
太好了,Postgres 想要使用我的新索引!
然后我启动查询,花了很长时间。我停止查询,然后再次运行 EXPLAIN。令人惊讶的是,查询规划器现在告诉我他想使用顺序扫描。
我发现计划返回的行数从 97k 增加到了 160 万。实际返回的行数是 30 行。
对于这种情况我有很多疑问:
CREATE STATISTICS IF NOT EXISTS sys_period_start_range ON ( lower(sys_period) ) FROM building;
这会有用吗?
ALTER TABLE building ALTER sys_period SET STATISTICS 1000;
这会有用吗?
在此先感谢您的帮助。
规划一些新表,我试图决定索引应该是“升序”还是“降序”。
该表将非常大(我想象每分钟大约有 2000 次插入,最初从大约有 10 亿行的不同表迁移)。
我将为此使用 timescaledb 扩展(按时间进行分区)。
这是创建表的方式:
create table "Sample"(
"id" bigserial,
"deviceId" int not null,
"timestamp" timestamptz not null,
"value" float8 not null
);
select create_hypertable('"Sample"', 'timestamp'); -- creates a desc index on "timestamp"
create index on "Sample"("deviceId", "timestamp"); -- should this be "desc"?
这是我们将运行的两个最常见的查询(当然,deviceId 和时间戳可能会有所不同):
select "timestamp", "value"
from "Sample" where "deviceId"=123 and "timestamp"<'2024-01-01Z'
order by "timestamp" desc limit 1;
和
select "timestamp", "value"
from "Sample" where "deviceId"=123 and "timestamp" between '2024-01-01Z' and '2024-02-01Z'
order by "timestamp" asc;
所以我想了解的是“时间戳”应该按什么顺序排列?为什么?
我的(可能错误的)直觉告诉我带有“时间戳”的索引应该按升序排列,因为我需要按时间戳升序对数据进行排序。
但是,时间刻度文档中的示例总是按降序对时间列进行索引。我不太明白为什么。
这里理想的指数选择是什么?
我看到正在运行的查询 FETCH ALL IN "<unnamed portal 847>"
如何找到该游标附加了哪个查询?
虽然不久前已经发布了针对 Cassandra 3.11.x 的修复版本 3.11.17,但官方 Debian 存储库中的 Debian 软件包的最新版本(https://apache.jfrog.io/artifactory/cassandra-deb/dists/311x/main/binary-amd64/Packages)仍然是 3.11.16。
Package: cassandra
Version: 3.11.16
这有什么特别的原因吗?
谢谢。
我希望此语句将变量数据插入我的 psql 语句中,但我不知道如何初始化 json 语句中的数据。
INSERT INTO audit_log (
action,
result,
input_data,
output_data,
sponsor_id,
user_id)
VALUES(
1020,
1,
'{"Sponsor id": $input_sponsor_id, "User id": $input_username, "Password": $input_password}',
'{"Status": "json return?"}',
input_sponsor_id,
input_user_id);
假设我们有一个table
用户和一个item
用户。这两个表有一个关联表,用于user_item
定义many to many
关系。
我们开始100条item
记录
我们有 5 亿条user
记录。
因此我们必须生成 50_000_000_000 user_item
(500 亿)
我们可能有更多
分片或分区都不容易,因为这样会减慢任何其他操作(否则我们需要扫描所有内容)
假设查询模式 ( INSERT
, SELECT
, UPDATE
) 是基本/典型的 m2m 模式(可以在任何教程或示例中找到)
无论模式如何,处理数据库中数十亿个多对多关系的最佳设计或已知解决方案是什么?
想象一下这个简单的模式
CREATE DATABASE IF NOT EXISTS `playground` CHARACTER SET = latin1;
USE playground;
CREATE TABLE IF NOT EXISTS `user`
(
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
INDEX `user__name_fk` (`name`)
) ENGINE = InnoDB
DEFAULT CHARSET = latin1
ROW_FORMAT = DYNAMIC;
CREATE TABLE IF NOT EXISTS `item`
(
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
INDEX `user__name` (`name`)
) ENGINE = InnoDB
DEFAULT CHARSET = latin1
ROW_FORMAT = DYNAMIC;
CREATE TABLE IF NOT EXISTS `user_item`
(
`user_id` BIGINT UNSIGNED NOT NULL,
`item_id` BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (`user_id`, `item_id`),
INDEX `user_item__item` (`item_id`),
FOREIGN KEY `user_id_fk` (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE,
FOREIGN KEY `item_id_fk` (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE
) ENGINE = InnoDB
DEFAULT CHARSET = latin1
ROW_FORMAT = DYNAMIC;
-- create some default items
INSERT INTO `item` (`name`) VALUES ('item_1'), ('item_2'), ('item_3'), ('item_4'), ('item_5'), ('item_6'), ('item_7'), ('item_8'), ('item_9'), ('item_10');
-- create some users
INSERT INTO `user` (`name`) VALUES ('user_1'), ('user_2'), ('user_3'), ('user_4'), ('user_5'), ('user_6'), ('user_7'), ('user_8'), ('user_9'), ('user_10');
INSERT INTO `user_item` (`user_id`, `item_id`) VALUES (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10);
我并不是在问如何在 MySQL 中使用多对多关系,我知道这一点。我是在问当相关记录的数量呈指数增长到如此大的规模时,针对扩展问题最广为人知的解决方案是什么。
另外,我故意没有添加任何查询模式(INSERT
、、),因为SELECT
这是不相关的。假设最/典型的 M2M 模式。我不想失去对有关扩展和大量数据的真正问题的关注。UPDATE
一定有一些技巧或一些已知的解决方法,对吗?我也在考虑 NoSQL 数据库,因此答案可能包括与 MySQL(或任何 SQL 数据库)无关的任何内容,
我觉得这应该是许多大公司都会面临的一个常见问题,因此应该有一个(或几个)通用的解决方案。这个问题的根本原因是,虽然 MySQL 非常适合创建关系,但它会成倍地增加关联的 m2m 表。
5 亿 x 100 == 500 亿只是一个例子。但理论上可能会发生。
这是一个简单的多对多查询的示例。
SELECT user.*, item.* FROM user
LEFT JOIN user_item ON user.id = user_item.user_id
LEFT JOIN item ON item.id = user_item.item_id
WHERE user.name = 'user_1';
类似但不一样的问题
我正在寻找将托管数据库与本地数据库同步的最佳实践,以用作备份和紧急数据库!
我需要有关最佳解决方案的建议,该解决方案将考虑速度和效率,无需遍历所有数据,并通过仅针对更新来最小化负载
我在 hostgator 上托管了 mysql 数据库