我有一个非常大的表 (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) 首先:这是用于序列化的 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 2012 Enterprise 与 SQL Management Studio 结合使用
我有几乎相同的表,行数差异很小。一个在 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 …
由于未正确编写查询,我的 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) 我只是在探索UPDLOCKSQL-Server 2008 中的提示,我发现它在避免某些死锁场景方面非常有用。使用这些类型的锁定提示时总会有一些副作用,但我找不到任何与此相关的副作用。
那么如果我在所有update查询中都使用它会发生什么?我不是在谈论select,只是update。它将如何对我产生负面影响?
我想授予用户select,insert,update,delete对prod数据库中几个表的权限。但是,我发现将每个授权语句写出每个表很耗时。是否可以使用通配符?
有 300 个表,用户只需要访问其中的 18 个。用户需要访问的表以“vs_”为前缀。
我可以做grant select,insert,update,delete on prod.vs_\*吗?我知道prod.\*是可能的,但不确定表的前缀。
我有两张桌子: Part,OrderLine:
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)
这样对吗?
我在 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) 现在我的数据库在调用我的用户函数时断开连接。我想寻求帮助,但消息是西班牙语。
我如何让我的日志是英文的?我能理解说的是什么,但不知道该怎么做。
或者至少让它正确显示重音字符,如:
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) sql-server ×6
index-tuning ×2
mysql ×2
permissions ×2
postgresql ×2
t-sql ×2
deadlock ×1
index ×1
join ×1
trigger ×1