データベース管理者

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

2
CREATE OR REPLACEを使用してPostgreSQLビューの列の名前を変更することはできません
PostreSQL 8.3では、既存のテーブルのように見えるが、異なる列名を持つビューを作成しようとしています。 これは動作します CREATE OR REPLACE VIEW gfam.nice_builds AS SELECT (family_tree.family_tree_id) as x, family_tree.family_tree_name, family_tree.family_tree_description FROM gfam.family_tree; 上記はfamily_treeテーブルの複製を作成しますが、次の試みは失敗します: CREATE OR REPLACE VIEW gfam.nice_builds AS SELECT (family_tree.family_tree_id) as x, family_tree.family_tree_name, family_tree.family_tree_description FROM gfam.family_tree; エラー:ビュー列「family_tree_id」の名前を変更できません 列の名前を変更するにはどうすればよいですか?
37 postgresql 

1
MySQL:なぜmysql.dbに「テスト」エントリがあるのですか?
最近、mysql.dbに関する質問への回答を投稿しました。 それから、私は皆にこの質問をするべきだと考えました: 何年もの間、MySQL 5.0+のインストール時にmysql.db、匿名ユーザーがテストデータベースにアクセスできるようにする2つのエントリが存在することに気づきました。 次のクエリを実行して確認できます。 mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G *************************** 1. row *************************** Host: % Db: test User: Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Grant_priv: N References_priv: Y Index_priv: Y Alter_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Create_view_priv: Y Show_view_priv: …
37 mysql  security 

7
クエリを再現するために必要なデータベースのサブセットをmysqldumpすることは可能ですか?
バックグラウンド selectクエリを再現するために必要なデータベースのサブセットを提供したいと思います。私の目標は、計算ワークフローを再現可能にすることです(再現可能な研究のように)。 質問 このselectステートメントを、クエリされたデータを新しいデータベースにダンプするスクリプトに組み込んで、データベースを新しいmysqlサーバーにインストールし、ステートメントが新しいデータベースで機能するようにする方法はありますか。新しいデータベースには、クエリで使用されたレコードに加えてレコードを含めるべきではありません。 更新: 明確にするために、クエリ結果のcsvダンプには興味がありません。私ができる必要があるのは、データベースのサブセットをダンプして、別のマシンにインストールできるようにすることです。そうすれば、クエリ自体を再現可能にすることができます(同じデータセットに関して変更可能です)。 例 たとえば、私の分析では、複数の(この例では3つの)テーブルからのレコードを必要とするデータのサブセットを照会します。 select table1.id, table1.level, table2.name, table2.level from table1 join table2 on table1.id = table2.table1_id join table3 on table3.id = table2.table3_id where table3.name in ('fee', 'fi', 'fo', 'fum');

6
エラーコード1117列が多すぎます。テーブルのMySQL列制限
1699列のテーブルがあり、さらに列を挿入しようとすると、 エラーコード:1117。列が多すぎます このテーブルには、1000行しかありません。私にとって最も重要なことは、列の数です。テーブルに制限はありますか?2000列を作成します。それは可能ですか?
37 mysql  table 

