我们的生产 postgresql (13.8) 数据库中有一些相当大的查询,超过了默认的 1024 track_activity_query_size
(有些查询超过 100k)。我已将此值提高到 8192,但它仍然无法捕获我们的大部分查询。
我在想:
- 我可以合理地将其设置为多高(我读过最大为 1MB),而不会产生性能问题?
- 如果我将其设置得太高,我可以监控哪些指标来跟踪?
我想将其设置为 256k 或可能更高,但这似乎可能过多。
我们的生产 postgresql (13.8) 数据库中有一些相当大的查询,超过了默认的 1024 track_activity_query_size
(有些查询超过 100k)。我已将此值提高到 8192,但它仍然无法捕获我们的大部分查询。
我在想:
我想将其设置为 256k 或可能更高,但这似乎可能过多。
我正在尝试将单词列表插入到具有以下JSON
类型的列中:
create table my_table (
...
synonyms JSON
...
)
我的查询如下所示:
INSERT into my_table (id, synonyms)
SELECT id, GROUP_CONCAT(DISTINCT synonyms) as synonyms from (
SELECT id, name1,name2, GROUP_CONCAT(DISTINCT name1) as synonyms
FROM products
GROUP BY id
UNION
SELECT id, name1,name2, GROUP_CONCAT(DISTINCT name2) as synonyms
FROM products
GROUP BY id
) t group by id;
如果在第一行没有 INSERT 的情况下运行,该synonyms
列将返回逗号分隔的单词列表:
id name1 name2 synonyms
------------------------------------
1 one a,b one,a,b
2 two c two,c
我想将这些同义词作为 JSON_ARRAY 插入。但是,当单个单词未被双引号括起来时,INSERT 会失败。如果我在选择中添加 JSON_ARRAY:
SELECT name1,name2,id, JSON_ARRAY(GROUP_CONCAT(DISTINCT synonyms)) ...
我得到以下结果:
name1 name2 synonyms
----------------------------
one a,b ["one,a,b"]
two c ["two,c"]
当我想要的是这个(所以它可以直接插入到synonyms
列中):
name1 name2 synonyms
----------------------------
one a,b ["one","a","b"]
two c ["two","c"]
有没有办法用 SQL 来做到这一点,还是在应用程序代码中更好地处理它?
我有一些相当大的 CSV 文件要加载到我的 MySQL 5.7 数据库中。这些文件有几 GB 大小,几百万行长,并且具有必须在连接中使用的大列宽(有时长达约 500 个字符)。
数据都是标准英文字符,大部分列都可以放入一个单字节字符集,如latin1
. 但是,有几列需要 unicode 来表示商标/注册/版权符号、测量符号(英寸、英尺、半径等),因此我一直utf8mb4
在所有表格上使用。
这样做的问题是双重的。它扩大了我们的索引大小,因此在某些情况下,我们无法在列上创建索引,因为宽度变得大于 3072。此外,它似乎对性能产生了重大影响,大概是因为数据大小是 4 倍。
我想做的是latin1
在表中的所有列上使用,并且只utf8mb4
在需要它的列上使用。这导致了我的问题-
确定哪些列实际存储多字节字符的最佳方法是什么?我可以在加载之前在我的 CSV 中(可能使用 python/pandas 吗?)或从数据库中以某种方式检测到这一点?文件存储为 utf8。它们当前被加载到一个utf8mb4
表中。如果我可以轻松地扫描表格并说“此列不包含多字节数据”,我可以将其更改为latin1
.
其次,如果我尝试使用不同编码的列创建复合索引,我会遇到问题吗?假设列A
是 utf8mb4,列B
是 latin1。在这两列上创建索引有什么问题吗?即:CREATE INDEX my_index
ON my_table(A, B);
。我假设这样做没有问题。