nvarchar(max)がデータベースにデータを格納する方法は、一部のデータが4000文字未満の場合、どのように高速になるでしょうか?


8

アラビア語と英語の2つの言語をサポートするCMSを開発する必要があります。このCMSは、一種のArticle Publishingサイトになります。設計と分析中に、一部の記事が8000文字を超えることがわかりました。私のテーブルにはいくつかの列があります

PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)

PageBodyをnvarchar(4000)として保持する場合、iaは4000文字に制限され、アラビア語バージョンを保存する必要がある場合は、16000バイトが必要です(アラビア語はUnicodeであり、ASCIIの3倍のスペースが必要です)。

そのため、PageBodyをnVarchar(max)として定義するオプションのみが残されています。これには、パフォーマンスの観点からの欠点があります。私の実際の質問は、PageBody列の一部のデータが4000文字未満である場合、インライン列のデータよりもMS SQLストアであるか、データベースで個別にあるかです。

私もこれをGoogleで探しましたが、関連する答えや、そのようなシナリオでパフォーマンスを向上させる方法は見つかりませんでした。

このような多言語CMSの設計のベストプラクティスに関する提案は大歓迎です。

サポートする必要があるのはアラビア語と英語の2言語のみです


いつも英語とアラビア語を話せますか?それともオプションの1つだけですか?もしそうなら、常に必須ですか?後でもっと多くの言語を期待していますか?
gbn 2011

回答:


9

nvarchar(max)値が「記憶されるで行が短い十分であれば」。

デフォルトの動作は、sp_tableoption、「行外の大きな値タイプ」オプションを使用して変更できます。私は気にしないでしょう。DBエンジンは、これを効率的に管理します。

設計に関しては、モデルに基づいてこれを行ういくつかの方法があります。

  • あなたはいつも英語とアラビア語の両方を持っていますか?
  • オプションにすることはできますか?もしそうなら、常に必須ですか?
  • 後でもっと多くの言語を期待していますか?

1.別のテーブル

つまり、別々の言語を別々のテーブルに分割できます。
これにより、列レベルではなくテーブルレベルの照合が可能になります

ページあたりの行数を増やし、行内LOBストレージの可能性を高めることができます。

PageParent

  • PageID int、
  • PageOtherInfo ...

PageEnglish(varcharはここで問題ないかもしれません)

  • PageID int、
  • PageTitleEnglish varchar(200)、
  • PageDescEnglish varchar(500)、
  • PageBodyEnglish varchar(max)

PageArabic

  • PageID int、
  • PageTitleArabic nvarchar(200)、
  • PageDescArabic nvarchar(500)、
  • PageBodyArabic nvarchar(max)

2.個別の行

または、languageID列を使用して複数の言語をサポートします。
これには、照合がすべての言語で修正されるという欠点があります。

PageParent

  • PageID int、
  • PageOtherInfo ..

ページ

  • PageID int、
  • LanguageCode、
  • PageTitle nvarchar(200)、
  • PageDesc nvarchar(500)、
  • PageBody nvarchar(最大)

4
  • MS SQL Serverのページサイズは8KBに固定されています。
  • 行が複数のページに分割されることはありませんが、複数の行で1つのページを共有できます。
  • ただし、nvarchar(max)およびその他のBLOBデータは、行/ページの外部に格納される場合があります。

つまり、すべてが1つの行に収まるためには、すべてのサイズの合計が8K未満でなければなりません。そうでない場合、SQL Serverは行/ページの外にBLOBを格納します。

データの量が多すぎて本当にパフォーマンスの問題を引き起こしていますか?

別のオプションとして、データベース構造を変更して、英語とアラビア語のページに別々の行を持たせ、代わりに言語コード列を含めることもできます。そうすれば、英語とアラビア語の両方のテキストを同じ行に収める必要がなくなります。また、おそらく英語とアラビア語を同時にフェッチする必要がないので、データをフェッチするときにも意味があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.