データベース管理者

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

2
LOB_DATA、遅いテーブルスキャン、およびいくつかのI / Oに関する質問
列の1つがXMLデータで、XMLエントリの平均サイズが約15キロバイトのかなり大きなテーブルがあります。他のすべての列は、通常のint、bigint、GUIDなどです。具体的な数値を得るために、テーブルの行数が100万で、サイズが最大15 GBであるとします。 私が気づいたのは、すべての列を選択したい場合、このテーブルからのデータ選択が本当に遅いということです。私がする時 SELECT TOP 1000 * FROM TABLE ディスクからデータを読み取るのに約20〜25秒かかります-結果に順序を付けませんが。コールドキャッシュを使用して(つまり、後にDBCC DROPCLEANBUFFERS)クエリを実行します。IO統計の結果は次のとおりです。 スキャンカウント1、論理読み取り364、物理読み取り24、先読み読み取り7191、lob論理読み取り7924、lob物理読み取り1690、lob先読み読み取り3968 最大15 MBのデータを取得します。実行計画には、予想どおりクラスター化インデックススキャンが表示されます。 クエリ以外にディスクでIOが実行されていません。また、クラスター化インデックスの断片化が0%に近いことも確認しました。これは一般消費者向けのSATAドライブですが、SQL Serverは〜100-150 MB / minよりも速くテーブルをスキャンできると思います。 XMLフィールドが存在すると、ほとんどのテーブルデータがLOB_DATAページに配置されます(実際、テーブルページの約90%がLOB_DATAです)。 私の質問は-LOB_DATAページはサイズだけでなく、テーブルに多くのLOB_DATAページがある場合にSQL Serverがクラスター化インデックスを効果的にスキャンできないため、低速スキャンを引き起こす可能性があると考えるのは正しいですか? さらに広く-そのようなテーブル構造/データパターンを持つことは合理的であると考えられていますか?Filestreamを使用する際の推奨事項では、通常、フィールドサイズがはるかに大きくなるため、実際にはそのような道を行きたくありません。私はこの特定のシナリオに関する良い情報を実際に見つけていません。 私はXML圧縮を検討してきましたが、クライアント上またはSQLCLRで行う必要があり、システムに実装するにはかなりの作業が必要になります。 圧縮を試みましたが、XMLは非常に冗長であるため、(ac#アプリで)XMLを20KBから〜2.5KBに圧縮し、VARBINARY列に格納して、LOBデータページの使用を防ぎます。これにより、テストでSELECTが20倍高速化されます。

2
アクセントセンシティブソート
なぜこれらの2つのSELECTステートメントが異なるソート順になるのですか? USE tempdb; CREATE TABLE dbo.OddSort ( id INT IDENTITY(1,1) PRIMARY KEY , col1 NVARCHAR(2) , col2 NVARCHAR(2) ); GO INSERT dbo.OddSort (col1, col2) VALUES (N'e', N'eA') , (N'é', N'éB') , (N'ë', N'ëC') , (N'è', N'èD') , (N'ê', N'êE') , (N'ē', N'ēF'); GO SELECT * FROM dbo.OddSort ORDER BY col1 …

2
数百台のマシンでSQL ServerのCU更新を実行するクールな方法はありますか?
私の会社は、合併買収で一晩で50台のSQL Serverから200台以上に成長しました。助けて! 私の質問は: この多くのサーバーでCUの更新を実行し、それでも生命を保ち、正気を保つにはどうすればよいですか?SCCMはCU更新を実行できないようです。 他の誰かが何百台ものサーバーでCU更新を実行できましたか? 他の選択肢は何ですか?

2
タイムスタンプをPostgreSQLに最適に保存する方法は?
私はPostgreSQL DBの設計に取り組んでおり、タイムスタンプをどのように保存するのが最善か疑問に思っています。 仮定 異なるタイムゾーンのユーザーは、すべてのCRUD機能にデータベースを使用します。 私は2つのオプションを見ました: timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC') bigint NOT NULL DEFAULT 以下のためにtimestamp私は、INSERTモーメントの正確な(UTC)のタイムスタンプを表すことになり、文字列を送信します。 以下のためにbigint私はまったく同じことを格納し、その数形式のでしょう。(タイムゾーンの問題はミリスがサーバーに引き渡される前に処理されるため、UTCでは常にミリスです。) を格納するbigintことの主な利点の1つは、正しい形式のタイムスタンプの受け渡しが単純な数値よりも複雑であるため(Unix Epocからのミリ秒)、格納および取得が容易になることです。 私の質問は、どちらが最も柔軟な設計を可能にし、各アプローチの落とし穴になる可能性があるものです。

3
トレースフラグ4199-グローバルに有効にしますか?
これは意見の範疇に入るかもしれませんが、人々がSQL Serverの起動パラメーターとしてトレースフラグ4199を使用している場合、私は興味があります。それを使用した人のために、どのような状況でクエリ回帰が発生しましたか? 確かに全体的なパフォーマンスの向上の可能性があるように思えます。非実稼働環境でグローバルに有効にし、問題を排除するために数か月間放置することを検討しています。 4199の修正は、2014年(または2016年)にデフォルトでオプティマイザーに反映されますか?予期しない計画変更を導入しない場合は理解できますが、バージョン間でこれらの修正をすべて隠しておくのは奇妙に思えます。 2008、2008R2、主に2012を使用しています。

4
エンティティ関係の問題
このように関連する4つのテーブルがあります(例です)。 Company: ID Name CNPJ Department: ID Name Code ID_Company Classification: ID Name Code ID_Company Workers: Id Name Code ID_Classification ID_Department classificationwith があるとしid = 20, id_company = 1ます。そして、departmentそれはid_company = 2(別の会社を表す)持っています。 これにより、分類と部門が別々に会社にリンクされるため、2つの会社の従業員を作成できます。そんなことはしたくないので、人間関係に問題があり、それを解決する方法がわかりません。

2
PostgreSQLがパフォーマンスSSDを最大化
テーブルごとに1億以上のエントリを持つ多くのテーブルを持つ巨大なPostgreSQL 9.3データベースを作成します。このデータベースは、基本的に読み取り専用(必要なテーブルをすべて埋めて、DBでインデックスを作成しない場合)、シングルユーザーアクセス(ローカルホストから複数のクエリを実行およびベンチマーク)されるため、DBが使用されます研究目的のみ。クエリは常に整数DBフィールドでJOINを使用します。 この目的のために、おそらくSSD(256-512GB)を購入するでしょう。DBにSSDを使用したことがないので、心配する必要はありますか?DB全体をSSDに置くことも、インデックスだけを置くこともできますか?SSD用にPostgreSQLをチューニングするために必要な特別なアドバイスやチュートリアルはありますか?i7と32GbのRAMを備えた優れたワークステーションがあることに注意してください。

4
ID列のインデックスは非クラスター化する必要がありますか?
ID列を持つテーブルの場合、ID列に対してクラスター化または非クラスター化PK /一意のインデックスを作成する必要がありますか? その理由は、クエリ用に他のインデックスが作成されるためです。非クラスター化インデックス(ヒープ上)を使用し、インデックスでカバーされない列を返すクエリは、余分なクラスター化インデックスBツリーシークステップがないため、使用する論理I / O(LIO)が少なくなりますか? create table T ( Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table) A .... -- A, B, C have mixed data type of int, date, varchar, float, money, .... B .... C .... ....) create …

