【发布时间】:2014-11-06 16:45:59
【问题描述】:
我有一个 SQL 查询需要数小时才能运行。基本上,我希望在我们的“页面”表中找到具有特殊字符的文档 (PDF)。我在 PDFFile 表中找到了这些 PDF。仅执行第一个 AND 子句会在 16 秒内返回。添加第二个子句使 SQL 需要 3 小时。试图弄清楚我做错了什么。非常感谢任何帮助。
查询:
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 '\'
)
【问题讨论】:
-
这么多
LIKEs,怎么能不慢呢? -
为什么您的 PDF 表格有两个单独的文件名列?如果其中一个可以为空,你可以使用
COALESCE()吗? -
@Lamak:尤其是
LIKE和前导%--> 确保 没有索引 可以使用!
标签: sql sql-server database query-performance