我使用下面的查询来搜索整个 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) 我有两个表,其中一个包含下载 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) 我正在尝试优化这个 SQL 查询:
select topics.id from "topics"
left join "articles_topics" on "topics"."id" = "articles_topics"."topic_id"
left join "articles" on "articles_topics"."article_id" = "articles"."id"
where not "topics"."type" = 'sport' and "articles"."image" is not null
group by "topics"."id"
having COUNT(articles.id) > 10
Run Code Online (Sandbox Code Playgroud)
这是完整的查询成本(我使用过EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS))
Finalize HashAggregate (cost=12881.12..12974.90 rows=2501 width=8) (actual time=209.037..210.463 rows=1381 loops=1)
Output: topics.id
Group Key: topics.id
Filter: (count(articles.id) > 10)
Rows Removed by Filter: 5672
Buffers: shared hit=8624
-> Gather (cost=12018.39..12843.61 rows=7502 width=16) (actual time=198.146..205.348 rows=10376 loops=1) …Run Code Online (Sandbox Code Playgroud) 我有一个宽表,相对较大,有 14,264,775 行,在 Azure SQL 数据库上运行。
以下查询需要一些 TLC。
IF EXISTS (
SELECT 1/0
FROM dbo.table1 src
INNER JOIN dbo.table1 tgt
ON tgt.Col1 = src.Col1
WHERE tgt.ValidFrom <= src.ValidTo
AND tgt.ValidTo >= src.ValidFrom
AND tgt.RecordId <> src.RecordId
)
BEGIN
RAISERROR('Overlap detected in dbo.table1', 11, 1);
END ;
Run Code Online (Sandbox Code Playgroud)
我有这个索引。
CREATE NONCLUSTERED INDEX [IX__table1] ON dbo.table1
( Col1 )
INCLUDE (ValidFrom, ValidTo, RecordId)
GO
Run Code Online (Sandbox Code Playgroud)
这是查询的 io 统计信息。逻辑阅读能力非常出色。
这是计划 XML。我尝试了 PasteThePlan,但它无法解析计划 XML。(也许它不喜欢Axure sql数据库计划xml)。
如您所见,[src] 上有一个索引扫描;读取 14,264,775 行(与表中的所有行数相同)。并在 [tgt] 上进行索引查找;读取 194,405,307 行。
我需要改变什么来提高查询的性能? …
sql-server index-tuning azure-sql-database query-performance
SELECT *
FROM SameLogTable
WHERE ID_Table IN (SELECT ID_Table-1
FROM SameLogTable
WHERE <SameCondition>) OR
ID_Table IN (SELECT ID_Table
FROM SameLogTable
WHERE <SameCondition>) OR
ID_Table IN (SELECT ID_Table+1
FROM SameLogTable
WHERE <SameCondition>)
Run Code Online (Sandbox Code Playgroud)
此查询在日志记录表上运行,我想选择特定事件,以及这些事件之前和之后的事件。这个解决方案感觉丑陋且效率低下,为此编写更好的方法是什么?
示例:如果我对 LogTable 的 ID 为 4 和 23 的行感兴趣,我想得到以下结果:
ID Column1 Column2 ...
3 ... ...
4 ... ...
5 ... ...
22 ... ...
23 ... ...
24 ... ...
Run Code Online (Sandbox Code Playgroud)
这些都是来自同一 LogTable 的所有行,除了我使用 WHERE 指定第 4 行和第 23 行,并且我希望 Select 自动返回第 3,5 行(第 4 行)和第 22、24 行(第 …
在 SQL Sever 中更新时,我的理解是删除整行然后重新创建(这就是您获得新时间戳的原因)。那么,如果您更新 1 个字段或 500 个字段,更新的性能是否会发生变化?
我怀疑如果有索引列,因为它必须更新索引,服务器会执行更多的“工作”。回答时,假设没有触发器。
我有一张具有以下结构的表,如您所见,有一个聚集索引和两个非聚集索引,一个非聚集索引是 IX_ParentId_Include,另一个是 FLIX_ParentId_Include
除了第二个索引被过滤之外,它们是相同的。
CREATE TABLE [dbo].[PhotoRepo] (
[PhotoRepoId] INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL,
[TypeId] TINYINT NULL,
[ParentId] INT NULL,
[RemoteLocation] VARCHAR (4000) NOT NULL,
[UploadedAt] DATETIME NOT NULL,
[UploadedBy] VARCHAR (255) NULL,
[FileSize] INT NOT NULL,
[DefaultChild] BIT NOT NULL,
[RemoteLocationUploadedAt] DATETIME NULL,
CONSTRAINT [PK_FileList] PRIMARY KEY NONCLUSTERED ([PhotoRepoId] ASC)
);
GO
CREATE CLUSTERED INDEX [IX_PhotoRepoId]
ON [dbo].[PhotoRepo]([PhotoRepoId] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_ParentId_Include]
ON [dbo].[PhotoRepo]([ParentId] ASC)
INCLUDE([RemoteLocation], [DefaultChild], [TypeId]);
GO
CREATE NONCLUSTERED INDEX [FLIX_ParentId_Include] …Run Code Online (Sandbox Code Playgroud) 我们在表 Tbl 中有一个聚集索引,顺序为 A、B、C。编写一个查询是否有意义
WHERE A = @a, B = @b, C = @c
Run Code Online (Sandbox Code Playgroud)
或者它会和
WHERE C = @c, B = @b, A = @a
Run Code Online (Sandbox Code Playgroud)
查询顺序对聚集索引有意义吗?
performance sql-server clustered-index t-sql query-performance
我有一个包含 700,000 行的表,其中包含一个字符串 id 字段,其值例如 rec-232276-dup-0 和 rec-354240-org。rec- 是常数,但 id 的其他部分可以改变。
我想拆分这个字符串,以便我只有整数部分和一个布尔值,具体取决于下一部分是否等于 dup 或 org(1 表示 dup,0 表示 org),我将其插入回表中。
我编写了以下循环来执行此操作,并且在功能上它运行良好,但是当我在完整的 700,000 行上运行它时,它需要非常长的时间(+12 小时和计数)。
我做错了什么导致它花费这么多时间?这是导致这种情况的字符串操作吗?我可以做些什么来改善这种情况?
谢谢你的帮助。
我的脚本如下:
select id
into #ControlTable
from [dbo].[original_test_dataset]
declare @TableID varchar(20)
while exists (select * from #ControlTable)
begin
select @TableID = (select top 1 id
from #ControlTable
order by id asc)
declare @duplicate bit
declare @id_only varchar(10)
--1. Find id only
-- Trim off rec-
set @id_only = REPLACE(@TableID,'rec-','')
-- Find position of first - and …Run Code Online (Sandbox Code Playgroud) 我一直在努力使这个查询更有效地工作。
我发现 where 子句中 Or 的数量是这个查询中最大的问题。此查询位于存储过程中。
我到了我能想到的唯一选择的地步。:
我相信其他人以前也遇到过这个问题。查询性能在大约一秒或更短的时间内开始并不可怕,但在某些情况下,它被多次命中,导致长达 5 或 6 秒的延迟。
查询如下。:
DECLARE @PERSON_ID AS INT
DECLARE @ITEM_ID AS INT
DECLARE @ITEM_VERSION AS INT
DECLARE @ITEM_SUB_NAME AS VARCHAR(250)
DECLARE @ITEM_SUB_SUB_NAME AS VARCHAR(250)
--DEFAULTS
SET @PERSON_ID = 0
SET @ITEM_ID = 0
SET @ITEM_VERSION = 1
SET @ITEM_SUB_NAME = NULL
SET @ITEM_SUB_SUB_NAME = NULL
SELECT ID, PERSON_ID,
ISNULL(ITEM_VERSION, 1) AS ITEM_VERSION,
ISNULL(ITEM_SUB_NAME, '') AS 'ITEM_SUB_NAME',
ISNULL(ITEM_SUB_SUB_NAME, '') AS 'ITEM_SUB_SUB_NAME',
ISNULL(ITEM_DATE, '1/1/1900') AS …Run Code Online (Sandbox Code Playgroud) performance ×7
sql-server ×6
t-sql ×4
optimization ×2
index ×1
index-tuning ×1
join ×1
mysql ×1
postgresql ×1
update ×1
xml ×1
xquery ×1