这是一个关于在 Postgresql(9.5 或 9.6)中短路昂贵的 JOIN 或子查询的问题。我也有兴趣了解人们通常如何解决先检查后执行的问题。
我正在编写很多只应有条件地返回结果的查询,例如(网络)用户是否拥有记录或记录是否被修改。我试图阻止在 Postgresql 中构建昂贵的视图和多个来回查询来检查应用程序本身中的条件,因此我尝试编写首先选择正确记录并显示哪些条件失败的查询,并且只执行查看条件是否通过。
例如,这会在返回之前检查(应用程序)用户是否拥有记录:
SELECT is_owner, is_newer, json
FROM (
SELECT id, owner = '053bffbc-c41e-dad4-853b-ea91fc42ea18' "is_owner"
, modified >= created "is_newer"
FROM datasets
WHERE id = '056e4eed-ee63-2add-e981-0c86b8b6a66f'
) cond
LEFT JOIN LATERAL (
SELECT id
FROM datasets
WHERE is_owner and is_newer
) authed
ON cond.id = authed.id
LEFT JOIN LATERAL (
SELECT json
FROM view_dataset
WHERE id = authed.id
) dataset
ON true;
Run Code Online (Sandbox Code Playgroud)
结果(是所有者):
is_owner | is_newer | json
t t {...}
Run Code Online (Sandbox Code Playgroud)
和负面结果(不是所有者):
is_owner …Run Code Online (Sandbox Code Playgroud) 我在一个表中有1.5M行。以下是表创建代码:
CREATE TABLE `jobs` (
`id` INT(8) NOT NULL AUTO_INCREMENT,
`job_id` VARCHAR(50) NOT NULL DEFAULT '',
`title` VARCHAR(255) NOT NULL DEFAULT '',
`company` VARCHAR(255) NOT NULL DEFAULT '',
`city` VARCHAR(50) NOT NULL DEFAULT '',
`state` VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE INDEX `job_id` (`job_id`),
FULLTEXT INDEX `search` (`title`, `company`, `city`, `state`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
Run Code Online (Sandbox Code Playgroud)
下面的查询大约需要0.3秒,这是非常高的。
SELECT id
, title
, company
, state
, city
FROM `jobs`
WHERE MATCH (title, company, state, city) …Run Code Online (Sandbox Code Playgroud) 在另一个线程中:
OP 想要过去 365 天的滑动平均值。ROWS BETWEEN ...如果可以保证每天恰好发生一次,则使用会很好,但这里的情况并非如此。RANGE BETWEEN ...看起来很合适,但我不清楚它在 DB2 中的含义。不确定 db2 没有INTERVAL类型是否重要,但用标记的持续时间模仿它。
指定当前行之前的行数范围或行数。如果指定了 ROWS,则 unsigned-constant 必须为零或表示行数的正整数。如果指定了 RANGE,则 unsigned-constant 的数据类型必须与 window-order-clause 的 sort-key-expression 的类型相当。sort-key-expression 只能有一个,并且 sort-key-expression 的数据类型必须允许减法。如果 group-bound1 是 CURRENT ROW 或 unsigned-constant FOLLOWING,则不能在 group-bound2 中指定该子句。
指定当前行之后的行数范围或行数。如果指定了 ROWS,则 unsigned-constant 必须为零或表示行数的正整数。如果指定了 RANGE,则 unsigned-constant 的数据类型必须与 window-order-clause 的 sort-key-expression 的类型相当。sort-key-expression 只能有一个,并且 sort-key-expression 的数据类型必须允许添加。
DB2 允许以下结构:
values current_date - 1
Run Code Online (Sandbox Code Playgroud)
默认单位日期是天,所以这意味着:
values current_date - 1 day
Run Code Online (Sandbox Code Playgroud)
鉴于此,我希望此示例能够正常工作:
create table test
( …Run Code Online (Sandbox Code Playgroud) 在尝试回答从现有字符串列创建整数 id 列(整数编码?)时,结果发现我需要我自己的 postgres 版本来使用。我已经安装了一个不错的 postgres 版本:
stack=# select version();
version
--------------------------------------------------------------------------------
------------------------
PostgreSQL 11.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 9.1.1 20190503 (R
ed Hat 9.1.1-1), 64-bit
Run Code Online (Sandbox Code Playgroud)
但它没有 pgcrypto 模块:
stack=# CREATE EXTENSION pgcrypto;
ERROR: could not open extension control file "/usr/pgsql-11/share/extension/pgcrypto.control": No such file or directory
Run Code Online (Sandbox Code Playgroud)
所以我安装了:
sudo dnf install postgresql-contrib
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到同样的错误。如果我查看:
]$ ls /usr/pgsql-11/share/extension/
plpgsql--1.0.sql plpgsql.control plpgsql--unpackaged--1.0.sql
Run Code Online (Sandbox Code Playgroud)
我还需要安装其他软件包吗,或者我还缺少其他东西吗?
更新:
rpm -qa postgresql\*
postgresql-contrib-11.3-1.fc30.x86_64
postgresql11-11.4-1PGDG.f30.x86_64
postgresql-11.3-1.fc30.x86_64
postgresql11-server-11.4-1PGDG.f30.x86_64
postgresql11-libs-11.4-1PGDG.f30.x86_64
Run Code Online (Sandbox Code Playgroud)
我收到 dnf install postgresql11-contrib 错误:
[...] 无法同步存储库“fedora-modular”的缓存错误:无法同步存储库“fedora-modular”的缓存
pdgd …
I have 2 identical DBs, one of the tables has C1, C2, C3 , composite key. I'm trying to get the rows from B that are not present in DB A.
I have tried many approaches, but at this time I even can't re-use this suggestion due too the late hour.
I think it should be by something like
Select * from B
where not exists
(SELECT a.C1, a.C2, a.C3
from A.table as a, b.table as b
where a.C1=b.C1
, …Run Code Online (Sandbox Code Playgroud) 我想阻止用户更改 MS SQL Server 数据库中的某些列。我无法将该列锁定为 READ ONLY,因为对该列进行了更改。让我尽可能解释清楚。我们的 ERP 允许我通过用户的安全选项卡阻止某些字段/列。听起来很棒。但是,如果一个人使用 ODBC 或 DSN 连接,他们将能够更改数据。例如,我不希望用户能够更改客户订单表中的成本或任何财务内容,但对他更正不正确的地址或运输信息没有任何问题。如果我将表锁定为只读,那么使用 ERP 也会阻止该列。我希望我在这里说得通。谢谢!
我正在将数据库从本地迁移到 Azure 托管实例。为了移动数据库,我正在使用组织每周完整备份,并且我要求他们在应用程序脱机后进行比较(数据库非常大)。
问:我可以在 Azure 托管实例上还原差异备份吗?
当我尝试在没有恢复的情况下恢复完整内容时,而不是应用差异。我收到错误:“azure 托管实例中不支持使用 norecovery 进行还原”
我的能量计每分钟将(累计)消耗写入 db。为了获得我今天的消费,我使用:
SELECT
(MAX(energy_kwh) - MIN(energy_kwh)) AS kwh_today
FROM logging.main_meter
WHERE DATE_FORMAT(strtime, '%Y-%m-%d') = CURDATE();
Run Code Online (Sandbox Code Playgroud)
问题是: max() 和 min() 似乎大大减慢了查询速度。我在列中添加了一个键,energy_kwh但没有帮助。我敢打赌有更好的方法来获得计算的第一个和最后一个记录。
表格(实际上要大得多,约 130 列,所以我将其缩小到相关部分):
CREATE TABLE 'main_meter`
(
id int(11) NOT NULL AUTO_INCREMENT,
timestamp int(11) DEFAULT NULL,
strtime datetime DEFAULT NULL,
energy_kwh double unsigned DEFAULT '0',
) ENGINE=InnoDB AUTO_INCREMENT=1717655 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud) 当我尝试创建一个过程时,我收到一条错误消息:
SQL80001:不正确的语法:“Create Procedure”必须是批处理中的唯一语句
这是我的程序:
CREATE PROCEDURE [dbo].[USP_UserRoles_Select]
(
@Rolename VARCHAR(30) = ''
)
AS
BEGIN
Select ID,Name
FROM
AspNetRoles
WHERE
Name like @Rolename +'%'
END
Run Code Online (Sandbox Code Playgroud)
错误是什么意思以及如何修复它?