データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

2
非クラスター化インデックスの挿入
次のようなテーブルがあるとします。 create table SomeTable ( id int identity(1, 1) not null primary key clustered, SomeString1 varchar(50) not null, SomeString2 varchar(50) not null ) go create nonclustered index IX_SomeString1 on SomeTable(SomeString1) go 私がこれをするなら: insert into SomeTable(SomeString1, SomeString2) values('foo', 'bar') go 実際の実行計画を表示すると、クラスター化インデックスの挿入しか表示されません。実行プランに非クラスター化インデックスの挿入が表示されないのはなぜですか?
10 sql-server 

2
Debianで単一のMySQLクエリに複数のコアを使用する
ゲストOSとしてDebianを使用するVM(VMWare)でテスト用のMySQLサーバーを実行しています。ゲストには4つのエミュレートされたCPUコアがあるため、thread_concurrencyを4に設定しました。 数分かかる可能性のある大きなテーブルで高価な結合を行っていますが、ゲストOSで一度に使用されるコアは1つだけです。これは、関係するテーブルに使用されているストレージエンジンに関係なく発生します(MyISAMおよびInnoDBでテスト済み)。さらに、これらの大きなクエリを実行すると、データベース全体がブロックされているように見えるため、追加のクエリを並行して実行することはできません。奇妙なことに、htopは、クエリに使用されるコアがクエリの実行中に変化することを示しています! なぜこれが起こるのですか? これは関連するエントリですSHOW FULL PROCESSLIST;(他のクエリはありません)。 | 153 | root | localhost | pulse_stocks | Query | 50 | Copying to tmp table | SELECT DISTINCT * FROM `pulse_stocks`.`stocks` sto, `pulse_new`.`security` sec WHERE (sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR ( sto.isin = sec.isin AND sto.isin <> "" AND …

1
SQL Serverベースラインテストの手順の決定的なリスト?
SQL Serverを使用するアプリのパフォーマンステスト/ベースラインを実行する前に、インスタンスを再起動せずにインスタンスを「クリーン」な状態に設定できるようにしたいと考えています。私は従う傾向があるステップがありますが、正しい順序であり、冗長なステップがない決定的なリストを作成したいと思います。 この手順の一覧では、SQL Serverを「クリーン」な状態に設定できますか? シーケンスは論理的/正しいですか? 余分な手順はありますか? CHECKPOINT -- Write all dirty pages DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint? DBCC FREEPROCCACHE -- Clear the plan cache DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE? DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want …



3
在庫アイテムにさまざまな属性がある場合の在庫データベース構造
エンタープライズハードウェア情報を格納するためのインベントリデータベースを構築しています。データベースがワークステーション、ラップトップ、スイッチ、ルーター、携帯電話などからの範囲を追跡するデバイス。デバイスのシリアル番号を主キーとして使用しています。私が抱えている問題は、これらのデバイスの他の属性がさまざまであり、他のデバイスに関係のないフィールドをインベントリテーブルに含めたくないということです。以下は、データベースの一部のERDへのリンクです(一部のFK関係は表示されていません)。たとえば、ワークステーションデバイスタイプのデバイスを電話テーブルに配置できないように設定しようとしています。これには、デバイスタイプまたはクラスを検証するために多くのトリガーを使用する必要があり、異なる属性を持つ異なるデバイスが追跡されるときはいつでも新しいテーブルが使用されます。 シリアル番号にマップできる属性テーブルの設定を調べましたが、デバイスタイプに適用されない属性をデバイスに割り当てることができます。たとえば、必要に応じて誰かがワークステーションに電話番号属性を割り当てることができます。 。このサイトで次のような構造の説明を見つけました。 この構造は、属性がすべて私が保存しているアイテムに適用できる場合に最適です。たとえば、データベースに携帯電話のみが格納されている場合、属性は、タッチスクリーン、トラックパッド、キーボード、4G、3Gなどです。その場合、それらはすべて電話に適用されます。データベースには、hostname、circuitType、phoneNumberなどの属性があり、特定のタイプのデバイスにのみ適用されます。 特定のデバイスタイプに適用される属性のみがそのタイプのデバイスに割り当てられるように設定します。このデータベースのセットアップ方法に関する提案はありますか?これが1対1の関係の適切な使用であるかどうか、またはこれを行うより良い方法があるかどうかはわかりません。お時間を割いていただき、誠にありがとうございます。 ここに私が読んだ他のスレッドのいくつかがあります。彼らは私にいくつかの良い洞察を与えました、しかし私は彼らが本当に適用するとは思いません: /programming/9335548/how-to-structure-database-for-inventory-of-unlike-items /programming/1249632/database-structure-for-items-with-varying-attributes /programming/5559587/product-inventory-with-multiple-attributes /programming/6613802/question-about-setting-up-inventory-database /programming/514111/how-to-best-represent-items-with-variable-of-attributes-in-a-database

6
SQL Serverはクエリを並列で実行しますか?
SQL Serverはクエリを並列で実行しますか?言い換えると、実行に10秒かかる重いクエリを実行し、同時に10秒かかる別の重いクエリを開始した場合、2番目のクエリは実際に10秒後に開始するか、両方を同時に開始しますか?
10 sql-server 

2
ストアドプロシージャの作成時にテーブルが存在する場合でも、遅延名前解決を強制する方法はありますか?
SQL Serverでストアドプロシージャを作成する場合、存在しないテーブルを参照できます。ただし、テーブルが存在する場合は、手順で参照するすべての列がそのテーブルに存在する必要があります(遅延名前解決)。 存在するかどうかに関係なく、プロシージャで参照されるすべてのテーブルの名前解決を遅らせるようにSQL Serverに指示することはできますか?一般的な構文チェックを維持したいので、可能であったとしても、ストアドプロシージャ定義をシステムテーブルにハッキングすることはできません。 私はこれを行うことを要求することは少し奇妙に思われるかもしれないと思うので、ここにいくつかの背景があります:C#で書かれたアプリケーションからテーブル定義とストアドプロシージャを自動生成し、SQLの必要に応じてコードを変更して変更を順序付けるのは非常に困難ですそれら。私のコードは、スキーマがトランザクション内で一貫していることを「保証」しますが、現在、テーブルカラムを定義する前に、それらを参照するストアドプロシージャを定義することは保証できません。 以下は、C#によって作成されたSQLの標準的な例であり、私が解決しようとしている問題を「例示」しています。 --Say this table already exists. CREATE TABLE myTable ( a NVARCHAR(MAX) ) GO --My C# code creates something like this BEGIN TRAN GO --the stored procedure gets generated first. CREATE PROCEDURE mySproc AS BEGIN SELECT a,b FROM myTable END --then the table update ALTER …

2
ウィンドウ関数は、外部パラメーター化された 'where'句を含むビューから呼び出されると、ひどい実行プランを引き起こします
私はずっと前にこの問題を抱えていましたが、自分に合った回避策を見つけ、それを忘れていました。 しかし、今はその問題がSOにあるので、この問題を取り上げるつもりです。 非常に簡単な方法(注文+注文明細)でいくつかのテーブルを結合するビューがあります。 where句なしでクエリを実行すると、ビューは数百万行を返します。 しかし、誰もそれをそのように呼ぶことはありません。通常のクエリは select * from that_nasty_view where order_number = 123456; これは、5分のうち約10レコードを返します。 重要なこと:ビューにはウィンドウ関数が含まれています。ウィンドウ関数はrank()、ビューが常に照会されるフィールドによって正確に分割されます。 rank() over (partition by order_number order by detail_line_number) さて、このビューがクエリ文字列のリテラルパラメータでクエリされた場合、上記とまったく同じように、ビューは即座に行を返します。実行計画は問題ありません: インデックスを使用して両方のテーブルのインデックスシークorder_number(10行を返します)。 返された小さな結果に対するウィンドウの計算。 選択。 ただし、ビューがパラメーター化された方法で呼び出されると、状況が悪化します。 Index scanインデックスを無視してすべてのテーブルで。5m行を返します。 巨大な参加。 すべてpartitionのsのウィンドウを計算しています(約500kウィンドウ)。 Filter 5mから10列を取る。 選択する これは、パラメーターが関係するすべての場合に発生します。それはSSMSである場合もあります: declare @order_number int = 123456; select * from that_nasty_view where order_number = @order_number; これは、ExcelなどのODBCクライアントにすることができます。 …

2
SQL Server 2008でインデックスを強制的にメモリに保持する方法はありますか?
数百万行のテーブルがあり、そこからクエリを時々実行する必要があります。通常、最初のクエリは非常に遅くなり(約10秒)、その後のクエリは通常、かなり高速になります(約1秒)。数時間後、遅い/その後速いサイクルが再び始まります。 必要なすべてのインデックスが存在し、適切に使用されていることを実行プランで確認しました。パフォーマンスの違いは、インデックスが後続のクエリのために実際にメモリ内にあるためであると思います(私は正しいですか、それとも他にもあります)考えられる原因?) また、インデックスを使用して他の多くのクエリも実行していますが、これらのクエリは時間がかかりませんし、そのパフォーマンスはそれほど重要ではないため、これらのインデックスが実際に重要なインデックスをメモリキャッシュから押し出しているのではないかと心配しています。 「RAMを追加する」という明らかな修正とは別に、インデックスをメモリに強制的に戻すためにダミークエリを1時間ごとに実行するスクリプトを作成することを考えていました。 これを行うよりエレガントな方法はありますか?SQLServerに、1つの単一のインデックスをキャッシュするだけの十分なメモリがある場合、それをキャッシュする必要があることを示唆する方法と同様に、 私は通常、そのようなことに関してSQLServerを台無しにするのが最善ではないことを知っていますが、私のクエリの異常な性質(非常にまれに実行されますが、タイムクリティカル)は、それが理にかなっていると信じています(可能な場合) 。 また、特定の時点でどのインデックスがメモリにキャッシュされているかを知る方法があるかどうか知りたいです。

2
PostgreSQLは大文字と小文字を区別するデータベースを作成できますか?
一部のコードを一部のバージョンのSybaseからPostgreSQLに移植しています。これは、Sybaseクライアントライブラリを使用するCアプリケーションです。私のアプローチは、呼び出しdbsqlexec()をPQexec()(たとえば)に変換する変換レイヤーを記述することです。その部分はほとんど機能しています。 Sybaseデータベースは、(データベースオブジェクト名に関して)大文字と小文字を区別する方法で設定されているようです。たとえば、WIDGETテーブルとテーブルの両方がありwidgetます。このアプリケーションの規則は、すべて大文字の名前が実際のデータテーブルを示し、小文字の名前は処理を実行するときに一時テーブルとして使用されるようです。 4.1字句構造によると、「キーワードと引用符で囲まれていない識別子は大文字と小文字が区別されません。」識別子を二重引用符で囲んで小文字への自動折りたたみを無効にできることはわかっていますが、何十億行にもわたって手動で行う必要はありませんこのデータベースを使用するコードの。 データベースオブジェクト識別子のこの自動大文字小文字変換を無効にするようにPostgreSQLを設定する方法はありますか? 私の代替案は、各SQLステートメントを調べ、すべての識別子(キーワードではない)を二重引用符で囲むコードを記述することです。

4
SQL Server 2008 R2:コンピューター名の変更後の問題
ローカルSQL Serverインスタンスをホストしているリモートサーバーのコンピューター名を変更すると、混乱する問題が発生します。 基本的に、リモートサーバーはサイト間で移動されました。これを容易にするために、古いデータベースをバックアップして新しいデータベース名に復元し、データを消去して、クライアントソフトウェアの新しいデータベースとして使用できるようにしました。コンピューター名も変更しました。これは、サイト番号で各サーバーを識別するために常に変更するためです。 データベースはクライアントソフトウェアから問題なく接続でき、SQL Serverに直接ログインできます。ただし、SQL Serverエージェントジョブの1つが失敗し、イベントログにエラーが記録されます。 SQL Serverのスケジュールされたジョブ 'Nightly Reset'(0x4F76FDFFF6DFFE4EA0DE4A70252AD3BD)-ステータス:失敗-起動日:2012-02-07 08:10:05-メッセージ:ジョブが失敗しました。ジョブNightly Resetの所有者(Site-19 \ Admin)にサーバーアクセスがあるかどうかを判別できません(理由:Windows NTグループ/ユーザー 'Site-19 \ Admin'に関する情報を取得できませんでした、エラーコード0x534。[SQLSTATE 42000](エラー15404))。 これで、「サイト-19」は変更された古いコンピューター名になり、サーバーがリセットされました。新しいサイト番号「Site-28」を使用して手動で接続すると、Site-28 \ Adminを使用してSQL Serverに接続されていることが表示されます。ただし、エージェントジョブのプロパティを見ると、所有者がSite-19 \ Adminであると表示され、ユーザーを参照して変更しようとすると、Site-28 \ Adminがオプションとして表示されません。 、Site-19 \ Adminのみ。このジョブから新しいジョブをスクリプト化し、所有者を手動で「Site-28 \ Admin」に変更すると、新しいジョブは所有者「Site-19 \ Admin」で作成されます。 sys.servers(またはsp_helpserver経由)を見ると、現在のコンピューター名という1つのエントリしかありません。ただし、SELECT @@ SERVERNAMEは元の開発マシン名を返します(2つ前の名前の変更)。 つまり、この重要なSQL Serverエージェントジョブは、存在しないユーザーに属しているため実行できず、変更または正しいユーザーとして作成する方法がわかりません。

3
Oracleの左結合とwhere句のエラー
CREATE TABLE "ATABLE1" ( "COLUMN1" VARCHAR2(20 BYTE), "COLUMN2" VARCHAR2(20 BYTE) ); CREATE TABLE "ATABLE2" ( "COLUMN1" VARCHAR2(20 BYTE), "COLUMN2" VARCHAR2(20 BYTE) ); Insert into ATABLE1 (COLUMN1,COLUMN2) values ('A','1'); Insert into ATABLE1 (COLUMN1,COLUMN2) values ('B','2'); Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A',null); Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','1'); Insert into ATABLE2 (COLUMN1,COLUMN2) …
10 oracle  join 

