相关疑难解决方法(0)

如何提高使用 LIKE %abc 的 where 子句的性能?

我有下面的 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)

有人可以帮我优化这个语句吗?十分感谢。

performance index sql-server select like

5
推荐指数
1
解决办法
1015
查看次数

查询执行时间不一致

我有一个查询有时需要很长时间才能执行。当我检查速度时,它需要 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)

performance index sql-server-2008-r2 query-performance

3
推荐指数
1
解决办法
7914
查看次数

使用 like over charindex 来搜索模式

我们在这里使用 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 有什么缺点

performance sql-server-2008-r2 pattern-matching

1
推荐指数
1
解决办法
1210
查看次数