私のSQL(Server 2008)に関する低レベルの知識は限られており、現在DBAによって挑戦されています。説明させてください(私は私が正しいことを期待して明白な発言を述べましたが、何か問題を見つけた場合は教えてください)シナリオ: 人のための「裁判所命令」を保持するテーブルがあります。テーブル(名前:CourtOrder)を作成したとき、次のように作成しました。 CREATE TABLE dbo.CourtOrder ( CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key) PersonId INT NOT NULL, + around 20 other fields of different types. ) 次に、非効率的なインデックスを主キーに適用しました(効率を高めるため)。私の理由は、それが一意のフィールド(主キー)であり、主に選択目的のためにインデックス付けする必要があることです。Select from table where primary key = ... 次に、CLUSTEREDインデックスをPersonIdに適用しました。その理由は、作業の大部分が人の注文を得ているため、特定の人の注文を物理的にグループ化するためでした。そう、select from mytable where personId = ... 私は今これに引っ張られています。クラスタ化インデックスを主キーに配置し、通常のインデックスをpersonIdに配置する必要があると言われました。それは私には非常に奇妙に思えます。まず、クラスター化インデックスを一意の列に配置するのはなぜですか。それはクラスタリングとは何ですか?確かに、それはクラスタ化インデックスの無駄です。通常のインデックスが一意の列で使用されると思っていました。また、インデックスをクラスター化すると、別の列をクラスター化できなくなります(テーブルごとに1つですよね?)。 私が誤りを犯したと言われる理由は、クラスター化されたインデックスをPersonIdに置くと挿入が遅くなると彼らが信じているからです。選択の速度が5%向上すると、挿入と更新の速度が95%低下します。それは正しいですか? personIdをクラスター化するため、PersonIdを挿入または変更するときは常にSQL Serverがデータを再配置する必要があると彼らは言います。 それで私は尋ねました、もしそれがとても遅いのになぜSQLはCLUSTERED INDEXの概念を持っているのでしょうか?彼らが言っているのと同じくらい遅いですか?最適なパフォーマンスを実現するには、どのようにインデックスを設定する必要がありますか?私はSELECTがINSERTよりも使用されていると思っていました...しかし、彼らはINSERTSでロックの問題があると言っています... 誰かが私を助けてくれることを願っています。
昨日 、2つのポイント構造体(タプル)を追加するメソッドのいくつかの言語(C ++、C#、Java、JavaScript)のベンチマークとなった「.NET Struct Performance」というタイトルのChristoph Nahrの記事を見つけましたdouble。 結局のところ、C ++バージョンは実行に約1000ミリ秒(1e9反復)かかりますが、C#は同じマシン上で〜3000ミリ秒を下回ることはできません(x64ではパフォーマンスがさらに低下します)。 自分でテストするために、C#コード(およびパラメーターが値で渡されるメソッドのみを呼び出すように少し簡略化)を取り、i7-3610QMマシン(シングルコアの場合は3.1Ghzブースト)、8GB RAM、Win8で実行しました。 1、.NET 4.5.2を使用して、RELEASEビルド32ビット(私のOSは64ビットであるためx86 WoW64)。これは簡略版です: public static class CSharpTest { private const int ITERATIONS = 1000000000; [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Point AddByVal(Point a, Point b) { return new Point(a.X + b.Y, a.Y + b.X); } public static void Main() { Point a = …