我有下面的 select 语句,结果非常慢(41 秒)
SELECT DISTINCT a.Doc_Resource_ID
,a.Parent_ID
,a.Logical_Path
,a.lvl
,CAST(SUBSTRING(a.Security_Level, 21, 1) AS TINYINT)
FROM Doc_ACL_Detail_D a
WHERE a.UserId = @I_vUserId
AND @I_vParentId = 0
OR (Logical_Path LIKE(CASE
WHEN @I_vParentId>0 THEN '%-'+LTRIM(STR(@I_vParentId))
END)
OR Logical_Path LIKE(CASE
WHEN @I_vParentId>0 THEN '%-'+LTRIM(STR(@I_vParentId))+'-%'
END ))
OPTION (MAXRECURSION 5000)
Run Code Online (Sandbox Code Playgroud)
我已经为表创建了非聚集索引Doc_ACL_Detail_D,但执行计划仍然是表扫描。
我创建的索引:
CREATE NONCLUSTERED INDEX idx_Doc_ACL_Detail_D_UserId_Logical_Path
ON [dbo].[Doc_ACL_Detail_D] ([UserId],[Logical_Path])
INCLUDE (Parent_ID,Doc_Resource_ID,lvl,Security_Level)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我优化这个语句吗?十分感谢。
我有一个查询有时需要很长时间才能执行。当我检查速度时,它需要 15 秒。但实际上它应该运行得更快。当我再次检查查询时,它在 11 秒内再次执行。然后我尝试删除在查询中使用的强制转换和执行时它只在 8 秒内运行。但是当我再次执行原始查询时,它花费的时间更少。我检查了几台运行查询的计算机。但在某些情况下,我也只在 1 或 2 秒内得到输出。所以执行时间不一致。所以我无法找到为什么会发生这种情况?
下面是我用来测试的查询
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE ( Charindex('9000413237',CAST([company].dbo.[customer].[Phone no] AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)
这里的客户表大约有 30 列。其中“客户名称”的数据类型为 varchar(255),“Sl_No”的类型为 int,“Id”的类型为 int,“电话号码”的类型为 varchar(255)。
当我执行相同的查询(使用强制转换)时,即使在同一台 PC 上进行不同的试验,执行所需的时间也不同。它从 1 秒到 14 秒不等(我尝试了执行查询的试验次数)。时间的变化可能是由于网络延迟、缓存、其他用户使用率高的表等。但是有什么工具或方法可以让我找到执行时间(可能慢或快)的原因?
更新 我只是尝试使用查询来检查 IO 停顿
SELECT
mf.physical_name,
( io_stall_read_ms / ( 1.0 + num_of_reads )) as [avg read wait],
( io_stall_write_ms / ( 1.0 + num_of_writes )) as [avg write wait],
i.name,
fs.io_stall
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf …Run Code Online (Sandbox Code Playgroud) 我们在这里使用 charindex 来搜索一个字符串,如下所示
SELECT *
FROM tablename
WHERE ( Charindex('47a%$.abc',CAST(columnname AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)
我打算用 LIKE 替换 charindex,因为我只需要搜索模式是否存在而不是位置。所以我想知道在我的情况下使用 LIKE 而不是 charindex 有什么缺点。我在几种情况下使用 charindex。所以我希望它适用于所有 sql 数据类型,包括特殊字符在内的所有字符(包括 %(就像已经使用了 %pattern%)。所以请告诉我使用 like 超过 charindex 有什么缺点