データベース管理者

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

1
SELECT *が名前ですべての列を(異なる列順序で)選択するよりもずっと速いのはなぜですか?
列a、b、c、d、e、f、g、h、i、j、kがあるテーブルでは、次のようになります。 select * from misty order by a limit 25; Time: 302.068 ms そして: select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25; Time: 1258.451 ms 列ごとの選択をできるだけ速くする方法はありますか? 更新: テーブルにインデックスがなく、新しく作成されたもの これはEXPLAIN ANALYZEで、あまり役に立たないようです: explain analyze select * from misty order by a limit 25; Limit (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1) …

1
最初に1つのインデックスを検索し、次に別のインデックスを検索するようにクエリを最適化する方法
衛星データからの2つの地球測定値セットがあり、それぞれに時間フィールド(平均ユリウス日付のmjd)と地理的位置(GeoPoint、空間)があり、2つのセット間の一致が時間のしきい値に一致するように探しています3時間(または.125日)およびそれらの距離は互いに200 km以内です。 テーブルと空間テーブルの両方のmjdフィールドにインデックスを作成しました。 時間の制約に参加するだけで、データベースは8秒で100,000回の一致を計算し、その時間内のすべての100,000回の一致の距離を計算します。クエリは次のようになります。 select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) ) 実行された計画は次のとおりです。 並べ替えると、9つの距離が200km未満であったため、一致します。問題は、距離制約を追加して代わりにこれを実行すると、 select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on …

