データベース管理者

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

2
パラメータ付きのこの再帰的CTEがリテラルで行うとき、なぜインデックスを使用しないのですか?
ツリー構造で再帰CTEを使用して、ツリー内の特定のノードのすべての子孫をリストしています。WHERE句にリテラルノード値を書き込むと、SQL Serverは実際にその値にのみCTEを適用し、実際の行数が少ないクエリプランなどを提供します。 ただし、値をパラメーターとして渡すと、CTEが実現(スプール)され、事実の後でフィルター処理されるようです。 私は計画を間違って読んでいた可能性があります。パフォーマンスの問題には気づきませんでしたが、CTEの実現により、特にビジーなシステムでは、より大きなデータセットで問題が発生する可能性があると心配しています。また、私は通常、このトラバーサルをそれ自体で複合します。祖先までトラバースし、子孫まで戻ります(すべての関連ノードを確実に収集するため)。私のデータが原因で、「関連」ノードの各セットはかなり小さいため、CTEの実現は意味がありません。また、SQL ServerがCTEを実現しているように見える場合、その「実際の」数には非常に多くの数値が含まれています。 クエリのパラメーター化されたバージョンをリテラルバージョンのように機能させる方法はありますか?CTEを再利用可能なビューにしたいと考えています。 リテラルを使用したクエリ: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

1
where句で 'contains'と '='を一緒に使用するとクエリが遅くなる
次のクエリは、12kレコードのテーブルで完了するまでに約10秒かかります select top (5) * from "Physician" where "id" = 1 or contains("lastName", '"a*"') しかし、where句を次のいずれかに変更した場合 where "id" = 1 または where contains("lastName", '"a*"') すぐに戻ります。 両方の列にインデックスが付けられ、lastName列にもフルテキストインデックスが付けられます。 CREATE TABLE Physician ( id int identity NOT NULL, firstName nvarchar(100) NOT NULL, lastName nvarchar(100) NOT NULL ); ALTER TABLE Physician ADD CONSTRAINT Physician_PK PRIMARY …

1
DBCC CheckDBの後にパフォーマンスモニターのデータベースキャッシュメモリが大幅に低下する
私たちはいくつかSQLServer: Memory Managerの指標を監視しており、DBCC CheckDB仕事の後、指標が Database Cache Memory (KB) 大幅に低下します。正確には、キャッシュされた140 GBのDBメモリから60 GBに減少しました。その後、週の間にゆっくりと再び増加します。(「Free Memory KB」の量は、直後に20 GBから100 GBになりましたCheckDB) DBCC CheckDB は毎週日曜日に実行されるため、データベースキャッシュメモリは毎週再び増加する必要があります What is the behavior of this ? Why CheckDB pushes database pages out of memory ? 2番目の質問は、「buffer cache hit ratio」がDBCC CheckDB完了後に変更されなかった理由です。 データベースのデータをストレージからRAMに再度読み込む必要があるため、平均して99.99%で、DBCC CheckDBジョブ終了後は約98.00%に低下し、99%にかなり速くbuffer cache hit ratio戻ります。

3
DBテーブルでのSPIDの使用(テーブル変数の代わり)
予約に使用されるトランザクションデータベース... 私たちのベンダーは、#temptablesを@tablevariablesに置き換えるように依頼されました(コンパイルロックが重いため)。代わりに、SPIDを列として追加する実際のテーブルに置き換えて、ストアドプロシージャが適切な行でのみ機能するようにしました。 この操作方法にリスクはありますか?すべてのトランザクションが独自のトランザクション内に分離される前に...このテーブルを大量にロックしてしまうのではないかと心配しましたが、SQLは行レベルのロックを使用しているため、これ以上のロックは作成されないというのが彼らの意見です。 SQL Serverバージョン:2016 Enterprise-13.0.5216.0 CREATE TABLE dbo.qryTransactions ( ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED, spid int NOT NULL, OrderID int, ItemID int, TimeTransactionStart datetime, TimeTransactionEnd datetime, ...other fields ) CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)

3
XMLクエリの質問
次のSQL XMLから "DATE"値を取得するSQLクエリを生成しようとしています。 私はこのようなことを試しましたが、概念を理解しているとは思いません。 select xConfig.value('(/SearchjobConfig/QueryString/SearchCriteria/ExpressionSet/SimpleAttributeExpression) [1]','nvarchar(max)') from Job テキストとしてのXMLは次のとおりです。 <SearchJobConfig> <QueryID>1072</QueryID> <QueryString> <SearchCriteria name="Search query" > <ExpressionSet logicalOperator="AND"> <SimpleAttributeExpression displayName="Date" npmPropertyId="4" searchOperation="GREATER_EQUAL" dataType="string" caseSensitive="false">2019-06-01T04:00:00</SimpleAttributeExpression> <SimpleAttributeExpression displayName="Date" npmPropertyId="4" searchOperation="LESS_EQUAL" dataType="string" caseSensitive="false">2019-06-13T03:59:59</SimpleAttributeExpression> <SimpleAttributeExpression displayName="Class" npmPropertyId="1056" searchOperation="EQUALS" dataType="int32" caseSensitive="false">65</SimpleAttributeExpression> </ExpressionSet> </SearchCriteria> </QueryString> </SearchJobConfig> 予想される出力は日付になります: 2019-06-01T04:00:00 2019-06-13T03:59:59 そして、同じ行で結果を得るには何が必要でしょうか。例: date_val_start date_val_end 2019-06-01T04:00:00 2019-06-13T03:59:59 SQL …

