データベース管理者

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

1
許可のスタックを拒否する
役割のためにdb_denycustomer、私がしたいだけで、顧客テーブルの列コードを選択し、他の人のどれもします。だから私はこれをしました: DENY SELECT ON dbo.customer TO db_denycustomer GRANT SELECT ON dbo.customer (code) TO db_denycustomer ...そしてそれはうまくいきます。涼しい!しかし、なぜですか? 私が関連記事で読んだのは、その許可スタックですが、DENY優先されます。対照的に、私の場合、最後の権限「クエリ」が優先されたようです。案の定、逆の順序で実行すると、後者DENYもコード列を非表示にします。 これについて詳しく説明してもらえますか? テストしたユーザーのデフォルトdb_datawriterとdb_datareaderロールも含めました。

1
システムヘルスに「sql_exit_invoked」がある場合、それはどういう意味ですか?
SQL Server 2016 Standardサーバーの1つに問題があります。私は8つの本番サーバーを使用していますが、ログにトレースが記録されずにランダムにクラッシュするのはこのサーバーだけです。 system_healthを有効にしています。「sql_exit_invoked」であるシステムヘルス魔女の行があることに気づきました。 その行の詳細情報を見つけようとしています。どういう意味ですか?インターネットで見つけた唯一の情報は、SQLExit()が呼び出されたときに発生し、SQL 2012以降にのみログに記録されるということです(msdn Webサイトで利用可能なリンク)。 だから私の質問は:これを私のログで見るのを心配するべきですか?これは問題のあるサーバーでのみ見つかり、他の7つのサーバーでは見つかりません。(それらはすべてSQL Server 2016 Standardエディションです) 誰かがこれについてもっと情報をくれますか?

1
SELECTクエリの算術オーバーフロー
単純なSELECTステートメントで算術オーバーフローが発生しました。クエリは以下のようになりました SELECT [SaleValue] FROM Sales [SaleValue]データ型decimal(9,0)であり、計算列ではありませんでした。 これが発生した理由は、このフィールドに指定されたデータ型よりも大きい値が格納されている行が列に含まれていたためdecimal(10,0)です。 列のサイズを大きくした場合にのみ、selectを機能させることができました。問題のテーブルには、他の2つの列と行に2つのインスタンスがあります。 この状況はどのようにして起こりましたか?そもそもどのように範囲外の値が列に保存されたのですか? 私はMicrosoft SQLサーバーを使用しています+これはベーステーブルであり、ビューではありません。

3
有限のコラボレーション距離で行に一意の値を割り当てるためのソリューション
次のコードを作成して入力できるテーブルがあります。 CREATE TABLE dbo.Example(GroupKey int NOT NULL, RecordKey varchar(12) NOT NULL); ALTER TABLE dbo.Example ADD CONSTRAINT iExample PRIMARY KEY CLUSTERED(GroupKey ASC, RecordKey ASC); INSERT INTO dbo.Example(GroupKey, RecordKey) VALUES (1, 'Archimedes'), (1, 'Newton'), (1, 'Euler'), (2, 'Euler'), (2, 'Gauss'), (3, 'Gauss'), (3, 'Poincaré'), (4, 'Ramanujan'), (5, 'Neumann'), (5, 'Grothendieck'), (6, 'Grothendieck'), …

1
インデックスシークオペレーターのコスト
以下のAdventureWorksサンプルデータベースクエリの場合: SELECT P.ProductID, CA.TransactionID FROM Production.Product AS P CROSS APPLY ( SELECT TOP (1) TH.TransactionID FROM Production.TransactionHistory AS TH WHERE TH.ProductID = P.ProductID ORDER BY TH.TransactionID DESC ) AS CA; 実行計画ショー推定オペレータコストの0.0850383ため(93%)インデックスシーク: コストは、使用中のカーディナリティ推定モデルとは無関係です。 Estimated CPU CostとEstimated I / O Costを単純に追加したものではありません。また、インデックスシークの 1回の実行のコストに推定実行回数を掛けたものでもありません。 このコスト数はどのようにして得られたのですか?

