首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL命令运行缓慢。需要帮助识别慢度

SQL命令运行缓慢。需要帮助识别慢度
EN

Stack Overflow用户
提问于 2014-11-06 16:45:59
回答 2查看 67关注 0票数 0

我有一个需要几个小时才能运行的SQL查询。基本上,我希望在我们的“页面”表中找到具有特殊字符的文档(PDF)。我在PDFFile表中找到了那些PDF。仅执行第一个AND子句将在16秒内返回。添加第二个子句使SQL耗时3小时。想弄清楚我做错了什么。任何帮助都是非常感谢的。

查询:

代码语言:javascript
运行
复制
select b.bookletname, b.trackingID, b.[version], s.name
from page p
inner join section s on s.id = p.sectionid
inner join booklet b on b.id = s.bookletid
INNER JOIN [user] u ON b.CreatedBy = u.id
INNER JOIN client c ON c.id = u.clientID
WHERE u.clientID = 2
AND p.[filename] IN (
    SELECT DISTINCT pdf.[FileName]
    FROM PDFFile pdf
    WHERE pdf.fileName LIKE '%\<%' ESCAPE '\'
    OR pdf.fileName LIKE '%\>%' ESCAPE '\'
    OR pdf.fileName LIKE '%\"%' ESCAPE '\'
    OR pdf.fileName LIKE '%\%%' ESCAPE '\'
    OR pdf.fileName LIKE '%''%' ESCAPE '\'
    OR pdf.fileName LIKE '%\*%' ESCAPE '\'
    OR pdf.fileName LIKE '%\+%' ESCAPE '\'
    OR pdf.fileName LIKE '%\\%' ESCAPE '\'
    OR pdf.fileName LIKE '%\/%' ESCAPE '\'
    OR pdf.fileName LIKE '%\:%' ESCAPE '\'
    OR pdf.fileName LIKE '%\?%' ESCAPE '\'
    OR pdf.fileName LIKE '%\[%' ESCAPE '\'
    OR pdf.fileName LIKE '%\]%' ESCAPE '\'
    OR pdf.fileName LIKE '%\|%' ESCAPE '\'
)
OR p.[PDF_File_Name] IN (
    SELECT DISTINCT pdf.[FileName]
    FROM PDFFile pdf
    WHERE pdf.fileName LIKE '%\<%' ESCAPE '\'
    OR pdf.fileName LIKE '%\>%' ESCAPE '\'
    OR pdf.fileName LIKE '%\"%' ESCAPE '\'
    OR pdf.fileName LIKE '%\%%' ESCAPE '\'
    OR pdf.fileName LIKE '%''%' ESCAPE '\'
    OR pdf.fileName LIKE '%\*%' ESCAPE '\'
    OR pdf.fileName LIKE '%\+%' ESCAPE '\'
    OR pdf.fileName LIKE '%\\%' ESCAPE '\'
    OR pdf.fileName LIKE '%\/%' ESCAPE '\'
    OR pdf.fileName LIKE '%\:%' ESCAPE '\'
    OR pdf.fileName LIKE '%\?%' ESCAPE '\'
    OR pdf.fileName LIKE '%\[%' ESCAPE '\'
    OR pdf.fileName LIKE '%\]%' ESCAPE '\'
    OR pdf.fileName LIKE '%\|%' ESCAPE '\'
)
OR p.[PDFName] IN (
    SELECT DISTINCT pdf.[FileName]
    FROM PDFFile pdf
    WHERE pdf.fileName LIKE '%\<%' ESCAPE '\'
    OR pdf.fileName LIKE '%\>%' ESCAPE '\'
    OR pdf.fileName LIKE '%\"%' ESCAPE '\'
    OR pdf.fileName LIKE '%\%%' ESCAPE '\'
    OR pdf.fileName LIKE '%''%' ESCAPE '\'
    OR pdf.fileName LIKE '%\*%' ESCAPE '\'
    OR pdf.fileName LIKE '%\+%' ESCAPE '\'
    OR pdf.fileName LIKE '%\\%' ESCAPE '\'
    OR pdf.fileName LIKE '%\/%' ESCAPE '\'
    OR pdf.fileName LIKE '%\:%' ESCAPE '\'
    OR pdf.fileName LIKE '%\?%' ESCAPE '\'
    OR pdf.fileName LIKE '%\[%' ESCAPE '\'
    OR pdf.fileName LIKE '%\]%' ESCAPE '\'
    OR pdf.fileName LIKE '%\|%' ESCAPE '\'
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 17:06:53

使用exists重写它并简化like的. Server允许您在模式中包含字符列表,并且您所拥有的大多数字符不需要转义(我希望我得到的结果模式完全正确)。

我建议:

代码语言:javascript
运行
复制
select b.bookletname, b.trackingID, b.[version], s.name
from page p inner join
     section s
     on s.id = p.sectionid inner join
     booklet b
     on b.id = s.bookletid inner join
     [user] u
     on b.CreatedBy = u.id inner join
     client c 
     on c.id = u.clientID
where u.clientID = 2 and
      (exists (select 1
               from PDFFile pdf
               where pdf.fileName LIKE '%[<>"''*+\\/:?\[\]|]%' ESCAPE '\' and
                     pdf.fileName = p.filename
              ) or
       exists (select 1
               from PDFFile pdf
               where pdf.fileName LIKE '%[<>"''*+\\/:?\[\]|]%' ESCAPE '\' and
                     pdf.fileName = p.PDF_File_Name
              ) or
       exists (select 1
               from PDFFile pdf
               where pdf.fileName LIKE '%[<>"''*+\\/:?\[\]|]%' ESCAPE '\' and
                     pdf.fileName = p.PDFName
              )
      );

您希望确保您有一个关于PDFFile(fileName)的索引,以提高性能。

我也改变了逻辑。您的原始逻辑类似于where A and B or C or D,它被解析为where (A and B) or C or C。我把它改成了where A and (B or C or D)。这也可能造成了性能瓶颈。

票数 2
EN

Stack Overflow用户

发布于 2014-11-06 17:06:29

尝试删除这三个表,并将该选择放入临时表中,因为您使用相同的select来检查三列。因此,您可以在where条件下使用临时表。

代码语言:javascript
运行
复制
SELECT DISTINCT pdf.[FileName]
INTO   #temp
FROM   PDFFile pdf
WHERE  pdf.fileName LIKE '%\<%' ESCAPE '\'
        OR pdf.fileName LIKE '%\>%' ESCAPE '\'
        OR pdf.fileName LIKE '%\"%' ESCAPE '\'
        OR pdf.fileName LIKE '%\%%' ESCAPE '\'
        OR pdf.fileName LIKE '%''%' ESCAPE '\'
        OR pdf.fileName LIKE '%\*%' ESCAPE '\'
        OR pdf.fileName LIKE '%\+%' ESCAPE '\'
        OR pdf.fileName LIKE '%\\%' ESCAPE '\'
        OR pdf.fileName LIKE '%\/%' ESCAPE '\'
        OR pdf.fileName LIKE '%\:%' ESCAPE '\'
        OR pdf.fileName LIKE '%\?%' ESCAPE '\'
        OR pdf.fileName LIKE '%\[%' ESCAPE '\'
        OR pdf.fileName LIKE '%\]%' ESCAPE '\'
        OR pdf.fileName LIKE '%\|%' ESCAPE '\' 

SELECT b.bookletname,
       b.trackingID,
       b.[version],
       s.NAME
FROM   page p
       INNER JOIN section s
               ON s.id = p.sectionid
       INNER JOIN booklet b
               ON b.id = s.bookletid
       INNER JOIN [user] u
               ON b.CreatedBy = u.id
       INNER JOIN client c
               ON c.id = u.clientID
WHERE  u.clientID = 2
       AND p.[filename] IN (SELECT *
                            FROM   #temp)
        OR p.[PDF_File_Name] IN (SELECT *
                                 FROM   #temp)
        OR p.[PDFName] IN (SELECT *
                           FROM   #temp) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26784843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档