2
列が欠落しているにもかかわらず使用されているカバリングインデックス
MariaDB 10 / InnoDBを使用して、次のクエリがあります。 SELECT id, sender_id, receiver_id, thread_id, date_created, content FROM user_message WHERE thread_id = 12345 AND placeholder = FALSE ORDER BY date_created DESC LIMIT 20 このクエリは、指定された条件に従ってメッセージをフェッチし、作成日順に並べ替えます。 をカバーするインデックスがあり(thread_id, date_created)ます。 EXPLAINを実行すると、正しいインデックスが使用され、クエリがインデックスにないステートメントの途中で列を使用しているにもかかわらず、「Using where」という出力が表示されます。「placeholder = x」には任意の値を使用でき、結果は同じです。 別の列を使用するように並べ替えを変更すると、EXPLAINは「whereの使用。filesortの使用」を正しく示します。 ひっかきの瞬間があります。誰かがこれに光を当ててくださいませんか?追加の列のためにカバリングインデックスを完全に使用できなかったため、追加のfilesortが必要になることを期待します。

1
initdata:カーネルバッファ用のメモリがありません
RedHat Enterprise Linux 7.6上のSQL Server 2017 Developer EditionをSQL Server 2019 CTP 3.0にアップグレードしました。 mssql-serverサービスは開始されなくなります。/ var / opt / mssql / log / errorlogは以下を示します: 2019-06-12 09:36:31.98サーバーMicrosoft SQL Server 2019(CTP3.0)-15.0.1600.8(X64) May 17 2019 00:56:19 Copyright(C)2019 Microsoft Corporation Developer Edition(64-bit)on Linux(Red Hat Enterprise Linux) 2019-06-12 09:36:32.04サーバーUTC調整:-5:00 2019-06-12 09:36:32.05サーバー(c)Microsoft Corporation。 2019-06-12 09:36:32.07サーバー無断転載禁止 2019-06-12 09:36:32.08サーバーサーバープロセスIDは32です 。2019-06-1209:36:32.09サーバーログSQL …

2
Postgresはビューで選択されていない計算列の計算を実行しますか?
ビューからデータを選択することによるパフォーマンスへの影響を理解しようとしています。ビューの列の1つは、元のテーブルの他のデータの関数です。 計算は、計算された列が選択した列のリストにあるかどうかに関係なく実行されますか? テーブルがあり、ビューがそのように宣言されている場合 CREATE TABLE price_data ( ticker text, -- Ticker of the stock ddate date, -- Date for this price price float8, -- Closing price on this date factor float8 -- Factor to convert this price to USD ); CREATE VIEW prices AS SELECT ticker, ddate, price, factor, price …

1
自動的に作成されたNT AUTHORITYおよびNT SERVICEアカウントを削除する
そのため、最近ジョブを移動しました。新しいSQL Serverのインストール用のビルドスクリプトで見つけたコードの一部を以下に示します。 IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = N'NT AUTHORITY\SYSTEM' ) BEGIN DROP LOGIN [NT AUTHORITY\SYSTEM]; END IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = N'NT SERVICE\SQLWriter' ) BEGIN DROP LOGIN [NT SERVICE\SQLWriter]; END IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = …

3
ストアドプロシージャは、それが格納されているデータベースを参照できますか?
複数のデータベースで、いくつかの変更を加えて複製されたストアード・プロシージャーがあるとします。また、別のデータベースで実行されている場合でも、ストアドプロシージャが格納されているデータベースを参照したいと思います。 現在のデータベースではなく、フルパス(..)を取得する方法、またはストアドプロシージャが格納されているデータベースを取得する方法はありますか?