1
使用中のマスター/スレーブ複製システムで単一のmysqlデータベースを回復する
忙しいレプリケートされたシステムで単一のデータベースを特定の時点にリカバリするための戦略またはツールを探しています。 マスタースレーブ複製構成の2つのMySQL 5.0.77サーバーで実行されている12のデータベースがあります。読み取り専用スレーブのフルダンプが毎日取得され、これらのバックアップがオフサイトにある増分SQLダンプが利用可能であり、レプリケーションステータスが監視されます。 編集:テーブルはInnoDBとmyISAMの混合であるため、エンジン固有のソリューションは利用できません。 したがって、マスターサーバーに完全な障害が発生した場合、レプリケーションを中断してスレーブサーバーを昇格させることができます。また、新しいサーバーを再構築してオフサイドのフルバックアップから構成し、スレーブから1時間ごとに取得した差分を適用することもできます。 ただし、部分的な障害、または単一のデータベースの障害に対処する方法を心配しています。かなりありそうな2つのシナリオを考えることができます。 データベース7(たとえば)が破損し、壊れていることに誰かが気付くまで、またはログファイルからアラートが出されるまで、いくつかの要求を処理し続けます... 「データベースの削除」、「テーブルの削除」、「更新場所...」タイプのクエリなどのクエリは、単一のデータベース、またはその一部のサブセットを作成します。 現時点では、FULL- $ DATE-all-databases.sql.gzファイルとしての一連のフルダンプと、DIFF- $ DATE-all-databases.sql.gzとしてフルダンプに適用できる差分があります。 データベース7を特定の時点に復元するには、FULLおよびDIFFファイルを介したgrepと、そのSQLの手動による適用が必要です。 マスターデータベースへの以前のDIFFダンプの1つに回復できるようにするには、どうすればよいですか? 個々のデータベースファイルにバックアップする必要がありますか? mysqldump --databases "database1" | gzip > database1.sql.gz mysqldump --databases "database2" | gzip > database2.sql.gz mysqldump --databases "database3" | gzip > database3.sql.gz のではなく.. mysqldump --master-data --lock--all-databases --all-databases | gzip > all-databases.sql.gz 個別のmysqldumpファイルを使用する場合、マスターデータのバイナリログはどうなりますか?マスターサーバーのリカバリダンプに--master-dataを設定する必要がありますか?

3
SQLで1対0または1の関係を実装する
1対0または1(1-0..1)の関係が存在するシナリオ用のデータベースを設計しているとしましょう。例えば: ユーザーのセットがあり、一部の ユーザーは顧客である場合もあります。 したがって、対応する2つのテーブル、usersおよびを作成しましたcustomersが、… …特定のSQLプラットフォームでこの状況を表現して実装する最良の方法は何ですか?私は2つの可能な解決策を検討しました: でusersテーブル、追加customerのFOREIGN KEY参照のいずれであってもよく、列customersまたはNULLマーク。 customersテーブルに、テーブルを指すuser列(UNIQUE制約付きで設定)を含めusersます。 すでにいくつかのフォーラムで同様の質問をしましたが、答えは基本的に「必要なものは何でも」「便利だと思うものは何でも」でした。このような答えは好きではありません。代わりに、DB理論の真面目な部分が必要です。1-0..1の関係についてどこで確認できますか?

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