sql - 使用函数 fn_decompress 选择的缓慢性能
问题描述
SQL Server 查询结果在 40 GB 数据库上非常慢。fn_decompress
可能为每个 LIKE 语句的解压缩数据调用函数(这对性能不利)。
我的想法是每行只调用一次数据解压缩函数,然后将值保存到变量@decompData
并进行比较。
SELECT ID, CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) AS Data
FROM dbo.ApplLogG2MessagesDataXML
WHERE (CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%alfa@gmail.com%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%mitcherl@better.com%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%mismatch@woobie.net%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%kopii@lerhard.info%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%metablock@gmail.com%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%peter@och.fr%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%info@lepit.de%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%nimrod@gmail.com%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%janine.boecher@gmail.cz%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%lipican@ninestor.eu%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%lejby.fejby@auto.it%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%kamil@senemil.cz%' OR
CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) LIKE '%mikahekinen@word.buz%')
我对更好性能的想法是:
SELECT ID, CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) AS Data
FROM dbo.ApplLogG2MessagesDataXML
WHERE
@decompData = CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX))
@decompData LIKE '%alfa@gmail.com%' OR
@decompData LIKE '%mitcherl@better.com%' OR
@decompData LIKE '%mismatch@woobie.net%' OR
....next emails conditions LIKE
解决方案
关键是你使用了CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX))
14 次。只需在子选择中声明一次,并在 where 条件中使用别名。
像那样:
SELECT * FROM (
SELECT ID, CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX)) AS Data
FROM dbo.ApplLogG2MessagesDataXML
) as innerTable
WHERE (
`Data` LIKE '%alfa@gmail.com%' OR
`Data` LIKE '%mitcherl@better.com%' OR
`Data` LIKE '%mismatch@woobie.net%' OR
`Data` LIKE '%kopii@lerhard.info%' OR
`Data` LIKE '%metablock@gmail.com%' OR
`Data` LIKE '%peter@och.fr%' OR
`Data` LIKE '%info@lepit.de%' OR
`Data` LIKE '%nimrod@gmail.com%' OR
`Data` LIKE '%janine.boecher@gmail.cz%' OR
`Data` LIKE '%lipican@ninestor.eu%' OR
`Data` LIKE '%lejby.fejby@auto.it%' OR
`Data` LIKE '%kamil@senemil.cz%' OR
`Data` LIKE '%mikahekinen@word.buz%'
)
您使用 14 次导致的问题CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX))
是您重新计算了 14 次相同的数据。所以你的系统需要计算你的 40GB 的 14 倍。这不是真正的性能。
推荐阅读
- intellij-idea - 如何在 PhpStorm 中并排打开两个终端?
- javascript - javascript Object.create 丢失属性
- laravel - Laravel 错误“模型/模型名称的声明应与 Illuminate\Database\Eloquent\Model 兼容”
- javascript - 如何使用 JS 动画容器
- java - 我正在尝试使用for循环按行写入数据,我经常需要更改数据为此我正在进行参数化
- kotlin - 在 Kotlin 中使用 Jackon 反序列化嵌套的 json 字段
- ios - 线程 0 因 ARM 线程状态(64 位)而崩溃
- r - 命名 dplyr 计数列
- python-3.x - 在进行迁移时,如何在没有 [Errno 13] Permission Denied 的情况下对 Django 提供的 User 模型进行猴子修补
- python - 熊猫意味着邻居零?