2012-01-20 21 views
0

我有以下情況: 我有一個SQL 2008 R2企業版,其中一個數據庫中啓用了TDE加密。其中一個來自加密數據庫的存儲過程使用了一個表變量(@ t1),該表使用近600,000條記錄進行填充。然後有一個select語句,它使用該表和另一個來自加密數據庫(t2)的表之間的連接,在t2表上我有大約20 mil的行。 這個連接需要永久完成(上次花費了將近4小時)。如果我使用表格變量而不是表格變量(#t3)並執行相同的連接,則結果是即時的。另外,如果我在另一臺沒有TDE加密的服務器(同樣的SQL 2008 R2)中運行這兩個表之間的連接,幾秒鐘內就可以完成連接。 因此,有沒有人遇到過使用TDE的表變量和加密數據庫的類似問題? 這是我如何加密數據庫:啓用TDE的SQL 2008 R2服務器上的表變量性能

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) 

回答

1

嗯,我不認爲它與TDE直接連接時,TDE加密時,他們被寫入到磁盤和解密它們的數據時,他們從磁盤讀取和開銷據說不是那麼大(< 10%)。

  • 也許對新服務器的數據在RAM緩存,所以他們必須 (在這種情況下TDE使得它有點慢,當然)從磁盤中讀取。
  • 如果您有很多行需要處理,推薦使用臨時表而不是表變量, 。
  • 許多其他原因,其無法正常工作,在─我會 開始檢查執行計劃好..
+0

好點,謝謝 – user1160835

相關問題