2
この特定の場合に、テーブル変数を#tempテーブルの2倍以上高速で使用するのはなぜですか?
ここで、一時テーブルとテーブル変数、およびSQL ServerのパフォーマンスとSQL Server 2008に対する影響についての記事を見て、 2005年に示された結果と同様の結果を再現することができました。 10行のみでストアドプロシージャ(以下の定義)を実行すると、テーブル変数バージョンは一時テーブルバージョンを2回以上実行します。 プロシージャキャッシュをクリアし、両方のストアドプロシージャを10,000回実行してから、さらに4回実行するプロセスを繰り返しました。以下の結果(バッチあたりのミリ秒単位の時間) T2_Time V2_Time ----------- ----------- 8578 2718 6641 2781 6469 2813 6766 2797 6156 2719 私の質問は次のとおりです。テーブル変数バージョンのパフォーマンスが向上する理由は何ですか? 調査を行いました。例:パフォーマンスカウンターを見る SELECT cntr_value from sys.dm_os_performance_counters where counter_name = 'Temp Tables Creation Rate'; どちらの場合も、一時オブジェクトは、最初の実行後にキャッシュされていることを確認し、予想通り呼び出しごとではなく、再びゼロから作成しました。 同様に、トレースAuto Stats、SP:Recompile、SQL:StmtRecompileこれらのイベントのみ(の最初の起動時に一度発生することを示しているプロファイラのイベント(下のスクリーンショット)を#tempテーブルストアドプロシージャ)および他の9,999の実行は、これらのイベントのいずれかを上げていません。(テーブル変数バージョンはこれらのイベントを取得しません) ストアドプロシージャの最初の実行のわずかに大きいオーバーヘッドは、全体的な大きな違いを説明することはできませんが、プロシージャキャッシュをクリアして両方のプロシージャを1回実行するのに数ミリ秒しかかからないため、統計または再コンパイルが原因である可能性があります。 必要なデータベースオブジェクトを作成する CREATE DATABASE TESTDB_18Feb2012; GO USE TESTDB_18Feb2012; CREATE TABLE NUM ( n …

2
外部適用と左結合のパフォーマンス
SQL SERVER 2008 R2を使用しています 私はSQLでAPPLYに出会い、多くの場合にクエリの問題を解決する方法が大好きでした。 結果を取得するために2つの左結合を使用していたテーブルの多くは、1つの外部適用を取得できました。 ローカルDBテーブルに少量のデータがあり、展開後、コードは少なくとも20倍のデータで実行されるはずです。 大量のデータの場合、外部適用は2つの左結合条件よりも時間がかかることが心配です。 誰でも正確に適用がどのように機能し、それが非常に大きなデータのパフォーマンスにどのように影響するかを伝えることができますか?可能であれば、n1 ^ 1またはn1 ^ 2に比例するような各テーブルのサイズとの比例関係... n1はテーブル内の行数です1。 以下は、左結合が2つのクエリです。 select EC.*,DPD.* from Table1 eC left join ( select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2 group by member_id,parent_gid,child_gid,LOB,group_gid ) DPD2 on DPD2.parent_gid = Ec.parent_gid AND DPD2.child_gid = EC.child_gid AND DPD2.member_id = EC.member_id AND DPD2.LOB = EC.default_lob AND …

2
MySqlのLAST_INSERT_ID()関数は正しいことが保証されていますか?
列INSERTを持つテーブルに単一の行を作成するAUTO_INCREMENT場合、LAST_INSERT_ID()関数を使用して、AUTO_INCREMENTその行に格納されている新しい'ed値を返します。 多くのMicrosoft SQL Server開発者と管理者がSQL Server(SCOPE_IDENTITYおよび@@IDENTITY)の同等の機能に問題がないことに気付いていないことは間違いない。 MySQLドキュメントの状態を知っています: 生成されたIDは、接続ごとにサーバーで維持されます。これは、関数によって特定のクライアントに返される値が、そのクライアントによって列にAUTO_INCREMENT影響を与える最新のステートメントに対して生成される最初の値であることを意味します。他のクライアントが独自の値を生成しても、この値は他のクライアントの影響を受けません。この動作により、各クライアントは、他のクライアントのアクティビティを気にすることなく、ロックやトランザクションを必要とせずに独自のIDを取得できます。AUTO_INCREMENTAUTO_INCREMENT (ソース) さらに言えば: 複数のクライアントからLAST_INSERT_ID()and AUTO_INCREMENT列を同時に使用することは完全に有効です。 (ソース) LAST_INSERT_ID()正しい値を返さない原因となる既知のリスクやシナリオはありますか? CentOS 5.5 x64およびFedora 16 x64およびInnoDBエンジンでMySQL 5.5を使用しています。

1
SQL Server 2017でSNAPSHOT_MATERIALIZATIONを使用してビューを作成するにはどうすればよいですか?
SQL Server 2017には、いくつかの新しいストアドプロシージャがあります。 sp_refresh_single_snapshot_view – @view_name nvarchar(261)、@ rgCode intの入力パラメーター sp_refresh_snapshot_views – @rgCode intの入力パラメーター sys.messagesの新しいエントリ: 10149-ビュー定義にメモリ最適化テーブルが含まれているため、SNAPSHOT_MATERIALIZATIONを持つインデックスをビュー '%。* ls'に作成できません。 10642-SNAPSHOT_MATERIALIZATIONは、ビューのインデックスにのみ適用されるため、 '%。* ls'のインデックス '%。* ls'に設定できません。 10643 – SNAPSHOT_MATERIALIZATIONは、ビューのクラスター化インデックスにのみ適用されるため、 '%。* ls'の '%。* ls'に設定できません。 10648 – SNAPSHOT_MATERIALIZATIONは、 '%。* ls'のパーティションインデックス '%。* ls'に設定できません。 10649-SNAPSHOT_MATERIALIZATIONのクラスター化インデックス '%。* ls'を持つ '%。* ls'には非クラスター化インデックス '%。* ls'を作成できません。 10650 –スナップショットビューを更新するには、データベースでスナップショット分離を有効にする必要があります。 3760 – SNAPSHOT_MATERIALIZATIONを持つビュー '%。* ls'のインデックス …


2
「ビットマップヒープスキャン」と「ビットマップインデックススキャン」を理解する
私の誤解を次の例で説明します。 の基本を理解していませんでしたBitmap Heap Scan Node。SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';計画がこれであるクエリを検討してください。 Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1) Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000)) -> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1) -> Bitmap Index Scan …
36 postgresql  index 

5
以前に高速なSQLクエリの実行が遅くなった場合、どこで問題の原因を見つけることができますか?
バックグラウンド 私は、約12の異なる「テーブル」を結合および/または左結合するSQL Server 2008 R2に対してクエリを実行しています。データベースはかなり大きく、5000万行を超える多くのテーブルと約300の異なるテーブルがあります。全国に10の倉庫がある大企業向けです。すべての倉庫は、データベースに対して読み取りと書き込みを行います。だから、かなり大きくてかなり忙しい。 私が問題を抱えているクエリは次のようになります: select t1.something, t2.something, etc. from Table1 t1 inner join Table2 t2 on t1.id = t2.t1id left outer join (select * from table 3) t3 on t3.t1id = t1.t1id [etc]... where t1.something = 123 結合の1つが非相関サブクエリ上にあることに注意してください。 問題は、今朝から、システムに変更を加えずに(私または私のチームの誰もが知っている)、クエリの実行に通常約2分かかり、実行に1時間半かかることです。まったく走った。データベースの残りの部分はうまくいっています。私は通常実行するsprocからこのクエリを取り出し、同じスローネスでハードコードされたパラメータ変数を使用してSSMSで実行しました。 奇妙なことに、非相関サブクエリを取得して一時テーブルにスローし、サブクエリの代わりにそれを使用すると、クエリは正常に実行されます。また、このコードをクエリの最後に追加すると、クエリが非常によく実行されます(これは私にとって最も奇妙なことです)。 and t.name like '%' これらの小さな実験から、スローダウンの理由は、SQLのキャッシュされた実行計画の設定方法によるものであると(おそらく間違って)結論付けました-クエリが少し異なる場合、新しい実行計画を作成する必要があります。 私の質問は次のとおりです:高速で実行されていたクエリが深夜に突然遅くなり、このクエリ以外に何も影響を受けない場合、どのようにトラブルシューティングし、今後発生しないようにするのですか? ?SQLが内部で何をして非常に遅くするかを知るには(悪いクエリが実行された場合、実行計画は取得できますが、実行されません-予想される実行計画が何かを与えるでしょうか?)この問題が実行計画に関連している場合、SQLが本当にくだらない実行計画は良いアイデアだと考えないようにするにはどうすればよいですか? また、これはパラメータースニッフィングの問題ではありません。SSMSで変数をハードコーディングした場合でも、パフォーマンスが低下するため、これは以前見たことがありますが、そうではありません。

2
Denaliシーケンスは、ID列よりもパフォーマンスが高いと想定されるのはなぜですか?
どちらが優れているかに対する彼の答え:ID列または生成された一意のID値?mrdennyのコメント: SQL Denaliが登場すると、IDよりも効率的なシーケンスがサポートされますが、より効率的なものを作成することはできません。 私はちょっと確信が持てません。Oracleのシーケンスを知っているので、挿入のトリガーを作成するか、各挿入をストアドプロシージャの呼び出しにカプセル化するか、アドホック挿入を行うときにシーケンスを適切に使用することを忘れないでください。 シーケンスの利点はそれほど明白ではないと思います。


2
WHERE句は、記述された順に適用されますか?
大きなテーブル(3700万行)を調べるクエリを最適化しようとしていますが、クエリで操作が実行される順序について質問があります。 select 1 from workdays day where day.date_day >= '2014-10-01' and day.date_day <= '2015-09-30' and day.offer_id in ( select offer.offer_day from offer inner join province on offer.id_province = province.id_province inner join center cr on cr.id_cr = province.id_cr where upper(offer.code_status) <> 'A' and province.id_region in ('10' ,'15' ,'21' ,'26' ,'31' , …

5
Postgresqlで1つのテーブルから別のテーブルに何百万行を効率的にコピーするにはどうすればよいですか?
2つのデータベーステーブルがあります。1つには何億ものレコードが含まれています。それを呼び出しましょうhistory。もう1つは毎日計算されるので、すべてのレコードをhistory1つにコピーします。 私がしたことは実行することでした: INSERT INTO history SELECT * FROM daily そして、しばらくの間はうまくいきましたが、レコードの数が増え続けるにつれて徐々に遅くなり始めました。今私はからコピーする必要が約2万レコード持っているdailyとhistory、単一の操作では、それが完全に時間がかかりすぎます。 あるテーブルから別のテーブルにデータをコピーする別のより効率的な方法はありますか?
36 postgresql 

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