8
特定のログインに対してマップされたすべてのユーザーをリストするクエリ
特定のログインのプロパティを見ると、そのログインにマップされているユーザーのリストを見ることができます: SQL Server Management Studio(SSMS)のプロファイルを作成しましたが、SSMSはすべてのデータベースに一度に1つずつ接続し、sys.database_permissionsから情報を取得することがわかりました 上記のユーザーマッピング情報を取得する単一のクエリを作成することは可能ですか、それともカーソルやsp_MSforeachdbなどを使用する必要がありますか?

2
ダンプの復元中にすべての制約とテーブルチェックを無効にします
私は私のPostgreSQLデータベースのダンプを取得しました: pg_dump -U user-name -d db-name -f dumpfile 次に、次のコマンドを使用して別のデータベースに復元します。 psql X -U postgres -d db-name-b -f dumpfile 私の問題は、データベースに参照制約、チェック、トリガーが含まれていることと、これらのチェック(特にチェック)の一部が復元中に失敗することです。たとえば、テーブルへの行の挿入は、他の無関係なテーブルで条件が成立するかどうかをチェックCHECKするplpgsql関数を呼び出すに関連付けられます。後者のテーブルがpsql前者の前に読み込まれない場合、エラーが発生します。 以下は、一度ダンプするpg_dumpと復元できないデータベースを生成するSSCCEです。 CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$ SELECT EXISTS (SELECT 1 FROM b) $$ LANGUAGE SQL; CREATE TABLE IF NOT EXISTS a ( i INTEGER NOT NULL ); …

