Должен ли я хранить большие типы данных в отдельной таблице? - PullRequest
4 голосов
/ 19 марта 2012

Вопрос старый и, я думаю, не имеет 100% правильного ответа.Но хотелось бы услышать более опытный совет.

Использование SQL Server 2008 R2.

У меня есть таблица, в которой будут храниться миллионы строк.Большинство столбцов - это описание (дата, статус, заголовок, ..) данных столбца varbinary (max).Есть также 2 столбца типа данных XML.эти 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 Ответ

1 голос
/ 22 марта 2012

Я принял решение, основываясь на обсуждении с другими коллегами: отдельные данные LOB (также столбцы SomeID и Date) в отдельных данных в другой таблице.

Самое важное: я пропустил оценку частоты обновления столбцов и как часто запрашиваются данные и когда они становятся достаточно старыми, чтобы не быть интересными в подавляющем большинстве (но не во всех) случаях.

И это то, что имеет значение в этом случае.

Итак, придумали:

  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
    )

Итак, как видно, некоторые данные больших объектов - MyData и MyOtherData varbinary(Макс) становится статичным после короткого времени.Они достаточно большие, поэтому я хотел бы хранить их на диске и в какой-то момент поставить на раздел только для чтения.Чем более свежая дата, тем чаще мне нужны «MyData» или «MyOtherData».

Итак, окончательный дизайн выглядит примерно так:

 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)
    )
...