2012-03-19 10 views
4

質問は古く、100%正しい答えはないと思います。しかし、経験豊富なアドバイスを聞きたいです。大きな値のデータ型を別のテーブルに格納する必要がありますか?

SQL Server 2008 R2を使用しています。

私は何百万の行が格納されるテーブルを持っています。ほとんどの列は、varbinary(max)列のデータの説明(date、status、title、..)です。 XMLデータ型の2つの列もあります。これらのXMLは小さく、頻繁に照会されます。だから、:

MyTable 
    (
     SomeID varchar(20)-- queried most often 
     Date DateTime -- queried most often 
     Status VarChar(10) -- queried most often 
     Title VarChar(50) -- queried most often 
     -- some more columns here 
     SomeSmallXML xml -- queried quite often 
     SomeOtherSmallXML xml -- queried quite often 
     MyData varbinary(max) -- queried rarely 
     MyOtherData varbinary(max) -- queried rarely 
    ) 

私は、他のテーブルにすべての大きな値の型を移動した場合:

  • は、クラスタ化インデックスのオンラインインデックスの再作成を行うことができます。 しかし、私はまた、 他のテーブルにxmlの型を移動する必要があります。彼らはかなり頻繁に照会されるので、それは 合理的ではないようです。 (SomeID列がクライアントアプリケーションから に来ているので、断片化が予想されるので、他の代理キーを クラスタ化インデックスとするのが妥当ではないので、SomeIDはクラスタードインデックスのキーになります)
  • は、 ただし、の推測では、テーブルパーティション化(低速ファイルグループの古いデータ)+インデックス を高速ストレージで同じにすることができます。

この場合、大きな値のデータ型を他のテーブルに移動する理由はあまりありません。 "sp_tableoption N'MyTable"、 "行外の大きな値型"、 "ON"を設定する理由がわかります。

あなたのアドバイスは何ですか?他に何を考慮しなければならないのですか?

+1

[それは、LOBを持っている場合は、オンラインでも再構築](http://rusanu.com/2011/08/05/online -index-operations-for-indexes-containing-lob-columns /) –

+0

はい、2008 R2を使用しています。 [PSはあなたのブログでそれを見た:)] –

答えて

1

私は他の同僚との議論に基づいて決定しました。他のテーブルの分離されたデータで、いくつかのLOBデータ(SomeIDとDate列も)を分離しました。

最も重要なこと:iは、列の更新レートを考慮することが逃し、どのくらいのデータが頻繁にを照会され、彼らは十分に古い取得するときに大半で興味深いこと(すべてではない)の場合しません。

これがこの場合の違いです。

だから思い付いた:見ることができるよう、だから、

MyTable 
    (
     SomeID varchar(20)-- queried most often/Updated never 
     Date DateTime -- queried most often/Updated never 
     Status VarChar(10) -- queried most often/Updated few times after insert 
     Title VarChar(50) -- queried most often/Updated never 
     -- some more columns here 
     SomeSmallXML xml -- queried quite often/Updated few times after insert 
     SomeOtherSmallXML xml -- queried quite often/Updated never 
     MyData varbinary(max) -- queried rarely/Updated never 
     MyOtherData varbinary(max) -- queried rarely/Updated 1 shortly after insert 
    ) 

、いくつかのLOBデータ - のMyDataとMyOtherData varbinary型(max)は、短い時間の後に静的取得します。彼らは十分な大きさなので、私はそれらをチープディスクに保存し、ある時点で読み取り専用のパーティションに入れたいと思います。最近の「Date」は、「MyData」または「MyOtherData」が必要な場合が多いためです。

だから、最終的な設計は次のように約になります。あなたがすることができるSQL Server 2012のでは

MyTable 
    (
     SomeID varchar(20) 
     Date DateTime 
     Status VarChar(10) 
     Title VarChar(50) 
     -- some more columns here 
     SomeSmallXML xml 
     SomeOtherSmallXML xml 
    ) 
    MyTableLOB 
    (
     SomeID varchar(20) 
     Date DateTime -- used for partitioning 
     MyData varbinary(max) 
     MyOtherData varbinary(max) 
    ) 
関連する問題