使用函数fn_decompress进行选择的速度较慢

时间:2019-08-12 19:23:23

标签: sql sql-server where-clause

SQL Server查询结果在40 GB数据库上的速度非常慢。可能会为每个LIKE语句调用 #customers-list { width: 450px; margin-left: -160px; padding: 10px; background-color: #e2e2e2; overflow: hidden; position: absolute; z-index: 999; } 函数来解压缩数据(这对性能不利)。

我的想法是用于数据解压缩的调用函数每行仅一次,然后将值保存到变量fn_decompress并进行比较。

@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%')

1 个答案:

答案 0 :(得分:0)

重点是您使用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%'
)

CAST(dbo.fn_decompress(dbo.ApplLogG2MessagesDataXML.Data) AS nvarchar(MAX))造成14倍的问题是您重新计算了14次相同的数据。因此,您的系统需要计算出40GB容量的14倍。那不是真正的表现。