Столбец данных XML в SQL Server - PullRequest
0 голосов
/ 06 марта 2012

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

Я хотел бы создать таблицу со следующими столбцами

[id] INT IDENTITY(1,1) NOT NULL,
[user_id] INT NOT NULL,
[date] DATE NOT NULL,
[timestamp] DATETIME NOT NULL,
[xml_data] XML NOT NULL

с первичным ключом в столбце идентификаторов и некластеризованным индексом вuser_id и date, которые охватывают xml_data и timestamp.

Однако я заметил, что не могу добавить xml_data к выражению INCLUDE в индексе.Грустное лицо, так как это приведет к поиску RID, когда пользователь выполнит поиск по user_id и дате.

Каков наилучший способ хранения данных XML, которые будут запрашиваться?

Я полагаю, что я могу выбрать

  1. Придерживайтесь xml и иметь хорошо отформатированные данные, но принять запрос
  2. Использовать VARCHAR (MAX) с неизвестными плюсами / минусами
  3. Используйте VARBINARY (MAX) с неизвестными плюсами / минусами

Примечание: я сомневаюсь, что смогу ограничить длину строки даже до 8000.

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Если у вас есть XML - сохраните его как XML по двум основным причинам:

  • он оптимизирован для хранения XML - он не хранится как простой текст, он фактически разбит на токены и хранится более эффективно, чем простой текст

  • вы можете запросить XML, когда он хранится как тип XML

Но: вы не можете просто проиндексировать такой столбец XML. Любой индекс в SQL Server может иметь длину максимум длиной 900 байт - столбец XML может иметь размер до 2 ГБ.

Если вы хотите проиндексировать свой XML-столбец, взгляните на XML-индексы в SQL Server 2005 - это отдельный тип индекса, предназначенный для очень эффективной обработки запросов в XML.

Другой способ ускорить ваши запросы XML может заключаться в том, чтобы «поместить» определенные части вашего XML, к которым вы часто обращаетесь, в родительскую таблицу, с помощью хранимой функции, которая извлекает эту часть информации из XML и сохраняет это как вычисляемый постоянный столбец в родительской таблице. После того, как он сохранен там, вы можете запросить его, как и любой другой столбец, и вы можете индексировать его тоже! Однако он работает только для единичных фрагментов информации (например, OrderNumber из вашего заказа - у вас есть только один из них) - его нельзя применить к коллекциям данных.

0 голосов
/ 06 марта 2012

Вы можете использовать XQuery для запроса полей XML. Смотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...