3
クエリのパフォーマンスを最適に測定するにはどうすればよいですか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 5年前に移行され ました。 2つのストアドプロシージャがあり、2番目のストアドプロシージャは最初のストアドプロシージャの改良版です。 どれだけ改善されているかを正確に測定しようとしています。 1 / clock time実行時間が異なるため、測定はオプションではないようです。さらに悪いことには、2番目のストアドプロシージャの実行時間が、2番目のストアドプロシージャの実行時間よりも長い場合があります(まれに起こります)(その瞬間のサーバーのワークロードによると思います)。 2 / Include client statisticsは、異なる結果も提供します。 3 / DBCC DROPCLEANBUFFERS、DBCC FREEPROCCACHE良いですが、同じ話... 4 / SET STATISTICS IO ONはオプションかもしれませんが、ストアドプロシージャに多くのテーブルが関係しているので、どうすれば総合スコアを取得できますか? 5 / Include actual execution planもオプションです。estimated subtreecost最初のストアドプロシージャで0.3253を取得し、2番目のストアドプロシージャで0.3079 を取得します。2番目のストアドプロシージャは6%高速(= 0.3253 / 0.3079)と言えますか? 6 / SQL Server Profilerの「読み取り」フィールドを使用していますか? では、実行条件(サーバーのワークロード、これらのストアドプロシージャが実行されるサーバーなど)に関係なく、2番目のストアドプロシージャが最初のプロシージャよりもx%高速であると言えますか? それが不可能な場合、2番目のストアドプロシージャの実行時間が最初のストアドプロシージャよりも優れていることをどのように証明できますか?

2
mysqlでシーケンスを生成する方法
mysqlでこのテーブルを検討してください create table numbers (number int); insert into numbers values (3), (2), (9); select * from numbers; +--------+ | number | +--------+ | 3 | | 2 | | 9 | +--------+ 次の列を持つテーブルを生成する簡単なクエリはありますか 1から10までの数字 テーブル番号に番号が存在する場合は1、そうでない場合は0 これを行うには、一連の数字を作成する必要があると思います。可能であれば、データベースに保存せずにそのようなシーケンスを作成したいと思います。 関連質問:1から10(または100または1000)の数字のシーケンスを生成する選択クエリはありますか?
19 mysql  sequence 

2
CREATE TABLEをロックする
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 5年前に移行され ました。 別のアプリケーションでは、設計が悪いことに感銘を受けました。複数のスレッドがEnsureDatabaseSchemaExists()メソッドを同時に実行します。これは基本的に次のようになります。 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN CREATE TABLE MyTable ( ... ); END ただし、SERIALIZABLEトランザクションで実行された場合でも、このコードはスレッドセーフではないようです(つまり、並列コードはテーブルを複数回作成しようとします)。別のスレッドがまったく同じSELECTステートメントを実行できないようにするロックを取得するためにSELECTステートメントを強制する機会はありますか? multi-threaded-EnsureSchemaExists()メソッドのより良いパターンはありますか?

1
24時間365日と夜間の時間枠
年中無休の運用に移行する方法に関するリソースはどこにありますか?大きなデータベースを持つ大企業はどのようにこれを達成しますか?次のような夜間の仕事 古いデータを消去する 再インデックス 統計を更新する すべてがシステムに重大な影響を与えるようです(つまり、オンラインユーザーとリアルタイムデータフィード)。このテーマに関連する本をAmazonで探しましたが、今のところ何も見つかりませんでした。
19 sql-server 

2
MySQLはクエリをキャッシュしますか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行され ました。 MySQLデータベースとPHP Data Objects(PDO)を接続し、広範なSQLクエリを実行しています。通常、約1500ミリ秒かかります。まだ最適化する必要があります。PHPスクリプトを短い間隔で2回実行すると、クエリにかかる時間は約90ミリ秒です。クエリはどちらの場合も同じです。同じクエリでスクリプトを実行すると、しばらくしてから再び1500ミリ秒かかります。 何故ですか?データベースは自動的にキャッシュされますか?データベースがキャッシュを保存してから自動的に削除する時間はありますか? これは2つの異なるスレッドで発生するため、PHPで結果をキャッシュできないと思います。データベースが変更されたかどうかを知ることができないため、PHPが結果をキャッシュするとは思わないでしょう。 データベースに新しい行を挿入するスクリプトを毎分実行しています。これは、しばらくして再び1500ミリ秒かかる理由でもあります。関連するテーブルが同じではなくなったため、キャッシュは削除されていました。
19 mysql 

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