データベース管理者

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

4
Mac OS Xで実行されているMySQLサーバーにリモートアクセスできません
Mac OS X Maverickを実行する仕事用コンピューターでMySQLサーバーを実行しています。Mac OS Maverickがインストールされている自宅のコンピューターからアクセスしたい。 端末から、1つのタブで作業用コンピューターにsshし、sshセッションをアイドル状態にせずにそのままにしておくと、別のタブでMySQLサーバーにアクセスできます。 ただし、sshセッションが実行されていないと、次のエラーが発生します エラー2003(HY000): 'SERVER_IP_ADDRESS'(60)のMySQLサーバーに接続できません my.cnfbind-addressをコメント化するか、割り当ててサーバー上のファイルを変更しようとしました0.0.0.0が、機能しません。 なぜそうなのですか?クライアントでsshを実行せずにリモートアクセスを許可するようにサーバーを構成するにはどうすればよいですか?誰か助けてくれますか?

1
統計でヒストグラムのステップ数はどのように決定されますか
SQL Serverの統計でヒストグラムのステップ数はどのように決定されますか? キー列に200以上の異なる値があるにもかかわらず、なぜ200ステップに制限されているのですか?決め手はありますか? デモ スキーマ定義 CREATE TABLE histogram_step ( id INT IDENTITY(1, 1), name VARCHAR(50), CONSTRAINT pk_histogram_step PRIMARY KEY (id) ) テーブルに100レコードを挿入する INSERT INTO histogram_step (name) SELECT TOP 100 name FROM sys.syscolumns 統計の更新と確認 UPDATE STATISTICS histogram_step WITH fullscan DBCC show_statistics('histogram_step', pk_histogram_step) ヒストグラムの手順: +--------------+------------+---------+---------------------+----------------+ | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …

4
外部キー制約を含む列を既存のテーブルに追加する方法は?
次の表があります。 CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); messagesテーブルをどのように変更しますか? という新しい列senderが追加されます テーブルをsender参照する外部キーはどこusersですか これはうまくいきませんでした # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist このステートメントは列も作成しませんか?

3
スキーマの移行:SQL ServerデータツールとLiquibaseおよびFlyway
これは馬鹿げた質問のように思えるかもしれませんが、私はスキーマ移行のためのオープンソースソリューション、つまりLiquibaseとFlywayを検討してきました。 ただし、上司から、SQL Serverデータツール(SSDT)でも同じことができると言われました。同意するかどうかはわかりませんが、インターネット上でLiquibaseやFlywayと直接比較するものはほとんどありません。 SSDTはSQL Serverの開発、データモデリング、および設計ツールであり、スキーマ比較(およびそのスクリプトの生成)とソース管理もサポートしていると私は考えています。スキーマ移行のいくつかの側面でLiquibase / Flywayと一部重複する可能性がありますが、別の問題に取り組みます。しかし、全体的なスキーマ移行ツールとして、LiquibaseとFlywayは完全に専用のツールですが、SSDTはデータベースの設計と開発に適しています。 比較がないと言うだけでSSDD自体はスキーマ移行ツールではないとしても、どんな意見でも大歓迎です。
11 schema  ssdt  migration 

2
2,500万行以上のクエリの最適化
私はMS SQLを使用しており、同じテーブルに対して異なる基準でいくつかのクエリを実行する必要があります。最初は元のテーブルで各クエリを実行しましたが、それらはすべて何らかのフィルタリング(つまり、日付、ステータス)を共有しています。これには長い時間がかかりました(約2分)。 データ行に重複があり、すべてのインデックスがクラスタリングされていません。私の基準では4列のみに関心があり、結果はすべてのクエリについてカウントのみを出力するはずです。 :列は、必要に応じてTABLE、FIELD、AFTER、DATE、とのそれぞれにインデックスがあるDATEとはTABLE。 必要なフィールドのみを含む一時テーブルを作成した後、1:40分になりましたが、それでも非常に悪いです。 CREATE TABLE #TEMP ( TABLE VARCHAR(30) NULL, FIELD VARCHAR(30) NULL, AFTER VARCHAR(1000) NULL, DATE DATETIME, SORT_ID INT IDENTITY(1,1) ) CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID) INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE) SELECT TABLE, FIELD, AFTER, DATE FROM mytbl WITH (NOLOCK) WHERE TABLE = 'OTB' …

