2016-12-08 7 views
0

開発マシン(サーバーボックスではありません)で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を使用することもできます。

+0

なぜこのような処理にサポートされていないデータベースを使用していますか? SQL Server 2016は、Express Editionでも列ストアインデックスとインメモリテーブルをサポートしています。あなたが今しようとしていることは、既に利用可能です。インメモリーテーブルや列ストアを使用するだけで、1000倍の改善が得られます。 –

+0

一般的に、本番環境では発生していない開発環境の問題のために、動作中のデータベース構造とクエリを変更しないことを強くお勧めします。両方の環境でクエリの説明計画を取得し、何が異なるかを把握します。これは、あなたのdevコンピュータの設定上の問題、ハードウェアの問題、古い統計である可能性があります。そして、あなたの開発マシンでうまくいくものは、実際にはパフォーマンスが悪いかもしれません! –

+0

@ PanagiotisKanavos私が働く会社のクライアントは、私たちが縛られているデータベースを指示しています。 –

答えて

1

はい、以前のリリースのMsSQLでも優れた方法がありますが、それは関係しています。まず、このプロセスはストアドプロシージャで実行する必要があります。ストアドプロシージャは、入力パラメータの2つ、要求されたページ(@page)、およびページサイズ(1ページあたりのレコード数 - @pgSiz)を取る必要があります。ストアドプロシージャで

がために主キー、一時テーブル変数を作成し、インデックス化、整数そのものであるROWNUMBER列で、その中にすべてのレコードの整数主キーのソートされたリストを置きます一時テーブルどのページ(ページ・サイズ)に基づいて、次に

Declare @PKs table 
    (rowNo integer primary key Identity not null, 
    vehicleId integer not null) 
Insert @PKS (vehicleId) 
Select vehicleId from Vehicles 
Order By --[Here put sort criteria as you want pages sorted] 
      --[Try to only include columns that are in an index] 

、(@page、@pgSiz)ユーザ要求、ストアドプロシージャは、この一時テーブルに結合することにより、そのページのための実際のデータを選択します変数:

Select [The data columns you want] 
From @PKS p join Vehicles v 
    on v.VehicleId = p.VehicleId 
Where rowNo between @page*@pgSiz+1 and (@page+1)*@pgSiz 
order by rowNo -- if you want to sort page of records on server 

と仮定すると、@pageは0ベースです。また、ストアドプロシージャは、@page@pgSizeの値が妥当であることを保証するために、いくつかの入力引数の検証が必要です(コードをレコードの最後に入れないでください)。)

+0

ありがとう、私はそれを試してみましょう。 –

+0

恐ろしい!私の質問時間は約3分から6秒に短縮されました!ありがとうございます –

+0

これを受け入れられた回答としてマークしてください? –

関連する問題