小编ype*_*eᵀᴹ的帖子

如果表在多列上具有唯一约束,如何不“复制”表?

我有一个非常大的表 (35GB),它在四个列的组合中是独一无二的。

该表不是很宽,它唯一的四列是较大的列(以字节为单位)。最终结果是保持表唯一的索引是 21GB。这不是索引大小随时间膨胀的结果,而是索引创建后立即的大小。

我根本不需要优化插入速度,因为插入每月只会分批进行一次。一旦插入,任何行都不会进行任何更新。

我正在运行 PostgreSQL 9.5.0。

有没有办法不复制如此大的数据库部分来强制执行唯一约束?可能使用聚集索引之类的东西?

全表说明:

CREATE TABLE medi_cal_base_eligibility (
    client_index_number text NOT NULL,
    medi_cal_date date NOT NULL,
    eligibility_date date NOT NULL,
    aidcode text,
    responsible_county text,
    status text,
    cardinal smallint NOT NULL,
    id SERIAL PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)

索引:

"medi_cal_base_eligibility_pkey" PRIMARY KEY, btree 
    (id)
"medi_cal_base_eligibility_uq_dates_cin_cardinal" UNIQUE CONSTRAINT, btree 
    (eligibility_date, client_index_number, medi_cal_date, cardinal)
Run Code Online (Sandbox Code Playgroud)

postgresql index-tuning postgresql-9.5

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

自定义 ID 编号 - 插入的快速方法?

首先:这是用于序列化的 ETL 存储过程,因此并行性无关紧要。

我需要在加载期间为标记分配自定义 ID 号。我不能使用身份字段,因为 ID 号是唯一的“桶号” - 本质上是另一个编号字段。

我目前使用以下代码:

DECLARE @idRunner smallint
SELECT @idRunner = ISNULL(MAX([Id]),0)
    FROM sim.[Variable]
    WHERE [BucketRef] = @simBucketNo

DECLARE variable_cursor CURSOR FOR
    SELECT DISTINCT p.[Variable]
        FROM simstg.[Parameter] p
        LEFT OUTER JOIN sim.[Variable] v ON (p.[Variable] = v.[Code])
        WHERE p.[BucketRef] = @stgBucketNo
            AND v.BucketRef = @simBucketNo
            AND v.Code IS NULL
OPEN variable_cursor
DECLARE @variable VARCHAR(64)

FETCH NEXT FROM variable_cursor INTO @variable
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @idRunner = @idRunner + 1
    INSERT INTO sim.[Variable] …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

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

SQL Server 中有没有办法使表只能通过触发器插入?

标题是不言自明的,但如果您对我为什么想要这个感到好奇;我想要这个是因为我有一个存档/日志表来存储活动表的过去值,因此我不希望数据有以任何方式受到损害的风险。唯一应该在表上插入的是我在活动表上创建的触发器以记录其更改。在极少数情况下,我们可能需要手动编辑日志表,我将关闭(如果存在)“插入锁”

我将 SQL Server 2012 Enterprise 与 SQL Management Studio 结合使用

trigger sql-server permissions sql-server-2012

5
推荐指数
2
解决办法
2287
查看次数

SQL Server 2016 未使用 2012 年使用的索引

2016年计划在这里

2012年计划在这里

我有几乎相同的表,行数差异很小。一个在 2012 年,另一个在 2016 年。索引是相同的。这些 VM 与升级的 OS 和 SQL Server 版本处于完全相同的环境中。相同数量的 vcores,相同的内存,相同的服务器设置(最大并行度 = 8,并行度的成本阈值 = 30)。

这个简单的单条记录查询使用单列进行过滤和单列返回。where 过滤器中的列是索引中的唯一列。

2016 版有 8254356 行
2012 版有 8254427 行

它们是相同的查询。2016 缺少索引并无缘无故地进行全表扫描。2012 在索引扫描后对表进行 RID 查找(堆)。

WITH (index = CONTACT_RC_NUI1)在2016服务器上试过,成本从991跳到1889。2012的成本是29。

我尝试添加AND 1 = (SELECT 1),但没有任何区别。
我尝试通过使用删除参数嗅探作为可能的问题OPTION (RECOMPILE),但没有任何区别。

DBA 在恢复数据库后运行索引重建。两台服务器都有最近的索引统计更新(我们运行 Ola 的索引更新脚本)。并且可以肯定的是,我在 2016 年重建了索引,这对 2016 年的解释计划没有影响。

我在查询中添加了以下提示...

select address1_stateorprovince 
from dla.dcrm.CONTACT_RC WITH (index = CONTACT_RC_NUI1)
where wv_partyid = 343083;
Run Code Online (Sandbox Code Playgroud)

这导致成本从 991 增加到 1889,即使它显示与 2012 年的解释计划几乎相同(2016 年只是添加了并行性(收集流))。

2016 …

sql-server index-tuning nonclustered-index sql-server-2016

5
推荐指数
2
解决办法
1054
查看次数

是否可以索引 ORDER BY 中使用的计算列?

