表启用TDE的SQL 2008 R2服务器上的可变性能



我有以下情况:我有一个SQL 2008 R2 Enterprise版本,在其中一个数据库中启用了TDE加密。加密数据库中的一个存储过程使用了一个表变量(@t1),该表填充了近600K条记录。然后有一个select语句,它使用这个表和加密数据库中的另一个表之间的连接(t2),在t2表上,我有大约20密耳的行。这次加入需要很长时间才能完成(上次几乎花了4小时)。如果我使用临时表(#t3)来代替表变量,并执行相同的联接,则结果是即时的。此外,如果我在另一台没有TDE加密的服务器(与SQL 2008 R2相同)中运行这两个表之间的联接,联接将在几秒钟内完成那么,有人在使用TDE的表变量和加密数据库方面遇到过类似的问题吗?这就是我加密数据库的方式:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'AASFA234234234as234#234#$##$'
CREATE CERTIFICATE SQLCertificate
WITH SUBJECT = 'SQL Certificate',
EXPIRY_DATE = '10/31/2020';
USE DBTest
go
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE SQLCertificate;
ALTER DATABASE DBTest
SET ENCRYPTION ON
And this is the script that I used where _rptHousehold is a table that has 18mil records. The script never gets to the PRINT '3 ' + CONVERT(VARCHAR,GETDATE(),121), hangs on the select count(*) from @tt
PRINT '1 ' + CONVERT(VARCHAR,GETDATE(),121)
IF object_id('tempdb..#tt') IS NOT NULL 
    DROP TABLE #tt

declare  @tt table
(   [id] int        IDENTITY(1,1), 
    TableID         DECIMAL(11,0),
    AdvisorID       INT,
    idBuild         INT,
    Tablename       sysname,
    tCreatedate     datetime,
    ColumnName      varchar(100),
    Column_ID       int,
    qtyValue        decimal(25,9),
    tModifiedDate   datetime
)
INSERT INTO @tt
(TableID , AdvisorID , idBuild,Tablename,   tCreatedate,ColumnName, Column_ID,qtyValue )            
select  TOP 600000 
    t.object_ID
    ,AdvisorID
    ,1635
    ,t.NAME
    ,t.Create_date
    ,c.Name
    ,c.object_ID    
    ,CAST(RAND()* 100000 AS DECIMAL(25,9))
FROM sys.tables t CROSS JOIN sys.columns c  
    CROSS JOIN (SELECT DISTINCT idAdvisor AS AdvisorID FROM dbo._rptHousehold WHERE idBuild = 1635) ac              

PRINT '2 ' + CONVERT(VARCHAR,GETDATE(),121)
SELECT COUNT(*) FROM @tt 
PRINT '3 ' + CONVERT(VARCHAR,GETDATE(),121)
UPDATE tt
    SET 
        qtyValue = rp.qtyAvgPAAssets
FROM @tt tt 
    JOIN _rptHousehold rp
        ON rp.idAdvisor= tt.AdvisorID
            AND rp.idBuild= tt.idBuild
PRINT '4 ' + CONVERT(VARCHAR,GETDATE(),121)

我不认为它与TDE直接相关,因为TDE在将数据写入磁盘时对数据进行加密,在从磁盘读取数据时对其进行解密,据说开销没有那么大(<10%)。

  • 也许在新的服务器上,数据没有缓存在RAM中,所以它们必须从磁盘读取(当然,在这种情况下,TDE会使它慢一点)
  • 建议使用临时表代替表变量,如果有许多行要处理
  • 它不如以前工作的许多其他原因——我会的从检查执行计划开始

最新更新