2012-01-20 3 views
0

私は次のような状況に陥っています。 データベースの1つでTDE暗号化を有効にしたSQL 2008 R2 Enterpriseエディションがあります。暗号化されたデータベースのストアドプロシージャの1つは、テーブル変数(@ t1)を使用しており、テーブルにはほぼ600,000個のレコードが格納されます。次に、このテーブルと暗号化されたデータベース(t2)の別のテーブルとの間の結合を使用するselect文があります。これは約20milの行を持つt2テーブルです。 この結合には永遠に完了します(前回はほぼ4時間かかりました)。テーブル変数の代わりにテンポラリーテーブル(#t3)を使用し、同じ結合を実行すると、結果は瞬時になります。また、私はTDEの暗号化(同じSQL 2008 R2)を持っていない別のサーバーでこれらの2つのテーブル間でジョインを実行すると、結合は数秒で終了します 誰も同じような問題が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が少し遅く、それを作る、その場合には当然の)ディスクから読み取る でなければなりません。
  • 多くの行を処理する場合は、テーブル変数の代わりにテンポラリテーブル を使用することをお勧めします。そのiが 実行計画を確認して開始すると、変更前と同様に良好に動作しない理由を
  • 他の多くの理由...
+0

良かった点、感謝 – user1160835

関連する問題