データベース管理者

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

1
クラスター化インデックスのように本質的に順序付けられたデータ
750万レコードの次の表があります。 CREATE TABLE [dbo].[TestTable]( [Id] [int] IDENTITY(1,1) NOT NULL, [TestCol] [nvarchar](50) NOT NULL, [TestCol2] [nvarchar](50) NOT NULL, [TestCol3] [nvarchar](50) NOT NULL, [Anonymised] [tinyint] NOT NULL, [Date] [datetime] NOT NULL, CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, …

1
組み込み関数を使用してデータベーストリガーの名前を解決するにはどうすればよいですか?
ユーザーデータベースに特定のプロシージャを作成できないようにするために使用するデータベーストリガーがあります。 それはで表示されsys.triggersて、object_idが、私は使用することはできませんobject_idそれを見つけるために関数を。 SELECT OBJECT_ID(t.name, t.type) AS object_id, * FROM sys.triggers AS t; 同様に、私はそれをで見つけることができますsys.dm_exec_trigger_stats。object_name解決することはできませんが、解決object_definitionします。 SELECT OBJECT_NAME(dets.object_id, dets.database_id) AS object_name, OBJECT_DEFINITION(dets.object_id) AS object_definition, * FROM sys.dm_exec_trigger_stats AS dets; データベースレベルのトリガーのオブジェクトIDを受け入れ、その名前を返す関数はありますか?

1
FULL最適化のプランが単純なパラメーター化を示すのはなぜですか?
私はそれが読み取り専用些細な計画はシンプルなパラメータ化することができ、そしてすべてのクエリは、(計画が簡易であっても)ではないことをパラメータ化されたシンプルなことができます。 では、なぜこの計画は完全な最適化と単純なパラメータ化を同時に示しているのでしょうか?

4
Caseステートメントでクエリを終了しますか?
2つの異なるテーブルの2つの日付を比較し、それらが等しい場合、クエリが終了するようにクエリを設定しようとしています。それらが等しくない場合、クエリは続行し、いくつかのものを挿入します。しかし、どうすれば自分のやりたいことができるのかわかりません。 SELECT TOP(1) @dateA=a.someDate FROM a ORDER BY DESC; SELECT TOP(1) @dateB=b.someDate FROM b ORDER BY DESC; CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log; Insert statements; 任意の助けをいただければ幸いです。

1
PostgreSQL-数千の要素の配列での作業
列が整数配列として渡す値の大きなリストに含まれているかどうかに基づいて行を選択しようとしています。 これが私が現在使用しているクエリです: SELECT item_id, other_stuff, ... FROM ( SELECT -- Partitioned row number as we only want N rows per id ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY start_date) AS r, item_id, other_stuff, ... FROM mytable WHERE item_id = ANY ($1) -- Integer array AND end_date > $2 ORDER BY …

1
Microsoftはファイル数と並列処理に関してクエリオプティマイザーを変更しましたか
Microsoftはファイル数と並列処理に関してクエリオプティマイザーを変更しましたか?オプティマイザは、クエリの並列度を決定するためにファイル数を考慮しなくなりましたか?もしそうなら、誰がいつ変更が行われたか知っていますか?そうでない場合、そのトピックについて説明しているMicrosoftのドキュメント(SQL Server 2014または2016の現在のドキュメント)へのリンクを誰かが提供できますか?

2
挿入時のMySqlギャップロックデッドロック
複数のソースから頻繁に挿入すると、テーブルのギャップロックからデッドロックが発生します。これが私のプロセスの概要です。 START TRANSACTION UPDATE vehicle_image SET active = 0 WHERE vehicleID = SOMEID AND active = 1 Loop: INSERT INTO vehicle_image (vehicleID, vehicleImageFilePath, vehicleImageSplashFilePath ,vehicleImageThumbnailFilePath, vehicleImageMiniFilePath, mainVehicleImage, active) VALUES (%s, %s, %s, %s, %s, %s, 1); END TRANSACTION の出力SHOW Create table vehicle_image;は次のとおりです。 CREATE TABLE `vehicle_image` ( `vehicleImageID` int(11) NOT NULL …

3
データベースをバックアップすると、トランザクションログのサイズが小さくなりますか?
SQLデータベースに関する知識を集めようとしていますが、トランザクションログファイル(LDF)について質問があります。 まず、データベースを作成するときに、データベースとログファイルの両方の初期ファイルサイズを定義する必要があります。私が見ることができることから、ディスク上にファイルが作成されると、データベースに実際のデータがあるかどうか、またはトランザクション(ログ)があるかどうかに関係なく、指定されたサイズになります。 私の理解は、データベースをバックアップすることでした: トランザクションログを切り捨てます。 サイズを縮小します 内部のログを「空にする」ことによる、ディスク上のLDFファイルの削除。 ログファイルのサイズが固定されているように見えるため、これを正しく理解していないようです。私の実際の質問は次のようになります: ログの切り捨ては実際にログファイル(LDF)に対して何をしますか?このプロセスは、ディスクがいっぱいになるのを防ぐためのものです。 一部の概念を正しく理解していない場合は、修正してください。 ありがとうございました!


1
FROM句でSet Returning Function(SRF)の実行が遅くなるのはなぜですか?
これはデータベース内部の質問です。私はPostgreSQL 9.5を使用FROMしています。たとえば、これらのコマンドを実行するときのように、句の中でSet Returning Functions(SRF)(テーブル値関数(TVF)とも呼ばれます)の実行速度が低下するのはなぜですか。 CREATE TABLE foo AS SELECT * FROM generate_series(1,1e7); SELECT 10000000 Time: 5573.574 ms それはだ常に、より実質的に遅いです CREATE TABLE foo AS SELECT generate_series(1,1e7); SELECT 10000000 Time: 4622.567 ms ここで作成できる一般的なルールはありますか?たとえば、節の外で常に Set-Returning関数を実行する必要がありFROMますか?

2
SSMSテンポラルテーブルにない上位N行を選択
データベース内でテンポラルテーブルを使用していますが、Management Studio 2017(v17.4 14.0.17213.0)でテーブルを右クリックすると、コンテキストメニューに[上位1000行を選択 ]が表示されません(非テンポラルテーブルには問題はありません) ) このコンテキストメニューを元に戻す方法はありますか?私が実行しているSQL Serverのバージョン(SQL 13.1.4001.0 Express Edition)に関係していると感じています

4
クエリの複数の列で同じテーブル値関数を呼び出す最も効率的な方法
同じテーブル値関数(TVF)が20列で呼び出されるクエリを調整しようとしています。 最初に行ったのは、スカラー関数をインラインテーブル値関数に変換することでした。 CROSS APPLYクエリの複数の列で同じ関数を実行するために最高のパフォーマンスを発揮する方法を使用していますか? 単純な例: SELECT Col1 = A.val ,Col2 = B.val ,Col3 = C.val --do the same for other 17 columns ,Col21 ,Col22 ,Col23 FROM t CROSS APPLY dbo.function1(Col1) A CROSS APPLY dbo.function1(Col2) B CROSS APPLY dbo.function1(Col3) C --do the same for other 17 columns より良い代替案はありますか? X個の列に対して複数のクエリで同じ関数を呼び出すことができます。 これが関数です: CREATE …

3
SQL Serverエラー、「FETCHステートメントでのオプションFIRSTの使用法が無効です。」
2012年以降、SQL Serverのドキュメントは、OFFSET..FETCH私がの代わりに使用しようとしているものをサポートしていることを示していLIMITます。 以下はPostgreSQLで正常に動作し、結果セットをサンプリングします。 SELECT * FROM ( VALUES (1),(2),(3) ) AS t(x) OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY; しかし、SQL Serverでは、 Msg 153, Level 15, State 2, Line 4 Invalid usage of the option FIRST in the FETCH statement. 何が起きてる?SQL Serverは標準化されたOFFSET..をサポートしていますFETCHか?

2
SQL Server 2016 Enterpriseのパフォーマンスが低い
長くなって申し訳ありませんが、分析に役立つように、できるだけ多くの情報を提供したいと思います。 同様の問題のある投稿がいくつかあることは知っていますが、これらのさまざまな投稿やWebで入手可能なその他の情報を既にフォローしていますが、問題は解決しません。 SQL Serverのパフォーマンスに深刻な問題があり、ユーザーを狂わせています。この問題は数年間続き、2016年末までは別のエンティティによって管理され、2017年以降は私が管理するようになりました。 2017年の半ばに、Microsoft SQL Server 2012パフォーマンスダッシュボードレポートに示されているインデックス付けのヒントに従って問題を解決することができました。効果はすぐに現れ、魔法のように聞こえました。最後の数日はほとんど常に100%だったプロセッサーが非常に穏やかになり、ユーザーのフィードバックが鳴り響きました。通常、特定のリストを取得するのに20分かかり、最終的に数秒で完了できるため、ERP技術者でさえ喜んでいました。 しかし、時間の経過とともに、それは徐々に悪化し始めました。インデックスが多すぎるとパフォーマンスが低下するのではないかと心配して、インデックスの作成を避けました。しかし、ある時点で、不要なものを削除して、Performance Dashboardが提案する新しいものを作成する必要がありました。しかし、影響はありません。 ERPでの保存とコンサルティングの際に感じられる遅さは本質的にです。 次の構成のSQL Server 2016 Enterprise(64ビット)専用のWindows Server 2012 R2があります。 CPU:Intel Xeon CPU E5-2650 v3 @ 2.30GHz メモリ:84 GB ストレージに関して、サーバーにはオペレーティングシステム専用のボリューム、データ専用のログ、およびログ専用のボリュームがあります。 17データベース ユーザー: 最大のDBでは、ほぼ113人のユーザーが同時に接続されています 他には約9人のユーザーがいます それらの2つで3 + 3 残りのユーザーはそれぞれ1人だけです 大規模なデータベース用にも作成するWebがありますが、使用頻度ははるかに低く、約20人のユーザーがいるはずです。 DBのサイズ: 最大のデータベースは290 GBです。 2番目に大きいものは100 GB 3番目に大きいものは20 GB 4番目の14 GB 残りはそれぞれ3 GBを少し超えています これは本番環境のインスタンスですが、ほとんどの場合私がそこに接続しているだけなので、この目的のために無視できると思われる開発のインスタンスもありますが、この問題は、接続していない場合でも常に発生します。 プロセッサはほとんどの場合、次のようになります。 …

1
Xpathのみを使用してSQLサーバーの空のXMLタグからnullを返す方法は?
レコードに関するさまざまなユーザー定義データポイントをXML列に格納するアプリケーションがあります。これらがどのように保存または更新されるかは、私には制御できません。 列をクエリすると、3つの値のいずれかが返されます。 値 ヌル 空の文字列 $ 64質問 xpathを使用して、空の文字列をnullとして返したいのですが。 nullを空の文字列として返すことに関する多くの答えを見つけましたが、この方法では何も起こりません。 それらは、誰かが値を削除したときにそのようになり、タグを削除するのではなく、タグにブランクになり<value />ます。nullは、値が設定されていない場合に発生します。xsi:nilは含まれていません。 私はケースステートメントでそれをしました: select so.SalesOrderId, Case when sopc.value('(Value)[1]','smalldatetime') IS null then Null when sopc.value('(Value)[1]','smalldatetime') ='' then Null Else sopc.value('(Value)[1]','smalldatetime') End as sopc From SalesOrders so Outer apply so.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[Name="ProjCompleted"]') sopc(sopc) しかし、これは非効率に感じられ、これが唯一の列ではないため、コードが長くなり、保守が難しくなります。 編集してサンプルデータを含めます SalesOrderId CustomColumns SO 1 "<CustomColumnsCollection> <CustomColumn> <Name>ProjCompleted</Name> <DataType>1</DataType> <Value /> …

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