我使用下面的查询来搜索整个 xml 中的子字符串(包括节点名称和节点值)
SELECT *
FROM tablename
WHERE ( Charindex('abc',CAST([xmlcolumn] AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)
我想要一个性能比这更好的替代查询。所以请推荐一些。详情如下: 表:
CREATE TABLE [dbo].[tablename](
[Sl_no] [int] NOT NULL,
[Date] [date] NULL,
[Operation] [nvarchar](max) NULL,
[Allot] [nvarchar](50) NULL,
**[xmlcolumn]** [xml] NULL,
[By] [nvarchar](255) NULL,
[Dept] [nvarchar](255) NULL,
[Db] [varchar](255) NULL,
[tabl] [varchar](255) NULL,
[Remark] [varchar](5000) NULL,
[Work] [int] NULL,
[F2] [nvarchar](max) NULL,
[F6] [nvarchar](max) NULL,
[F5] [nvarchar](max) NULL,
[F8] [nvarchar](max) NULL,
[ListC] [nvarchar](255) NULL,
[pro] [nvarchar](max) NULL,
[Completed] [varchar](50) NULL,
[WorkTime] [xml] NULL,
[RelatedData] [varchar](255) NULL,
[User] …Run Code Online (Sandbox Code Playgroud) Oracle 数据库处于开启noarchivelog模式,并tablespace配置了nologging选项,保持不会出现恢复任何数据的情况。
ETL过程中发生了以下场景:
我想知道为什么在这种情况下会生成如此大量的重做。
考虑以下过度重做的上下文:
NOLOGGING无论如何不适用于由MERGE语句产生的任何 UPDATE 操作。/*+ APPEND */插入语句的提示来绕过日志记录,即使 nologging 选项在表/表空间级别处于活动状态也是如此。问题:
1, 2 and 3除了生成如此大容量的 REDO之外,任何人都可以看到任何其他考虑因素吗?非常感谢对上述问题和考虑的任何建设性答案,以便如果我错了,我可以纠正自己。
我一直想知道以下方法是否不好或真的非常糟糕:)。
问题#1:我们可以使用和表indicator_id中的数据进行合并(不使用)[我们知道我们可以,因为我们这样做了,但是它可以接受吗:)]?indicator_valuesindicator_detailsFOREIGN KEY
问题#2:如果我们决定使用indicator_id(indicator_details表中不是PK),它会对性能产生重要影响吗?
正确理解 SQL 方法,最好的选择是在表中使用iid( iidas FOREIGN KEY)indicator_values而不是indicator_id,但项目总是有一些限制(比如用户插入数据的方式 - 下面详细介绍),因此我们试图找到一个折衷的解决方案。
我知道这可能会导致数据完整性问题,但是没有 FK 的解决方案将非常用户友好(因为用户不必担心插入indicator_values表中正确的行 - 具有正确的行iid),特别是在我们的情况下,数据完整性是并不重要。此外,如果用户插入数据的唯一方法(在我们的例子中)是先从表中删除所有行,则使用 FK 的方法将导致在表更新ON DELETE期间从指标值中删除所有行(由...引起)indicator_details(再次 - 更新)意味着:删除所有行然后插入新数据),所以这会很耗时。
D B:
指标值表
+----------+--------------+------+-------+
| vid (PK) | indicator_id | year | value |
+----------+--------------+------+-------+
| 1 | AACA | 2001 | 10 |
| 2 | bbb | 2001 | …Run Code Online (Sandbox Code Playgroud) 我有两个表,其中一个包含下载 url 的历史记录,而另一个表包含有关每个 url 的详细信息。
以下查询按过去一小时内的重复次数对 URL 进行分组。
SELECT COUNT(history.url) as total, history.url
FROM history
WHERE history.time > UNIX_TIMESTAMP()-3600
GROUP BY history.url
ORDER BY COUNT(history.url) DESC
LIMIT 30
Run Code Online (Sandbox Code Playgroud)
上面的查询大约需要 800ms 执行,不够快,但可以接受,
但是,当与缓存表连接时,新查询大约需要25s才能执行,速度非常慢。
SELECT th.total, th.url, tc.url, tc.json
FROM (SELECT COUNT(history.url) as total, history.url
FROM history
WHERE history.time > UNIX_TIMESTAMP()-3600
GROUP BY history.url
ORDER BY COUNT(history.url) DESC
LIMIT 30
) th
INNER JOIN (SELECT cache.url, cache.json FROM cache) tc
ON th.url = tc.url
GROUP BY th.url
ORDER BY th.total DESC
LIMIT …Run Code Online (Sandbox Code Playgroud) 是否有任何可用于 Postgresql 的类似于 SQL Server 查询存储的扩展。这样它可以帮助识别性能瓶颈。
SQL Server 查询存储提供有关查询执行次数、每个查询的资源消耗的信息。https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver15提供了有关查询存储的更多详细信息。
此类警告的典型原因是什么?它们会定期出现,有时每天出现多次,有时则一天左右不会出现。
2021-01-08 13:20:46 203939 [警告] 中止连接 203939 到 db: 'lsv' 用户: 'finder' 主机: '23.227.111.186' (读取通信数据包超时)
该数据库服务器仅被少数主机查询,并且似乎所有主机和主机上的所有数据库都会发生这种情况。该服务器通过 1gbit 链路连接到互联网,并通过 10gbit 本地链路连接到 Web 服务器。
这是 Fedora33 上的 mariadb-10.4.17 服务器,具有 5.9.16 内核和 128GB RAM。这是这个盒子唯一的功能。这种情况已经发生有一段时间了。似乎并不重要,我该如何解决这个问题?这可能是网络问题吗?
如果您有任何想法,我将不胜感激。这是 my.cnf 的内容。
# cat my.cnf |grep -Ev '^$|^#'
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
max_connections=600
replicate_do_db='txrepdb'
replicate_do_db='sqlgrey'
replicate_do_db='sbclient'
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 512M
join_buffer_size = 2M …Run Code Online (Sandbox Code Playgroud) 我们将我们的数据库从 SQLServer 2012 迁移到 SQLServer 2019。我们的 ETL 是在 Visual Studio 中构建的,并且是从主包设置的。masterpackage 调用不同的包,这些包未部署在 SSIS 中。其中一个包调用存储过程。此存储过程调用不同的存储过程。在旧服务器上,此 SP 步骤需要 4 个小时。在新服务器上,此步骤需要 7 个小时。我们可以做些什么来加快这个过程?数据库的兼容级别会影响这个过程吗?如果我们在 SSIS 中部署包会有所帮助吗?我们愿意接受任何建议。
我们已经尝试过的事情:
感谢您的帮助。埃斯米
观看此视频,对 dbms 还很陌生。
演讲者解释说,在面向行的数据库中,行是按块读取的。
所以,我的理解是,如果我有字段较少的行,更多的行可以放入一个块中,当我查询表时,它应该进行更少的 IO 操作,从而获得更好的性能..我对吗?
我可以提取规则,我不应该根据它们代表的实体设计表格,而是根据我阅读或更新这些字段的频率吗?
例如:表雇主:
我想弄清楚PostgreSQL在一段时间内等待锁所花费的时间(在这段时间内,PostgreSQL服务了很多请求)。
PostgreSQL 系统表pg_locks显示一些信息。喜欢:
SELECT * FROM
pg_locks pl LEFT JOIN
pg_stat_activity psa
ON pl.pid = psa.pid;
Run Code Online (Sandbox Code Playgroud)
但是我仍然无法弄清楚它在锁上花费了多长时间。
我发现当我增加 PostgreSQL 的并发性时(例如,增加每个收集的并行工作线程数、最大并行工作线程数或其他一些配置),我的 100 秒多线程 TPC-C-like 工作负载变得更慢(即,更低的吞吐量)。所以我想弄清楚这是否是因为争用过多。
对于 SQL Server:如何在没有分析器的情况下查看查询花费了多长时间等待锁定?
考虑以下表达式,它从日期时间值截断(不舍入)毫秒数:
declare @now datetime2 = sysdatetime();
select @now;
select convert(datetime2, convert(varchar(20), @now, 120));
-- Output
2021-07-30 09:38:33.5566666
2021-07-30 09:38:33.0000000
Run Code Online (Sandbox Code Playgroud)
请注意varchar(20). 我不喜欢那个特定的长度值,因为如果我应该更改我的数据类型,可能会丢失数据:
declare @now datetimeoffset = sysdatetimeoffset() at time zone 'Pacific Standard Time';
select @now;
select convert(datetimeoffset, convert(varchar(20), @now, 120));
-- Output
2021-07-30 02:39:12.7200000 -07:00
2021-07-30 02:39:12.0000000 +00:00 -- oops, we lost the time zone too!
Run Code Online (Sandbox Code Playgroud)
因此,我更愿意使用以下内容:
declare @now datetimeoffset = sysdatetimeoffset() at time zone 'Pacific Standard Time';
select @now;
select convert(datetimeoffset, convert(varchar(max), @now, 120)); -- note …Run Code Online (Sandbox Code Playgroud) performance ×10
postgresql ×2
sql-server ×2
concurrency ×1
datatypes ×1
foreign-key ×1
join ×1
locking ×1
mariadb ×1
metadata ×1
monitoring ×1
mysql ×1
oracle ×1
table ×1
xml ×1
xquery ×1