3
プライマリで一時的に時間がかかる読み取り専用レプリカでの長時間実行クエリ
私は次のように4ノードAGセットアップを持っています。 すべてのノードのVMハードウェア構成: Microsoft SQL Server 2017 Enterprise Edition(RTM-CU14)(KB4484710) 16個のvCPU 356 GB RAM(これまでの話...) 最大並列度:1(アプリベンダーの要求に応じて) 並列処理のコストしきい値:50 最大サーバーメモリ(MB):338944(331 GB) AG構成: ノード1:プライマリまたは同期コミット読み取り不可セカンダリ、自動フェイルオーバー用に構成 ノード2:プライマリまたは同期コミット、読み取り不可のセカンダリ、自動フェイルオーバー用に構成 ノード3:読み取り可能なセカンダリセット、非同期コミット、手動フェイルオーバー用に構成 ノード4:非同期のコミットを備えた読み取り可能なセカンダリセット、手動フェイルオーバー用に構成 問題のクエリ: このクエリについては、まったくおかしなことは何もありません。アプリケーション内のさまざまなキューにある未解決の作業項目の概要を提供します。以下の実行プランのリンクの1つからコードを確認できます。 プライマリノードでの実行動作: プライマリノードで実行した場合、実行時間は通常約1秒です。以下は実行計画です。以下は、プライマリノードからのSTATISTICS IOおよびSTATISTICS TIMEからキャプチャされた統計です。 (347 rows affected) Table 'Worktable'. Scan count 647, logical reads 2491, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical …

1
なぜ複数の(関連付けられていない)時系列履歴テーブルがあるのですか?
SQL Server 2017バックエンドを備えた概念実証システムをセットアップしています。 システムはテンポラルテーブルを使用して、資産構成を記録し、時間の経過に伴う変化を追跡します。 履歴テーブルにリンクされているデータテーブルがあります。それをdbo.MSSQL_TemporaryHistoryFor_12345678900と呼びましょう。 ここまでは順調ですね。私には2つの問題があります。 今日、テーブルのバージョニングをオフにして、計算列を追加できるようにしました。これが行われ、エラーなしで再びオンになりました。 変更前の履歴データをクエリできないことがわかりました。新しいデータが履歴に追加されていますが、事前には何もありません。 SSMSの内部を見ると、すべて同じ名前で16進数のサフィックスが付いた複数の履歴テーブルがあることがわかります(例:dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3)。メインデータテーブルの下にリンクされていません。彼らはデータベース内で自分たちだけで浮かんでいるだけです。私がsys.tablesをクエリしたとき、これらは履歴テーブルとして表示されず、メインデータテーブルにリンクされていません。 これらのテーブルには、欠落している履歴データが含まれています。 したがって、私が持っている質問は次のとおりです。 これらの追加の表は何を表していますか? 彼らはどのように作成されましたか? これらをメインの履歴チェーンに何らかの形で再リンクして、履歴レポートを取り戻す方法はありますか? それは非常にイライラするので、あなたが提供できるどんな助けもありがたく受け取られるでしょう。ありがとう。

4
SQL Server 2014のMAXDOP設定
私はこの質問が何度も尋ねられ、それに対する回答もあることを知っていますが、私はまだこの主題についてもう少しガイダンスが必要です。 以下はSSMSからの私のCPUの詳細です: 以下は、DBサーバーのタスクマネージャーの[CPU]タブです。 私はMAXDOP次の式に従って2 の設定を維持しています: declare @hyperthreadingRatio bit declare @logicalCPUs int declare @HTEnabled int declare @physicalCPU int declare @SOCKET int declare @logicalCPUPerNuma int declare @NoOfNUMA int declare @MaxDOP int select @logicalCPUs = cpu_count -- [Logical CPU Count] ,@hyperthreadingRatio = hyperthread_ratio -- [Hyperthread Ratio] ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical …

1
ストアドプロシージャを更新するには「ダウンタイム」が必要ですか?(「定義変更」エラーによる)
ストアドプロシージャの更新は、ユーザーがシステムを積極的に使用しているときにできることだといつも思っていました。 しかし、私は現在、ストアドプロシージャの更新をテストしており、sprocへの長時間実行中の呼び出しが実行されている間に(呼び出しから4分以上)、sprocを更新しました。(別のウィンドウで別のクエリプランを試すことを計画していました。) 私が長期的なものに戻ったとき、私はこのエラーがありました: The definition of object 'MySprocName' has changed since it was compiled. このエラーは、sprocの定義が更新されると、アクティブに実行されているsprocが失敗することを示しているようです。(sprocが実行を開始すると、定義への変更にもかかわらず、残りの実行に対してその計画を使用すると思いました。) これは本当ですか?sprocの定義を更新するためにダウンタイムが必要ですか?

3
最近の行の累計をより速く取得するにはどうすればよいですか?
現在、トランザクションテーブルを設計しています。各行の現在までの合計を計算する必要があり、パフォーマンスが低下する可能性があることに気付きました。そこで、テスト用に100万行のテーブルを作成しました。 CREATE TABLE [dbo].[Table_1]( [seq] [int] IDENTITY(1,1) NOT NULL, [value] [bigint] NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [seq] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO そして、最近の10行とその現在までの合計を取得しようとしましたが、約10秒かかりました。 --1st attempt SELECT TOP 10 seq …

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