2
より良いストレージにアップグレードした後のチェックポイント中の待機の増加
古いオールフラッシュアレイから新しいオールフラッシュアレイ(異なるが、確立されたベンダー)に移行すると、チェックポイント中にSQL Sentryで待機が増えることがわかりました。 バージョン:SQL Server 2012 Sp4 私たちの古いストレージでは、待機時間はチェックポイント中の「スパイク」が2,500で約2kでしたが、新しいストレージではスパイクは通常10kで、ピークは50k近くです。歩哨は私たちをPAGEIOLATCHワティスにもっと向けます。独自の分析を行うと、PAGEIOLATCH and PAGELATCH待機の組み合わせのようです。Perfmonを使用すると、一般に、チェックポイントを行うページが増えるほど、待機時間が長くなりますが、フラッシュするのは、チェックポイント中に〜125 MBだけです。私たちのワークロードはほとんどが書き込みです(主に挿入/更新)。 ストレージベンダーは、ファイバーチャネル直接接続アレイがこれらのチェックポイントイベント中に1 ms未満応答していることを証明しています。HBAはアレイの番号も確認します。また、キューの深さが8を超えることはなかったため、HBAキューの問題であるとは考えていません。また、ZIO、実行スロットル、およびキューの深さの設定を無効にして、新しいHBAを試しました。また、サーバーのメモリを500 GBから1 TBに変更せずに増やしました。チェックポイントプロセス中に、2〜4個のコア(16個のうち)が100%に急上昇しますが、全体的なCPUは約20%です。BIOSも高パフォーマンスに設定されています。興味深いことに、CPUがC2スリープ状態になっているのは無効にしたにもかかわらず、通常はC2スリープ状態であるため、スリープ状態がC1を超えた理由を調査しています。 ほとんどすべての待機が、DCMページタイプのPFSが時々発生するデータページで発生していることがわかります。待機はtempdbではなくユーザーDBで行われます。また、待機が複数のデータページにわたって行われ、一部のSPIDが同じページで待機していることもわかります。データベースの設計には、いくつかの挿入ホットスポットがありますが、同じ設計が古いストレージに配置されていました。 このクエリのループを100回実行すると、ディスクとメモリで待機しているSPIDの数を把握できました。 SELECT [owt].[wait_type], count(*) as waitcount FROM sys.dm_os_waiting_tasks [owt] WHERE [owt].[wait_type] LIKE 'PAGE%' group by [owt].[wait_type] order by 1 GO 100 「良い」ことは、同じモデル配列と類似のサーバー仕様を持つパフォーマンス環境で問題を簡単に再現できることです。他にどこを見るべきか、どのように問題を絞り込むかについての考えをいただければ幸いです。現在、次のテストは次のとおりです。新しいマザーボードとより多くのCPUを搭載した新しいサーバー。SIOSデータキーパーを無効にする(これが古いストレージで行われている場合でも)。異なるHBAブランド。 exec sp_Blitz @outputtype = 'markdown' 優先度5:信頼性:-危険なサードパーティモジュール-Sophos Limited-ソフォスのバッファーオーバーラン保護-SOPHOS〜2.DLL-危険と思われるサードパーティモジュールがインストールされています。 優先度200:情報:-クラスターノード-これはクラスター内のノードです。-TraceFlag On-トレースフラグ1117がグローバルに有効になります。-トレースフラグ1118がグローバルに有効になります。-トレースフラグ3226がグローバルに有効になります。 優先度200:ライセンス:-使用中のEnterprise Edition機能* xxxxx-[xxxxxx]データベースは圧縮を使用しています。このデータベースをStandard Editionサーバーに復元すると、2016 …

