データベース管理者

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

5
既存の違反を無視する一意の制約を追加できますか?
現在、列に重複した値があるテーブルがあります。 これらの誤った重複を削除することはできませんが、一意でない値が追加されないようにしたいと思います。 UNIQUE既存のコンプライアンスをチェックしないを作成できますか? 使用してみましNOCHECKたが、失敗しました。 この場合、ライセンス情報を「CompanyName」に関連付けるテーブルがあります 編集:同じ「CompanyName」を持つ複数の行を持つことは悪いデータですが、現時点ではそれらの重複を削除または更新することはできません。1つのアプローチはINSERT、重複に対して失敗するストアドプロシージャをsに使用させることです... SQLが独自に一意性をチェックすることが可能であれば、それが望ましいでしょう。 このデータは会社名で照会されます。少数の既存の重複について、これは複数の行が返されて表示されることを意味します...これは間違っていますが、ユースケースでは許容できます。目標は、将来それを防ぐことです。コメントから、ストアドプロシージャでこのロジックを実行する必要があるようです。

4
あるテーブルを別のテーブルの値に基づいてその場で更新する方法は?
私は次のようにipsの名前の表を持っています: CREATE TABLE `ips` ( `id` int(10) unsigned NOT NULL DEFAULT '0', `begin_ip_num` int(11) unsigned DEFAULT NULL, `end_ip_num` int(11) unsigned DEFAULT NULL, `iso` varchar(3) DEFAULT NULL, `country` varchar(150) DEFAULT NULL ) ENGINE=InnoDB countryid国テーブルからこのテーブルに次のようなフィールドがあると仮定します。 CREATE TABLE `country` ( `countryid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci …
40 mysql  update 

2
MySqlのVARCHARフィールドで可能なINDEX
私は次のようなテーブルを使用して、MySqlデータベースで作業しています。 +--------------+ | table_name | +--------------+ | myField | +--------------+ ...そして、私はこのような多くのクエリを作成する必要があります(リストに5〜10文字列): SELECT myField FROM table_name WHERE myField IN ('something', 'other stuff', 'some other a bit longer'...) 約24.000.000の一意の行があります 1)FULLTEXTまたはにINDEXキーを使用する必要がありますVARCHAR(150)か? 2)文字を150から220または250に増やした場合、大きな違いが生じますか?(それを計算する方法はありますか?) 3)私が言ったように、それらはユニークになるので、myFieldはPRIMARY KEYでなければなりません。すでにVARCHAR INDEX / FULLTEXTであるフィールドにPRIMARY KEYを追加することはまれではありませんか?

3
PostgreSQLにUPSERTを実装する慣用的な方法
UPSERTPostgreSQLのさまざまな実装について読んだことがありますが、これらのソリューションはすべて比較的古く、または比較的エキゾチックです(たとえば、書き込み可能なCTEを使用)。 そして、これらのソリューションが推奨されているため古くなっているのか、それとも(ほとんどすべてがそうである)実稼働での使用に適さない単なるおもちゃの例であるのかをすぐに調べるのは、psqlの専門家ではありません。 PostgreSQLでUPSERTを実装する最もスレッドセーフな方法は何ですか?


5
PostgreSQLのSQLのすべてのビューをリストする方法は?
PostgreSQLでSQLコマンドを使用してデータベースのすべてのビューを一覧表示するにはどうすればよいですか? psql \dvコマンドの出力に似たものが欲しいのですが、ビュー名のリストだけが望ましいです。例えば、 SELECT ...; my_view_1 my_view_2 my_view_3 Ubuntu LinuxでPostgreSQL v9.1.4を実行しています。

2
ユーザー、ロール、権利を持つデータベースモデル
ユーザーテーブルとロールテーブルを持つデータベースモデルがあります。最大10の異なる要素へのアクセス(権利)を制御したい。アクセスは、ロールまたは単一のユーザーに付与できます。以下は、ユーザー、ロール、およびアイテムのテーブル定義です。 CREATE TABLE users ( id serial NOT NULL PRIMARY KEY, username character varying UNIQUE, password character varying, first_name character varying, last_name character varying, ... ); CREATE TABLE roles ( id serial NOT NULL PRIMARY KEY, name character varying NOT NULL, description character varying, ... ); CREATE TABLE element_1 ( …

1
同じデータベースの.bakファイルと比較して、.bacpacファイルが非常に小さいのはなぜですか?
私は他のサーバーにインポートするために私のSQL Serverの2014 Expressデータベースのバックアップを行うとの間で、ファイルサイズの違いに気づいてきた.bacpacとします.bak。 同じデータベースのファイル.bacpacと比較して、.bakファイルが非常に小さいのはなぜですか? 洞察力をありがとう!

6
トップ1を追加するとパフォーマンスが劇的に低下するのはなぜですか?
私はかなり単純なクエリを持っています SELECT TOP 1 dc.DOCUMENT_ID, dc.COPIES, dc.REQUESTOR, dc.D_ID, cj.FILE_NUMBER FROM DOCUMENT_QUEUE dc JOIN CORRESPONDENCE_JOURNAL cj ON dc.DOCUMENT_ID = cj.DOCUMENT_ID WHERE dc.QUEUE_DATE <= GETDATE() AND dc.PRINT_LOCATION = 2 ORDER BY cj.FILE_NUMBER それは私に恐ろしいパフォーマンスを与えています(それが終わるのを待つことを決して気にしないような)クエリプランは次のようになります。 しかし、削除するTOP 1と、次のような計画が得られ、1〜2秒で実行されます。 以下のPKとインデックスの修正。 TOP 1クエリプランが変更されたからといって驚くことはありませんが、それによって事態がさら​​に悪化していることに少し驚いています。 注:この投稿の結果を読んで、a Row Goalなどの概念を理解しています。私が興味を持っているのは、より良いプランを使用するようにクエリを変更する方法です。現在、データを一時テーブルにダンプしてから、最初の行を取り出しています。より良い方法があるかどうか疑問に思っています。 編集事実の後にこれを読んでいる人々のために、ここにいくつかの追加情報があります。 Document_Queue-PK / CIはD_IDであり、〜5k行があります。 Correspondence_Journal-PK / CIはFILE_NUMBER、CORRESPONDENCE_IDで、行数は約140万です。 私が始めたとき、他のインデックスはありませんでした。私はCorrespondence_Journal(Document_Id、File_Number)で1つになりました

3
SQL Serverの「合計サーバーメモリ」の消費量は数か月間停滞しており、64GB以上が利用可能
SQL Server 2016 Standard Edition 64ビットが、割り当てられた合計メモリの正確に半分(128GBの64GB)で完全に制限されているように見えるという奇妙な問題に遭遇しました。 出力@@VERSIONは次のとおりです。 Microsoft SQL Server 2016(SP1-CU7-GDR)(KB4057119)-13.0.4466.4(X64)2017年12月22日11:25:00 Copyright(c)Microsoft Corporation Standard Edition(64ビット)on Windows Server 2012 R2 Datacenter 6.3(ビルド9600:)(ハイパーバイザー) 出力sys.dm_os_process_memoryは次のとおりです。 クエリを実行するsys.dm_os_performance_countersと、Target Server Memory (KB)がで131072000ありTotal Server Memory (KB)、その半分以下にあることがわかります65308016。ほとんどのシナリオでは、SQL Serverがそれ自体のメモリをさらに割り当てる必要があると判断していないため、これは正常な動作であると理解しています。 ただし、2か月以上にわたって〜64GBで「スタック」しています。この期間中に、一部のデータベースでかなりの量のメモリを消費する操作を実行し、さらに40個近くのデータベースをインスタンスに追加しました。合計292個のデータベースがあり、それぞれに4GBの256 MBの自動成長率の事前割り当て済みデータファイルと、128MBの自動成長率の2GBのログファイルがあります。毎晩12:00 AMにフルバックアップを実行し、月曜日から金曜日の午前6時から午後8時まで、15分間隔でトランザクションログのバックアップを開始します。これらのデータベースは、全体的なスループットが比較的低いですが、SQL Serverが高速化されていないため、何かがおかしいのではないかと疑っています。Target Server Memory 当然、新しいデータベースの追加、通常のクエリの実行、および実行されたメモリ集約型のETLパイプラインを通じて。 SQL Serverインスタンス自体は、12 CPU、144GBのメモリ(SQL Serverに128GB、Windows用に16GBを予約)、および15K SASドライブを備えたvSANの上にある合計4つの仮想ディスクを備えた仮想化(VMware)Windows Server 2012R2サーバーの上にあります。Windowsは、32GBのページファイルがある64GB C:ディスクに自然に配置されます。データファイルは2TBのD:ディスクに、ログファイルは2TBのL:ディスクの上に、tempdbは256GBのT:ディスクに置かれ、8x16GBのファイルは自動拡張されません。 サーバーで実行されているSQL Serverの他のインスタンスが以外にないことを確認しましたMSSQLSERVER。 このサーバーは完全にSQL Serverインスタンス専用であるため、メモリを消費する可能性のある他のアプリケーションやサービスは実行されていません。 分析にはRedGate …

3
UATサーバーとPRODサーバーの実行計画の違い
UAT(3秒で実行)とPROD(23秒で実行)で同じクエリを実行すると、なぜこんなに大きな違いがあるのか​​を理解したいと思います。 UATとPRODの両方に、正確なデータとインデックスがあります。 クエリ: set statistics io on; set statistics time on; SELECT CONF_NO, 'DE', 'Duplicate Email Address ''' + RTRIM(EMAIL_ADDRESS) + ''' in Maintenance', CONF_TARGET_NO FROM CONF_TARGET ct WHERE CONF_NO = 161 AND LEFT(INTERNET_USER_ID, 6) != 'ICONF-' AND ( ( REGISTRATION_TYPE = 'I' AND (SELECT COUNT(1) FROM PORTFOLIO WHERE EMAIL_ADDRESS …

2
ネストされたループで実行が遅いクエリを最適化する方法(内部結合)
TL; DR この質問は引き続き意見を得るので、ここで要約して、新参者が歴史に苦しむ必要がないようにします。 JOIN table t ON t.member = @value1 OR t.member = @value2 -- this is slow as hell JOIN table t ON t.member = COALESCE(@value1, @value2) -- this is blazing fast -- Note that here if @value1 has a value, @value2 is NULL, and vice versa これはすべての人の問題ではないかもしれませんが、ON句の感度を強調することで、正しい方向を見るのに役立ちます。いずれにせよ、元のテキストは将来の人類学者のためにここにあります: 元のテキスト …

2
Postgres 9.2でwork_memおよびshared_buffersを増やすと、クエリが大幅に遅くなります
16 GBのRAMを搭載した8コアのRHEL 6.3で実行されているPostgreSQL 9.2インスタンスがあります。サーバーはこのデータベース専用です。デフォルトのpostgresql.confはメモリ設定に関してかなり保守的であるため、Postgresがより多くのメモリを使用できるようにすることは良い考えだと思いました。驚いたことに、wiki.postgresql.org / wiki / Tuning_Your_PostgreSQL_Serverのアドバイスに従うと、実際に実行するすべてのクエリが大幅に遅くなりましたが、より複雑なクエリでは明らかに目立ちます。 pgtuneの実行も試してみました。これは、調整されたパラメーターを増やして次の推奨事項を提示しましたが、何も変わりませんでした。RAMサイズの1/4のshared_buffersが推奨されますが、これは他のアドバイス(特にPG wiki)に沿っているようです。 default_statistics_target = 50 maintenance_work_mem = 960MB constraint_exclusion = on checkpoint_completion_target = 0.9 effective_cache_size = 11GB work_mem = 96MB wal_buffers = 8MB checkpoint_segments = 16 shared_buffers = 3840MB max_connections = 80 設定を変更した後(を使用してreindex database)データベース全体のインデックスを再作成しようとしましたが、それも役に立ちませんでした。shared_buffersとwork_memをいじりました。非常に控えめなデフォルト値(128k / 1MB)から徐々に変更すると、パフォーマンスが徐々に低下します。 私は走ったEXPLAIN (ANALYZE,BUFFERS)いくつかのクエリにし、犯人はハッシュが大幅に遅くなりましょうということのようです。理由は明らかではありません。 特定の例を挙げると、次のクエリがあります。デフォルト構成で約2100ミリ秒、バッファーサイズを増やした構成で約3300ミリ秒で実行されます。 select count(*) from …

6
MySQLに.sqlファイルをインポートする方法は?
MySQL Workbenchを使用して.sqlファイルをインポートしようとすると、次のエラーが表示されます。 ERROR 1046 (3D000) at line 28: No database selected 最初に.sqlファイルと同じ名前で呼び出される空のデータベースを作成しましたが、機能しません。また、次を使用してmysqlコマンドクライアントで実行しようとしました。 mysqldump -u root database > file.sql しかし、それは私のSQL構文にエラーがあると言います。さらに、file.sqlを設定する必要があるパスがわかりません。

2
列幅を変更する
列(nvarchar)の幅を増やすと、必然的にテーブルが削除されますか? 言い換えると、アクティブユーザーがいる実稼働環境で幅を変更できますか? サイズが(減少ではなく)増加している場合、これは問題にならないだろうと考えました。
39 sql-server 

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