由于未正确编写查询,我的 mysql 服务器出现问题。我没有使用索引,因为我不知道如何在具有SELECT COUNT(*) AS b ... ORDER BY b.

看起来不可能,所以如果确实不可能,我如何重新管理我的查询?

SELECT COUNT(downloaded.id) AS downloaded_count
    , downloaded.file_name
    ,uploaded.* 
FROM `downloaded` JOIN uploaded 
ON downloaded.file_name = uploaded.file_name 
WHERE downloaded.completed = 1
AND uploaded.active = 1 
AND uploaded.nsfw = 0 
AND downloaded.datetime > DATE_SUB(NOW(), INTERVAL 7 DAY) 
GROUP BY downloaded.file_name 
ORDER BY downloaded_count DESC LIMIT 30;
Run Code Online (Sandbox Code Playgroud)

解释

+----+-------------+------------+------+---------------+-----------+---------+--------------------------+------+----------------------------------------------+
| id | select_type | table      | type | possible_keys | key       | key_len | ref                      | rows | Extra                                        |
+----+-------------+------------+------+---------------+-----------+---------+--------------------------+------+----------------------------------------------+ …
Run Code Online (Sandbox Code Playgroud)

mysql index

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

使用 updlock 锁定提示的副作用?

我只是在探索UPDLOCKSQL-Server 2008 中的提示,我发现它在避免某些死锁场景方面非常有用。使用这些类型的锁定提示时总会有一些副作用,但我找不到任何与此相关的副作用。

那么如果我在所有update查询中都使用它会发生什么?我不是在谈论select,只是update。它将如何对我产生负面影响?

sql-server-2008 sql-server deadlock

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

表权限的通配符

我想授予用户select,insert,update,deleteprod数据库中几个表的权限。但是,我发现将每个授权语句写出每个表很耗时。是否可以使用通配符?

有 300 个表,用户只需要访问其中的 18 个。用户需要访问的表以“vs_”为前缀。

我可以做grant select,insert,update,delete on prod.vs_\*吗?我知道prod.\*是可能的,但不确定表的前缀。

mysql permissions

4
推荐指数
2
解决办法
4678
查看次数

NOT IN(与连接一起)查询

我有两张桌子: PartOrderLine

Part (PartNum PK, PartDesc, Price)

OrderLine (OrderNum PK, PartNum PK, QtyOrdered)
Run Code Online (Sandbox Code Playgroud)

我想找出订购的零件。我想我有一个好主意,但我可能遗漏了一些东西;我认为最有可能在语法上。请检查:

select Part.PartNum
    ,OrderLine.OrderNum
from OrderLine
inner join Part on OrderLine.PartNum = Part.PartNum
where PartNum not in (
        select distinct (OrderNum)
        from OrderLine
        )
Run Code Online (Sandbox Code Playgroud)

这样对吗?

join sql-server t-sql sql-server-2014

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

带有模式匹配的 WHERE 子句以查找包含不在列表中的任何字符的行

我在 SQL Server 2008 环境中。

我试图在WHERE子句中使用模式匹配来查找特定列的值包含非字母数字、下划线、破折号、句点或空格字符的行。

这是我的代码和示例数据,但我没有得到预期的结果。

在示例数据中,我想返回第 7、8、9 和 12 行,但我得到的是第 5 行和第 6 行。

如果这不是实现目标的最佳方式,我愿意听取其他方法。

我不在可以实现正则表达式的环境中,因此我的解决方案仅限于开箱即用的功能。

CREATE TABLE PATTERN_TEST
(
ID INT NOT NULL,
STRING NVARCHAR(40) NOT NULL
)

INSERT INTO PATTERN_TEST
SELECT 1, 'string' UNION 
SELECT 2, 'STRING' UNION 
SELECT 3, 'string space' UNION 
SELECT 4, 'STRING SPACE' UNION 
SELECT 5, 'string-dash' UNION 
SELECT 6, 'string-dash space' UNION 
SELECT 7, 'string "otherchar"' UNION 
SELECT 8, 'string "other char"' UNION 
SELECT 9, '"string"' UNION 
SELECT 10, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

如何更改 Postgresql 日志的语言

现在我的数据库在调用我的用户函数时断开连接。我想寻求帮助,但消息是西班牙语。

我如何让我的日志是英文的?我能理解说的是什么,但不知道该怎么做。

或者至少让它正确显示重音字符,如:

terminando la conexión
terminando la conexión
Run Code Online (Sandbox Code Playgroud)

这是我的 pg_log 文件

2016-12-15 17:50:54 VET LOG:  proceso de servidor (PID 19360) fue terminado por una excepción 0xC0000005
2016-12-15 17:50:54 VET DETALLE:  El proceso que falló estaba ejecutando: SELECT * FROM avl_db.process_avl_pool();
2016-12-15 17:50:54 VET HINT:  Vea el archivo «ntstatus.h» para una descripción del valor hexadecimal.
2016-12-15 17:50:54 VET LOG:  terminando todos los otros procesos de servidor activos
2016-12-15 17:50:54 VET WARNING:  terminando la conexión debido a una falla en otro …
Run Code Online (Sandbox Code Playgroud)

postgresql

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