2
孤児の化身とは何ですか?
インカネーションはで説明されている答えに別の質問このサイトに。答えは「孤立した」化身について言及しています: …ORPHANEDインカネーションとOBSOLETEバックアップにつながる他の要因があります… Oracleドキュメントから、関連する必要がある、またはの値を持つことができる列がV$DATABASE_INCARNATION含まれてSTATUSいることがわかります。ORPHANCURRENTPARENT 「孤立した」化身とは何ですか。また、STATUS= ORPHANinの行がどのステップで生成されるのでしょうV$DATABASE_INCARNATIONか。

3
MSDBを削除してもよろしいですか?
私はDBAではありません。MSDBが何をしているのかをググっただけです。基本的には、そのSQL Serverの職務と履歴のDBです。今、クラウドサーバーのスペースが足りなくなり、1年分のMSDBが2017年分あります。 、これを削除しても大丈夫ですか、それともバックアップのために保持しますか? 私のMSDBは250GB HDDで93GBです。

3
グループの列ごとに最後の非NULL値のセットを選択するにはどうすればよいですか?
SQL Server 2016を使用していますが、使用しているデータは次の形式です。 CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1)); INSERT INTO #tab VALUES ('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL), ('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL); SELECT * FROM #tab; 列の最後のnull以外の値を取得し、val1でval2グループ化catおよび順序付けしたいのtですが。私が求めている結果は cat val1 val2 A 1 P B 10 C 私が来た最も近いものは、順序付けられた最後の非null値が必要なので、機能しないものLAST_VALUEを無視しながら使用してORDER BYいます。 SELECT DISTINCT cat, LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1, …

5
Olaのスクリプトのメリットとデメリットは何ですか?
メンテナンスプランに対してOlaのソリューションを使用することの長所と短所を理解するのを手伝ってくれませんか?SQLパスに基づくプレゼンテーション(http://www.pass.org/DownloadFile.aspx?File=ebae1b31)を用意しました。 Olaのソリューションが対処し、保守計画ソリューションが対応しないいくつかのシナリオも準備しています。これをより技術的に説明するのを手伝ってくれませんか? ちなみに、私たちは約150以上のサーバー(2008/2012/2014/2016の組み合わせ)を管理しており、そのうちの75%以上がOlaのソリューションです。私はブレント・オザーのこの記事が好きでした。しかし、コメントの1つで、ブレントはサーバー数に応じてスクリプトベースのソリューションを使用することを推奨しています。https://www.brentozar.com/archive/2012/04/maintenance-plans-roombas-suck-good-way/

3
非クラスター化インデックスは行の順序について何か保証しますか?
私は、order byなしのselectステートメントを実行するときに、テーブルの行が挿入された順序になるようにしたいと考えている開発者がいます。開発者は、クラスター化インデックスから非クラスター化インデックスへの変更を提案しました。 インデックスをクラスター化から非クラスター化に変更することで、テーブルに行が表示される順序について何か保証はありますか? この質問は主に私の好奇心です。代わりにID列を使用することをお勧めしますが、このリクエストは私に考えさせられました。タイムスタンプを使用できますが、行を同時に挿入できる可能性があります。 よろしくお願いします。

2
MySQL-複数年にわたる同数の異なる月の合計の最大
この質問は、触発されたこの1 [クローズ]、事実上これと同じである1が異なるRDBMSの(MySQLの対PostgreSQLの)を使用します。 腫瘍のリストがあるとします(このデータは実際のデータからシミュレートされます)。 CREATE table illness (nature_of_illness VARCHAR(25), created_at DATETIME); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Lung', …
9 mysql-5.6 

5
ワイルドカード「[]」を使用して、](角かっこ)とPATINDEXを一致させる
T-SQL †でカスタムJSONパーサーを作成しています。 私のパーサーのために、PATINDEXトークンのリストからトークンの位置を計算する関数を使用しています。私の場合のトークンはすべて1文字で、次のものが含まれています。 {} []:、 通常、与えられたいくつかの文字の(最初の)位置を見つける必要があるときは、次のPATINDEXような関数を使用します。 PATINDEX('%[abc]%', SourceString) この関数はその後、私の最初の位置を与えるaか、bまたはcに-最初に発見される早い方- SourceString。 今、私の場合の問題は]キャラクターに関連しているようです。文字リストで指定するとすぐに、たとえば次のようになります。 PATINDEX('%[[]{}:,]%', SourceString) 関数が一致を見つけられないため、私の意図したパターンは明らかに壊れています。私が最初に脱出する方法が必要ですように見えます]ので、PATINDEX検索文字ではなく、特別なシンボルの一つとして扱い、それを。 私は同様の問題について尋ねるこの質問を見つけました: LIKE演算子と角かっこが必要です ただし、その場合、]単に1文字であり、大括弧なしで指定できるため、大括弧で指定する必要はありません。エスケープ使用しない別の解決策は、だけのために働くLIKEといないためPATINDEX、それが使用しているため、ESCAPE後者によって前者としないことによってサポートされ、副次句を。 だから、私の質問は、ワイルドカードを使用してを探す方法はありますか?]PATINDEX[ ]または、他のTransact-SQLツールを使用してその機能をエミュレートする方法はありますか? 追加情報 上記PATINDEXの[…]パターンで使用する必要があるクエリの例を次に示します。ここのパターンは(多少ではありますが)機能し]ます。文字が含まれていないためです。私もそれを使用する必要があり]ます: WITH data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) AS ResponseJSON), parser AS ( SELECT Level = 1, OpenClose = 1, P = p.P, S = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) - …