1
CTEがインラインサブクエリよりもはるかに悪いのはなぜですか
クエリプランナーがpostgresqlでどのように機能するかをよりよく理解しようとしています。 私はこのクエリを持っています: select id from users where id <> 2 and gender = (select gender from users where id = 2) order by latest_location::geometry <-> (select latest_location from users where id = 2) ASC limit 50 私のデータベースでは10ms未満で実行され、usersテーブルには約500kのエントリがあります。 次に、副選択の重複を避けるために、次のようにクエリをCTEとして書き直すことができると考えました。 with me as ( select * from users where id = 2 …

1
MongoDBで長時間実行されている操作を(安全に)強制終了するにはどうすればよいですか?
MongoDBで操作が制御不能になり、最終的に数百秒間実行され、強制終了または完了するまでパフォーマンスに影響を与える場合があります。 それが発生したとき、私はkillOp()利用できることを知っていますが、(たとえば)レプリケーションに関係する長時間実行オペレーション(危険な場合があります)を強制終了せずに、対象となる長時間実行オペレーションのみを強制終了するにはどうすればよいですか?

2
空のテーブルを削除する方法
私の巨大なデータベース(mysql)からすべての空のテーブルを削除することは可能ですか? 空のテーブルをすべて自動的に削除するsqlコマンドを探しています。 現在、データセットには305のテーブルがあり、そのうちの約30%は古い空のテーブルであり、新しいアプリケーションでは使用されません。 明確にするために; すべてのテーブルはtype = MyISAMです。
11 mysql  myisam 

3
日付を整数(数値)として格納することの利点
質問1 日付が整数(実際の数値(8,0))として格納されているシステムを使用していますが、他のシステムもこのスレッドにciscoなどのintとして日付を格納していることに気付きました。例 20120101 -- 01 Jan 2012 数値日付システムを維持し、SQL日時を使用しないことの利点はありますか? 質問2 現在、2つの日付の間の顧客を見つけるために、数値の日付をループ処理しています。startおよびenddateが2か月にわたる場合、60だけではなく数千のレコードを取得します。例: create table #temp1(day int,capacity int) /* just a temp table */ declare @start int declare @end int set @start=20111201 set @end = 20120131 while (@start <= @end) Begin insert into #temp1 /* I am storing things in #temp table so …

5
スキーマの変更後に壊れたストアドプロシージャを検出するにはどうすればよいですか?
データベースの中央のテーブルを変更しました。sp_dependsは文字通り数百の結果を返します。変更後、これらのストアドプロシージャの一部がコンパイルされないのではないかと心配しています。 1つのストアドプロシージャを確認するのは簡単です(変更スクリプトを再実行して、操作が成功するかどうかを確認するだけです)が、100以上のプロシージャでそれを行うのは少し面倒です。 このようなスクリプトを使用してデータベースのすべてのオブジェクトを再コンパイルできることはわかっていますが、実際の操作は、ストアドプロシージャが次に実行されたときにすぐにではなく、実行されるため、私の場合は適切ではないようです。 また、すべてのストアドプロシージャを完全に削除し、データベースをソース管理システムで再同期できると考えていましたが、このオプションは実行可能ではありますが、あまりエレガントではありません。これを行うより良い方法はありますか? SQLServer 2008 R2を使用していますが、データベーススクリプトはVS 2008データベースプロジェクトに保存されています。 明確にするために、私はコードをテストするためにこのアプローチだけに頼るべきだと主張しているのではありません。C#とまったく同じように、コードを作成するときに他の依存ファイルの構文エラーを瞬時に検出します(その後、通常は数桁遅いユニットテストなどの他の戦略を使用してテストします)、SQLの依存関係を検出することは理にかなっていると思います通常は完了するまでに数時間かかる完全な機能テストを実行する必要がなく、数秒でエラーが発生します。

2
SSMSがサーバーのファイルシステムを参照できないようにする
私の管理下でMS SQLサーバー2017を共有するユーザーが何人かいます。彼らは、そのサーバー上の他のユーザーとそのデータを見てはいけません(または気づいてさえいません)。各ユーザーは自分のデータベースを持っています。彼らは自分のデータベースで好きなことをすることができます。 SQL ServerのPartial Containment機能を使用して、ユーザーを適切にロックしています。ログインはデータベース内に作成されます。この方法では他のユーザーアカウントやデータベースが表示されないため、これはうまく機能します。DBログインは、このコマンドで作成したデータベースロールに追加されます。 USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole 私は新たにdbログインアカウントを作成し、それを上記の役割にのみ追加します。ユーザーには他の権限はありません(私が知っていることです)。 残っている唯一の問題は、SSMSがサーバーのファイルシステムを参照できることです。データベースを右クリックしてを選択した場合は、ファイルをTasks -> Restore -> Database選択Device: -> [...]して追加します。これにより、SSMSがサーバーのファイルシステムを参照できるようになります。これを拒否します。ユーザーは実際にDBを復元することはできませんが、ファイルシステムを参照することはできます。 ここでこの質問は SSMSは、ストアドプロシージャを使用していることを示唆しているxp_fixeddrives、xp_dirtreeとxp_fileexist。ただし、これらのストアドプロシージャは、そのグループの権限を持つユーザーとして実行されると、空の結果を返します。これは、ユーザーがsysadminロールのメンバーでない場合の動作であると読みました。私は明示的にEXECUTEをdbroleに対して拒否しているため、すでに少し混乱していますが、ユーザーは引き続きストアドプロシージャを実行できます。しかし、それでも、SSMSを介してファイルシステムを参照すると、空ではありません。 SSMSはどこからファイルシステム情報を取得し、どのようにしてこれを防ぐことができますか? 編集:私はまた、SSMSがすべてのデータベースのサーバーに存在するすべてのDBバックアップのリストを取得できることにも気づきました。繰り返しますが、どのようにしてこの情報を取得し、どのようにしてそれを防ぐことができるかは知りません。

1
グローバルレベルの一時テーブルでは論理読み取り、セッションレベルの一時テーブルでは読み取り不可
次の単純なMCVEについて考えてみます。 SET STATISTICS IO, TIME OFF; USE tempdb; IF OBJECT_ID(N'tempdb..#t1', N'U') IS NOT NULL DROP TABLE #t1; CREATE TABLE #t1 ( r int NOT NULL ); IF OBJECT_ID(N'tempdb..##t1', N'U') IS NOT NULL DROP TABLE ##t1; CREATE TABLE ##t1 ( r int NOT NULL ); IF OBJECT_ID(N'dbo.s1', N'U') IS NOT NULL …

2
PostgreSQL:不変、揮発性、安定
IMMUTABLE関数、VOLATILE関数、STABLE関数の定義の本当の意味は不明です。 私はドキュメント、特にそれぞれの定義を読みました。 IMMUTABLEは、関数がデータベースを変更できないことを示し 、同じ引数値が指定された場合は常に同じ結果を返します。つまり、データベースの検索や、引数リストに直接存在しない情報の使用は行いません。このオプションを指定すると、引数がすべて定数の関数の呼び出しはすべて、関数の値ですぐに置き換えることができます。 STABLEは、関数がデータベースを変更できず、単一のテーブルスキャン内で同じ引数値に対して常に同じ結果を返すが、その結果はSQLステートメント間で変わる可能性があることを示します。これは、データベースルックアップ、パラメーター変数(現在のタイムゾーンなど)などに依存する結果を持つ関数の適切な選択です(現在のコマンドによって変更された行をクエリするAFTERトリガーには不適切です)。 current_timestamp関数ファミリーは、トランザクション内で値が変化しないため、安定と見なされます。 VOLATILEは、関数の値が単一のテーブルスキャン内でも変更される可能性があるため、最適化を実行できないことを示します。この意味で揮発性であるデータベース関数は比較的少数です。いくつかの例は、random()、currval()、timeofday()です。ただし、副作用がある関数は、その結果がかなり予測可能であっても、呼び出しが最適化されないように、揮発性に分類する必要があることに注意してください。例はsetval()です。 私の混乱は不変の条件と機能が安定したとしていますALWAYSまたは一貫して同じ引数与えられた同じ結果を返します。 IMMUTABLE定義は、関数がデータベース検索を行わないか、引数リストに直接存在しない情報を使用しないことを示しています。つまり、私にとっては、そのような関数はクライアントから提供されたデータを操作するために使用され、SELECTステートメントを含むべきではないということです... STABLEの場合、定義は同じですが、常に同じ結果を返す必要があると述べています。つまり、私にとっては、関数が同じ引数で呼び出されるたびに、同じ結果を返す必要があります(まったく同じ行、毎回)。 したがって、私にとって...つまり、更新可能な1つまたは複数のテーブルに対してSELECTを実行する関数は、揮発性でなければならないということです。 しかし、再び...それは私には正しく聞こえません。 これを私のユースケースに戻すと、常に追加されているテーブルで複数のJOINを使用してSELECTステートメントを実行する関数を書いているので、同じ引数を使用しても、関数呼び出しは呼び出されるたびに異なる結果を返すことが期待されます。 それで、それは私の機能が揮発性であるべきであることを意味しますか?ドキュメントは、この意味で揮発性であるデータベース関数が比較的少ないことを示していますが? ありがとうございました!

1
postgres-ロールなしのpg_dumpおよびpg_restore
受信データベースで適切な役割を持たずにダンプを復元しようとしています。 ここだけでなくここでも述べた--no-ownerように、オプションとして、pg_dumpまたはpg_restoreその両方が必要です。 次のコマンドラインを使用してダンプを作成しました "C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" --no-owner -Ft --dbname=postgresql://avo******:AV0******?@127.0.0.1:5432/BI_DB > K:\BI\backup\sort\bck_%timestamp%.tar 復元線は以下の通り "C:\Program Files\PostgreSQL\9.3\bin\pg_restore.exe" --host localhost --port 5432 --username "postgres" --dbname "BI_TEST2" --no-password --no-owner --role=postgres --exit-on-error --verbose "D:\D\avo\backup\bck_04042017_1410.tar" ご覧のとおり、どちらにも--no-ownerオプションがありますが、最終的には以下のエラーが発生します 私をひどくバグにするのは以下のログです pg_restore: [programme d'archivage (db)] Erreur pendant le traitement de la TOC (« PROCESSING TOC ») : pg_restore: [programme d'archivage (db)] Erreur …

1
結合とウィンドウ関数を使用してリード値とラグ値を取得するパフォーマンスの比較
私は20Mの行のテーブルを有し、各行は3つの列を有している:time、id、およびvalue。それぞれについてidとtime、そこにあるvalue状態のため。time特定の特定の特定のリードとラグの値を知りたいid。 これを達成するために2つの方法を使用しました。1つの方法は結合を使用し、もう1つの方法は、クラスター化インデックスがオンtimeおよびのウィンドウ関数lead / lagを使用することidです。 これら2つの方法のパフォーマンスを実行時間で比較しました。結合メソッドは16.3秒かかり、ウィンドウ関数メソッドは20秒かかります(インデックスの作成時間は含まれません)。結合メソッドがブルートフォースであるときにウィンドウ関数が進んでいるように見えるので、これは私を驚かせました。 2つのメソッドのコードは次のとおりです。 インデックスを作成 create clustered index id_time on tab1 (id,time) 結合方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id …

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