小编Len*_*art的帖子

通过条件过滤优化昂贵的连接/子查询

这是一个关于在 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)

postgresql join

7
推荐指数
1
解决办法
3558
查看次数

MySQL全文选择性能

我在一个表中有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)

mysql myisam full-text-search wamp

5
推荐指数
1
解决办法
1827
查看次数

如果 x 是日期,`(ORDER BY x RANGE BETWEEN n PRECEDING...)` 的含义是什么?

在另一个线程中:

/sf/ask/2643176161/

OP 想要过去 365 天的滑动平均值。ROWS BETWEEN ...如果可以保证每天恰好发生一次,则使用会很好,但这里的情况并非如此。RANGE BETWEEN ...看起来很合适,但我不清楚它在 DB2 中的含义。不确定 db2 没有INTERVAL类型是否重要,但用标记的持续时间模仿它。

文档说:(https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0023461.html

无符号常量 PRECEDING

指定当前行之前的行数范围或行数。如果指定了 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)

db2 window-functions db2-10.5 db2-luw

5
推荐指数
1
解决办法
975
查看次数

如何安装pgcrypto?

在尝试回答从现有字符串列创建整数 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 …

postgresql linux

4
推荐指数
1
解决办法
1万
查看次数

Exclude composite key from select

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)

select

2
推荐指数
1
解决办法
1526
查看次数

防止用户更改 MS SQL Server 数据库中的某些列

我想阻止用户更改 MS SQL Server 数据库中的某些列。我无法将该列锁定为 READ ONLY,因为对该列进行了更改。让我尽可能解释清楚。我们的 ERP 允许我通过用户的安全选项卡阻止某些字段/列。听起来很棒。但是,如果一个人使用 ODBC 或 DSN 连接,他们将能够更改数据。例如,我不希望用户能够更改客户订单表中的成本或任何财务内容,但对他更正不正确的地址或运输信息没有任何问题。如果我将表锁定为只读,那么使用 ERP 也会阻止该列。我希望我在这里说得通。谢谢!

database-design sql-server locking

2
推荐指数
1
解决办法
858
查看次数

在 azure 托管实例上恢复差异备份?

我正在将数据库从本地迁移到 Azure 托管实例。为了移动数据库,我正在使用组织每周完整备份,并且我要求他们在应用程序脱机后进行比较(数据库非常大)。

问:我可以在 Azure 托管实例上还原差异备份吗?

当我尝试在没有恢复的情况下恢复完整内容时,而不是应用差异。我收到错误:“azure 托管实例中不支持使用 norecovery 进行还原”

sql-server azure-sql-database azure-sql-managed-instance

2
推荐指数
1
解决办法
2128
查看次数

不使用 min() max() 获取选择的第一条和最后一条记录

我的能量计每分钟将(累计)消耗写入 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)

mysql query-performance

2
推荐指数
1
解决办法
766
查看次数

SQL80001:不正确的语法:“Create Procedure”必须是批处理中的唯一语句

当我尝试创建一个过程时,我收到一条错误消息:

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)

错误是什么意思以及如何修复它?

sql-server stored-procedures

1
推荐指数
1
解决办法
7018
查看次数