2
PIVOTクエリのヘルプ
私は以下の構造を持つテーブルを持っています: CREATE TABLE [dbo].[AUDIT_SCHEMA_VERSION]( [SCHEMA_VER_MAJOR] [int] NOT NULL, [SCHEMA_VER_MINOR] [int] NOT NULL, [SCHEMA_VER_SUB] [int] NOT NULL, [SCHEMA_VER_DATE] [datetime] NOT NULL, [SCHEMA_VER_REMARK] [varchar](250) NULL ); いくつかのサンプルデータ(sqlfiddleに問題があるようです。 INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,7,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored …


2
SQL Server 2014(Windows 2012R2)でのCLRのクラッシュ
列内の文字列に対してRegEX関数を実行するこの小さなCLRがあります。 Windows Server 2012R2上のSQL Server 2014(12.0.2000)で実行すると、プロセスがクラッシュします メッセージ0、レベル11、状態0、行0現在のコマンドで重大なエラーが発生しました。結果があれば、破棄する必要があります。 スタックダンプを提供します select count (*) from table where (CLRREGEX,'Regex') しかし、私がするとき select * from table where (CLRREGEX,'Regex') 行を返します。 Windows 8.1で実行されている同じSQL Serverビルドで完全に動作します。 何か案は? -編集それはできる限り簡単です using System; using System.Collections.Generic; using System.Text; using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean using System.Text.RegularExpressions; //Match, Regex using Microsoft.SqlServer.Server; //SqlFunctionAttribute public partial class UserDefinedFunctions …

2
データベース内のすべてのスキーマで使用を許可しますか?
GRANT USAGE特定のデータベースのユーザー/ロールにしたい。データベースには多くのスキーマがあります。 があることは知っていますがON ALL TABLES IN SCHEMA、「すべてのスキーマ」が必要です。試しましたがGRANT USAGE .. ON DATABASE、それは明らかに間違っています(実際には存在しません)。 これはPostgres 9.3または9.4用で、AWS RDS上にあるサーバーです。

1
統計は最新ですが、推定値が間違っています
するとdbcc show_statistics ('Reports_Documents', PK_Reports_Documents)、レポートID 18698に対して次の結果が得られます。 このクエリの場合: SELECT * FROM Reports_Documents WHERE ReportID = 18698 option (recompile) クラスター化インデックスPK_Reports_Documentsを期待どおりにシークするクエリプランを取得します。 しかし、私を困惑させるのは、推定行数の誤った値です: よると、この: サンプルクエリのWHERE句の値がヒストグラムのRANGE_HI_KEY値と等しい場合、SQL ServerはヒストグラムのEQ_ROWS列を使用して、等しい行の数を決定します これは私が期待する方法でもありますが、実際にはそうではないようです。またRANGE_HI_KEY、提供されたヒストグラムに存在する他のいくつかの値を試してみてshow_statistics、同じことを経験しました。私の場合、この問題により、一部のクエリで非常に最適でない実行プランが使用され、実行時間が数分になるのに対し、クエリヒントで1秒で実行できるように思われます。 全体として:EQ_ROWS推定行数にヒストグラムが使用されていない理由と、誤った推定値はどこから来たのかを誰かが説明できますか? もう少し(おそらく役立つ)情報: 統計の自動作成はオンであり、すべての統計は最新です。 クエリされるテーブルには、約8000万行があります。 PK_Reports_Documentsなる組み合わせPKでありReportID INT、およびDocumentID CHAR(8) クエリは合計5つの異なる統計オブジェクトをロードしているように見えますが、すべてのオブジェクトにReportIDはテーブルの+他の列が含まれています。それらはすべて新しく更新されました。RANGE_HI_KEY以下の表にあるのは、ヒストグラムの上限の列値です。 +-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+ | name | stats_id | auto_created | user_created | Leading column Type | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …

4
5つ以上の列の主キーは、大きなテーブル(1億以上)に適していますか?
私は実際のDBの問題について読んでいましたが、1つのプロジェクトには1億行とテーブルがあり、5列がプライマリでした。私はこれが悪いと思っていますが、誰もが正確にその理由を教えてもらえますか? テーブルは一種のマイクロロールアップ/集計テーブルであったため、5つの列は(day、market_id、product_id ...)のようでした。最初は、5列の主キーは理想的ではないと考えていましたが、考えれば考えるほど、それが悪い理由を考え出すことはできませんでした。 これは深夜の議論で、半数の会社エンジニアが参加しました。誰かがこれは悪い設計だと言った、あるシニアエンジニアは同意したが、誰もその理由について実際に飛び込んだことはなかった。したがって、自分で問題を調査しようとしています!

1
SQL ServerサービスアカウントWindowsの特権と権利
私の質問は、SQL Serverプロセスごとに新しいドメインユーザーアカウントを作成する場合、各アカウントにどのようなアクセス許可を設定する必要があるかということです。または、SQL構成マネージャーが実際にこれを処理し、予期しない問題が発生しましたか? Microsoft SQL Serverをセットアップする必要が頻繁にあり、サービスを実行するアカウントの構成に関するアドバイスを誰かが提供できるかどうか疑問に思いました。IMOは、Microsoftによって漠然と文書化されていますが、彼らはあなたに正しい方向を示していますが、具体的な例を見つけることはできませんでした。 これまで見てきたことを要約すると: 単純な展開\開発環境では、インストーラーが使用する仮想アカウントのデフォルトを使用してもかまいません。 NT SERVICE\MSSQLSERVER SYSTEMアカウントの使用は避けてください。これは安全ではありません。 実稼働環境およびドメイン環境では、管理されたサービスアカウントを使用するか、サービスごとにドメインユーザーアカウント(管理者ではない)を作成することをお勧めします。伝えられるところでは、インストール時にドメインアカウントを使用すると、インストーラーが必要な権限を設定します。 既存のインストールのサービスアカウントを仮想アカウントからドメインアカウントに変更する場合、SQL Server構成マネージャーを使用して新しいサービスアカウントを設定することをお勧めします。これにより、必要な権限が設定されます。 既存のインストールのサービスアカウントをドメインアカウントに変更しようとしましたが、アカウントlog on as serviceアクセス許可を付与するまでログオンに失敗します。これは、SQL Server構成マネージャーが必要なアクセス許可を設定する部分と矛盾します。(GPOがこのローカルセキュリティポリシーの設定に干渉したかどうかはわかりませんが) Microsoftは、SQL Serverセットアップがこのページで付与する権限のリストを提供しています。 しかし、サービスを実行するために作成したユーザーがそれを手動で行う必要があるかどうか、またはSQL構成マネージャーを使用してこれらのアクセス許可を自動的に設定するかどうかは明確ではありません。 SQL Server 2014、ドメインコントローラーはWindows Server 2008 R2上にあります。

2
MongoDB:アプリケーションサーバーでmongosプロセスを共存させる
このドキュメントで説明されているベストプラクティスについて質問したいと思います。 http://info.mongodb.com/rs/mongodb/images/MongoDB-Performance-Best-Practices.pdf 複数のクエリルーターを使用します。複数のサーバーにまたがる複数のmongosプロセスを使用します。一般的な展開は、アプリケーションサーバー上のmongosプロセスを同じ場所に配置することです。これにより、アプリケーションとmongosプロセス間のローカル通信が可能になります。mongosプロセスの適切な数は、アプリケーションと展開の性質によって異なります。 展開についてのほんの少しの背景。多くのアプリケーションサーバーノードがあります。それらはそれぞれ、ステートレスRESTful WSで1つのJVMベースのプロセスを実行します。このベストプラクティスが示唆するように、すべての単一のアプリケーションサーバーノードは独自のmongosプロセスを実行します。つまり、JVMプロセスの数は常にプロセスの数に等しくなりmongosます。 すべてのmongosプロセスは、3つの構成サーバーと複数のmongo断片(各断片内にレプリカセットがある)に接続します。シャード展開を使用している場合でも、実際にはコレクションをシャーディングしていません。実際、作成時にすべてのシャードに分散する多数のデータベースがあります(これが現時点でのシャーディングの主な使用例です)。 ベストプラクティスでは「適切なmongosプロセスの数はアプリケーションとデプロイメントの性質に依存する」ことも示唆しているので、私たちの使用mongosが実際に適切かどうか、または複数の専用mongosノードを用意して、アプリサーバーはmongosローカルで実行せずに接続します。 mongosアプリケーションサーバーのインスタンス数またはMongoDBクラスターのサイズに関連して適切なインスタンスの数を決定するための最適なアプローチについて、あなたはどう思いますか? 最近、ステートレスWebサービスのクラスター管理を検討し始めました。つまり、Docker、Apache Mesos、Kubernetesなどのツールを意味します。Dockerを使用している場合、一般的にコンテナ内で複数のプロセスを実行することは推奨されません。この事実を考慮すると、アプリケーションサーバーコンテナとmongosコンテナを常に同じ物理ノードに配置し、同じ量のプロセスを確保することは非常に困難になります。これは、このベストプラクティスが今説明したクラスターアーキテクチャにまだ当てはまるのかと思います。そうでない場合は、mongosこのアーキテクチャでプロセスを見つけて展開するためのより良い方法を提案してください。

2
「バッファキャッシュヒット率」の9990はどういう意味ですか?
私はブログの投稿からこのクエリを得ました: SELECT object_name, counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Buffer Manager%' AND [counter_name] = 'Buffer cache hit ratio' 投稿は、キャッシュへのヒットの割合を与えると述べた。0〜100の値になることを示しているようです(87の結果を示しました)。 しかし、それを実行すると、非常に高い数値が得られます。以下に例を示します。 object_name counter_name cntr_value SQLServer:Buffer Manager Buffer cache hit ratio 9990 これは99.90%を意味しますか? そうでない場合、それはどういう意味ですか?そして、どうすれば本当の価値を得ることができますか? 注:257から352363までの値を取得しました 関連する場合は、他のサーバー統計をいくつか示します。 ページの平均寿命:145 ページ読み取り/秒:1,380,009,009

5
すべての行を更新
単一の列の非常に大きなOracleテーブルのすべての行を更新する最も効率的な方法を知りたいです。例えば: update mytable set mycolumn=null; または: update mytable set mycolumn=42; 私の知識は非常に古いかもしれません。テーブルを変更して列を削除します。次に、テーブルを変更して、使用する新しい値のデフォルト値を持つ列を追加します。次に、テーブルを変更して、列のデフォルト値を削除します。これは更新を実行するよりもはるかに高速であることがわかりましたが、より良い方法があると感じています。
12 oracle  update 

1
CONVERT()のこの問題の原因は何ですか?
次の2つのステートメントを検討してください。 PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0); PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0); 両方のステートメントが戻り-1ます。2番目のバイナリ値は最初の値よりも10進数65,536大きいため、これは間違っていませんか? 確かに、これは無言の切り捨てによるものではないでしょうか? 次のステートメントを実行した場合: PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0); PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0); 次のエラーが表示されます。 Msg 8114, Level 16, State 5, Line 1 Error converting data type varbinary to numeric. ここで何が起こっているかを診断するにはどうすればよいですか? これをSQL Server 2012 v11.0.5058で実行しています。結果は、SQL Server 2008 R2 SP2、SQL Server …


4
全文検索の結果、「FULLTEXT初期化」に費やされる時間が長くなります
現在、Stack Overflowのコメントのデータダンプに対していくつかのクエリを実行しようとしています。スキーマは次のようになります。 CREATE TABLE `socomments` ( `Id` int(11) NOT NULL, `PostId` int(11) NOT NULL, `Score` int(11) DEFAULT NULL, `Text` varchar(600) NOT NULL, `CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `UserId` int(11) NOT NULL, PRIMARY KEY (`Id`), KEY `idx_socomments_PostId` (`PostId`), KEY `CreationDate` (`CreationDate`), FULLTEXT KEY `Text` (`Text`) ) ENGINE=InnoDB …

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