開発マシン(サーバーボックスではありません)でMSSQL 2008r2を使用しています。遅いMSSQL 2008 r2のパフォーマンスですか?
私は1250万レコードのテーブルを持っています。それには126列あり、その半分はintです。ほとんどの行のほとんどの列はNULLです。私は同じレコードを返すのが3〜4倍速いと思われるEAVデザインでもテストしました(しかし、これはデータをピボットテーブルに表示できるようにすることを意味します)。
私はデータをページ設定するウェブサイトを持っています。ユーザーは、レコード(最後の25回の記録)の最後のページに移動しようとすると、結果のクエリは、このようなものです:
select * from (
select
A.Id, part_id as PartObjectId,
Year_formatted 'year', Make_formatted 'Make',
Model_formatted 'Model',
row_number() over (order by A.id) as RowNum
FROM vehicles A
) as innerQuery where innerQuery.RowNum between 775176 and 775200
...しかし、これは実行するために、ほぼ3分かかります。それは過度に思われる?このクエリを構造化するためのより良い方法はありますか?ブラウザのフロントエンドでは、jqGridを使用してデータを表示しています。ユーザーは、次、前、最初、または最後のページに移動できます。彼らはまた、データをフィルタリングし、注文することができます(例:Makeが "Bugatti"であるすべてのレコードを表示する)。
vehicles.Idはintで、主キー(クラスタ化ASC)です。 part_idはint、MakeとModelはvarchar(100)で、通常は20〜30文字しか含まれません。
テーブルビークルは、個々の取引で1日あたり100回更新され、20〜30人のユーザーが8時間/日の閲覧、検索、編集/追加にこのウェブページを使用します。それは多くから更新されて読み込まれます。
車両テーブルを複数のテーブルに分割するのは賢明でしょうか?それはパフォーマンスに大きな影響を与えますか?
多くの動画やウェブサイトでは、100万以上の行が読み込まれていて問題のないように頻繁に更新されるテーブルについての話があります。
私が観察したパフォーマンスの問題は、自分自身の開発用コンピュータにあることに注意してください。データベースには専用の16GBのRAMがあります。私はSSDやSCSIを使っていません。だから、ハードウェアが助けになることは分かっていますが、最後の25レコードを取り出すのに3分過ぎるようですね。
私はMSSQL 2008r2でこれらのテストを実行していますが、そうすることで多くのことが得られれば2012を使用することもできます。
なぜこのような処理にサポートされていないデータベースを使用していますか? SQL Server 2016は、Express Editionでも列ストアインデックスとインメモリテーブルをサポートしています。あなたが今しようとしていることは、既に利用可能です。インメモリーテーブルや列ストアを使用するだけで、1000倍の改善が得られます。 –
一般的に、本番環境では発生していない開発環境の問題のために、動作中のデータベース構造とクエリを変更しないことを強くお勧めします。両方の環境でクエリの説明計画を取得し、何が異なるかを把握します。これは、あなたのdevコンピュータの設定上の問題、ハードウェアの問題、古い統計である可能性があります。そして、あなたの開発マシンでうまくいくものは、実際にはパフォーマンスが悪いかもしれません! –
@ PanagiotisKanavos私が働く会社のクライアントは、私たちが縛られているデータベースを指示しています。 –