2
msdbでクエリストアを有効にするとどのようなメリットがありますか?
SQLシステムデータベース(master、model、msdb、tempdb)のクエリストアは、msdbでのみ使用できます。msdbのクエリストアに関するドキュメントを探しましたが見つかりませんでした。 GUIには表示されませんが、SQL 2016インスタンスで検証できます クエリストアの検証がオフです USE msdb SELECT * FROM sys.database_query_store_options; クエリストアをオンにする USE [master] GO ALTER DATABASE msdb SET QUERY_STORE = ON GO ALTER DATABASE msdb SET QUERY_STORE (OPERATION_MODE = READ_WRITE , INTERVAL_LENGTH_MINUTES = 30 , MAX_STORAGE_SIZE_MB = 1000 , QUERY_CAPTURE_MODE = AUTO) GO クエリストアの検証がオンになっています USE msdb SELECT * FROM sys.database_query_store_options; …

1
インストールメディアなしでSQL Server 2014 Standard Editionをアンインストールする方法
数年間、SQL Server 2014 Standardのコピーを既定のインスタンスとして開発ボックスにインストールしました。私は自分のマシンに標準をインストールしました。これは、MSDNサブスクリプションを介して使用できる無料のライセンスがあったためです。ここで、SQL Server 2014をアンインストールして、SQL Server 2017 Developer Editionをデフォルトのインスタンスにしたいと思います。標準の[プログラムの追加と削除]ワークフローを使用してSQL Server 2014をアンインストールしようとしましたが、どの機能をアンインストールするかを尋ねると、アンインストールメディアを含むディレクトリを指定するよう求められます。残念ながら、MSDNから入手したSQL Server 2014ダウンロードパッケージを保存せず、MSDNにアクセスできなくなりました。Visual Studioもチェックしましたが、SQL Server 2016のみに戻ります。インストールメディアなしでSQL Server 2014 Standardをアンインストールするにはどうすればよいですか? さらなる背景: SQL Server 2014をアンインストールしたいのSTRING_AGGは、Azure SQLデータベースとSQL Server 2017の新機能を使用したいからです。開発環境のセットアップを簡単にするために、ローカル環境の開発接続文字列にドット表記を使用します。接続文字列は次のとおりです。 Data Source=.;Initial Catalog=<Database Name>;Trusted_Connection=True;Connection Timeout=30; ドット表記はデフォルトデータベースに接続します。私の知る限り、SQL Server 2017をデフォルトデータベースにするには、最初にSQL Server 2014をアンインストールする必要があります。ドット表記の接続文字列を使用して、SQL Server 2014をアンインストールせずにSQL Server 2017に接続できる場合は、そのソリューションにも対応できます。

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