データベース管理者

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

1
Transact-SQLの集計関数の後に等号(=)を配置できますか?
私はこのようなスクリプトに遭遇しました: set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end) 2番目のキーワードの合計の後の等号(=)の意味が理解できません。クエリを実行すると、等号がある場合とない場合の両方でエラーが表示されません。 キーワードの後に​​等号を付ける目的を知りたいsum。それは間違いですか? ありがとう

4
ネットワークバックアップの代替
私たちの環境では、Always On可用性グループにあるサーバーとスタンドアロンのサーバーがあります。 通常はネットワーク共有にバックアップしますが、最近、データベースが大きくなるにつれて、かかる時間が長くなり、ネットワーク全体の速度が低下することがわかりました。 Ola hallengrenのスクリプトは、圧縮とバックアップファイルの分割に使用されています。私は毎日の「完全」バックアップのみを実行しています。バックアップは、ネットワーク共有EMC isilonドライブに送られます。 EMC DD Boostには満足できません。唯一の代替策は、ローカルバックアップを実行してから、同じネットワーク共有にコピーすることです。 上記以外の効率的な方法はありますか?

1
ALTER TABLE…DROP COLUMNは本当にメタデータのみの操作ですか?
ALTER TABLE ... DROP COLUMNはメタデータのみの操作であることを示すソースがいくつか見つかりました。 ソース どうすればいいの?DROP COLUMN中のデータは、基になる非クラスター化インデックスおよびクラスター化インデックス/ヒープから削除する必要はありませんか? さらに、Microsoft Docsは、それが完全にログに記録された操作であることを示唆しているのはなぜですか? テーブルに加えられた変更はログに記録され、完全に回復可能です。列の削除や、SQL Serverの一部のエディションでは、デフォルト値でNOT NULL列を追加するなど、大きなテーブルのすべての行に影響を与える変更は、完了して多くのログレコードを生成するのに長い時間がかかる場合があります。これらのALTER TABLEステートメントは、多くの行に影響するINSERT、UPDATE、またはDELETEステートメントと同じように注意して実行してください。 副次的な質問として:データが基になるページから削除されない場合、エンジンはどのようにドロップされた列を追跡しますか?

1
SQLの「言葉にできない言葉」とは何ですか?
SQLにとって「意味のない単語」とは何ですか? 私はsys.query_store_query_text(Transact-SQL)を読んでいて、次のように表示されるので、{SQL "unmentionable" word}をググる has_restricted_text ビット クエリテキストには、パスワードまたはその他の覚えのない単語が含まれています。 その他の3つのリンクで、見つけた場所に戻ることができますが、パスワードとの関係やSQLが気にするものを示すものは何も見つかりません。

1
組織ですべてのSQL Serverライセンスを「自己監査」する方法は?
だから私は素敵な非営利組織で新しい仕事を始めました。それは数十年前から存在しています。SQL Serverのさまざまなエディションとバージョン(例:2005 Expressから2016 SP2 Enterprise)と、多数のWindows VM(2003から2016までのバージョン)があります。 以前のDBAは、会社が所有しているライセンスの数や、エディション、バージョンに関するドキュメントを作成していませんでした。事実上、有用な記録はありません。 MAP Toolkitを実行してSQL Serverの詳細を収集しました。したがって、少なくとも、どのサーバーが存在するかについての開始点があり、どのサーバーがまだ運用データを提供しているかを調べました。 また、新しいApexSQL Discoverツールを使用しましたが、結果はまちまちです(申し訳ありませんが、サーバーを1台追加する必要があるときに、このツールが実行されるまで3日間待つことができません)。また、dbatools find-dbainstance(PSを使用して大量のデータをエクスポートする大ファンではありません)。これをすべてまとめることで、この時点で、このドメインに存在していたインスタンスのほとんどまたはすべてを発見したことをかなり確信しています。 もちろん、私はしましライセンスを照会して、いくつかの方法、徹底的に調査し、完全に役に立たない 、非常に便利MS SQLのライセンスガイド は何も組織が所有しているか、どのようにそれを取得することをライセンス上の任意の情報を提供していないようにみえているのを。 問題の核心:これらのライセンスの一部は10年(または2年)前に購入されました。一部は確かに紙の請求書でした。これは非営利団体だと言ったことを覚えていますか?プラス面として、ライセンスは安価です。一方、ライセンスは安価であり、新しいライセンスを購入する方が安いため、ほとんどまたはすべてのライセンスにSAはありません。編集:これは当時SAを購入しない理由でした、私は関与していませんでした。 ほとんどの場合SAがないため、サーバーには適切なライセンスが付与される可能性が高く、必要に応じて新しいものを購入するだけだと思いますか?それは恐ろしいアプローチのようです。 私の質問: 2004年の紙の請求書を調べようとせずに、新しい会社が所有しているSQL Serverライセンスをどのようにして知るのですか?私はこのような状況に行ったことがありません。監査を受けるか、パートナーに監査を依頼する唯一の選択肢ですか?(もしそうなら、マイクロソフトはあなたは何をしていますか??) dba.seがここで提供できる洞察は、おそらく私の人生に数年を追加します。皆さんありがとう!


1
ビューから*を選択すると4分かかります
ビューに対してクエリを実行すると4分以上かかるという問題が発生しています。しかし、クエリの根本を実行すると、1秒程度で終了します。 唯一わからないのは、結合されるテーブルが両方ともテンポラルテーブルであることです。 アドホッククエリプラン:https : //www.brentozar.com/pastetheplan/?id=BykohB2p4 クエリプランを表示:https : //www.brentozar.com/pastetheplan/?id=SkIfTHh6E どこで試してこれを理解するかについての提案はありますか? コードを表示: ALTER VIEW [dbo].[vwDealHistoryPITA] AS SELECT ROW_NUMBER() OVER (PARTITION BY cm.CodeMasterID ORDER BY cm.CodeMasterID, cm.LastUpdateDate) AS Deal_HistoryID, cm.CodeMasterID, cm.ProjectName, cm.[Status], d.CompanyID, d.DealTypeMasterID, cm.[Description], d.PassiveInd, d.ApproxTPGOwnership, d.NumberBoardSeats, d.FollowonInvestmentInd, d.SocialImpactInd, d.EquityInd, d.DebtInd, d.RealEstateInd, d.TargetPctgReturn, d.ApproxTotalDealSize, cm.CurrencyCode, d.ConflictCheck, cm.CreatedDate, cm.CreatedBy, cm.LastUpdateDate, cm.LastUpdateBy, d.ExpensesExceedThresholdDate, d.CurrentTPGCheckSize, …
11 sql-server 

2
DELETEクエリが別のフォーマットよりもはるかに長いフォーマットで実行されるのはなぜですか?
一部の重複を削除しようとする特定のクリーンアップコードがあります。 これは多くの顧客サイトで完全に実行されます。ログから、このクエリでは少なくとも1秒から45秒が消費されていることがわかります。 DELETE FROM [tbl] WHERE [Id] NOT IN ( SELECT MIN([Id]) FROM [tbl] GROUP BY [IdProject], [IdRepresentative], [TimeStart] ) しかし、私はこのクエリを4時間以上(現在までで、終了しない)実行している顧客がいます!私はDBをチェックしました(DBCC CHECKDB)、統計情報を更新しました(sp_updatestats)もUPDATE STATISTICS [tbl] WITH FULLSCAN変更を示していません。 お客様からDBの元のバックアップがあります。SQL Server 14.0.2002.14で実行しています。Standard Editionを持っていますが、お客様はExpress Editionを使用しています。 他の誰もDBを使用していないことをアクティビティモニターで確認できます。待機時間はなく、CPUは25%使用されています(4つのCPUのうちの1つのみ)。また、この私のテストケースでは、他の誰もDBを使用していません。 私はクエリを再構成し、このステートメントをチェックしました: DELETE FROM [tbl] FROM [tbl] AS t LEFT OUTER JOIN ( SELECT MIN([Id]) AS [IdMin] FROM [tbl] …

2
SSMSの新機能はどこでリクエストしますか?
Microsoftに質問したい: 接続されているサーバーに基づいてSSMSのページを色分けするには クエリ結果が返されたときにそれを行ってください。 質問:これらの機能をどのように求めますか?
11 ssms 

2
Int / SmallintからVarcharへの暗黙の変換が発生するのはなぜですか?それは本当にカーディナリティの見積もりに影響を与えますか?
実際の実行プランでプラン表示分析(SSMS)を使用して、パフォーマンスの遅いクエリをトラブルシューティングしようとしています。分析ツールは、行数の見積もりが計画のいくつかの場所で返された結果からずれていることを指摘し、さらにいくつかの暗黙の変換警告を与えます。 これらのintからVarcharへの暗黙的な変換を理解できません-参照されるフィールドはクエリのパラメーター/フィルターの一部ではなく、関係するすべてのテーブルで列のデータ型は同じです: 以下のCardinalityEstimate警告が表示されます。 式の型変換(CONVERT_IMPLICIT(varchar(12)、[ccd]。[profileid]、0))は、クエリプランの選択で "CardinalityEstimate"に影響を与える可能性があります-このフィールドは、私のDB内のすべての整数です 式の型変換(CONVERT_IMPLICIT(varchar(6)、[ccd]。[nodeid]、0))は、クエリプランの選択で "CardinalityEstimate"に影響を与える可能性があります-このフィールドは、私のDBのあらゆる場所でsmallintです 式の型変換(CONVERT_IMPLICIT(varchar(6)、[ccd]。[sessionseqnum]、0))は、クエリプランの選択で "CardinalityEstimate"に影響を与える可能性があります-このフィールドは、DB内のあらゆる場所で小さな整数です 式の型変換(CONVERT_IMPLICIT(varchar(41)、[ccd]。[sessionid]、0))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります-このフィールドは、DBのすべての場所で10進数です [編集]参照用のクエリと実際の実行計画は次の とおりですhttps://www.brentozar.com/pastetheplan/?id=SysYt0NzN そして、テーブルの定義。 /****** Object: Table [dbo].[agentconnectiondetail] Script Date: 1/10/2019 9:10:04 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[agentconnectiondetail]( [sessionid] [decimal](18, 0) NOT NULL, [sessionseqnum] [smallint] NOT NULL, [nodeid] [smallint] NOT NULL, [profileid] [int] …

4
ID列の再シード:必要な場合
大学(私は学生です)での最後のレッスンの1つで、講師から、データベース(必要に応じてMySQLサーバー)と、データベースをデータソースとして使用する小さなクライアントアプリを開発するように依頼されました。 要件の1つは、ID列(すべてのテーブルのPK)が連続している必要があることです。つまり、テーブル行が削除された場合、そのPKは後続の挿入で再利用する必要があります。RDBMS、PK、およびID列に関する平均的な知識があります。私が理解していることから、そのID列は、行を挿入するときにDBがPKを自動生成できるようにするための手段にすぎません。また、ID列の値は、(自然キーではない限り)行属性とは一切関係しません。 この要件(厳密に連続したID列)は私には不審でした。IDがシーケンシャルでない(削除によるギャップがある)場合、何が悪いのかを講師に尋ねてみましたが、「ユーザーにとっては便利であり、データベースを保守するDB管理者にとっては便利」という非常に抽象的な回答を得ました。具体的な例はありません。「ユーザーにとって便利」という議論は、ビジネスドメインでは何の意味もないため、ばかげているように思われます。 したがって、これらの理由が本当かどうか知りたいのですが。ID列を再シードする必要がある場合、つまりIDスペースが使い果たされた場合の1つだけを考えることができます。ただし、これは、ID列のタイプが誤って選択された場合int、bigintつまりuniqueidentifierテーブルに10億行が含まれている代わりに、または単純である場合に、より設計上の問題になります。ID列がクラスター化インデックスであるとします。ID列のギャップがインデックスのパフォーマンスに影響を与える可能性はありますか?多分私が知らない削除ごとに自動ID列が再シードされる実際の理由は他にもありますか? 前もって感謝します!

1
バッチモードのウィンドウ集計で算術オーバーフローが発生するのはなぜですか?
次のクエリは、SUM列ストアテーブルに対してウィンドウ処理を実行します1500 total rows。それぞれの値は0または1であり、INTデータ型をオーバーフローします。なんでこんなことが起こっているの? SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() OVER (PARTITION BY v, s, a, p ORDER BY …

1
特定のテーブルのROW_OVERFLOW_DATAページを一覧表示する
ROW_OVERFLOW_DATAの行があるテーブルのページのリストを取得しようとしています。文書化されていないDMVから割り当てられたページのリストを取得できますが、sys.db_db_database_page_allocationsそのDMVの出力にROW_OVERFLOW_DATAページがリストされていないようです。私が見つけることができない他のDMVはありますか? 最小限、完全、そして(うまくいけば!)検証可能な例: USE tempdb; IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL DROP TABLE dbo.t; GO CREATE TABLE dbo.t ( rownum int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED , on_row_data varchar(30) NOT NULL DEFAULT ('on_row_data') , off_row_data varchar(MAX) NOT NULL DEFAULT REPLICATE('A', 20000) --PLENTY BIG ENOUGH! ) WITH (DATA_COMPRESSION = NONE); --not …

2
MAXDOP = 1、クエリヒントと並列処理のコストしきい値
インスタンスがMAXDOP1に設定されていて、クエリヒントを使用して特定のクエリを並列化できる場合、SQLは並列処理のコストしきい値を使用して、実際に並列化するかどうかを決定しますか? このリンクはCTFP MAXDOPが1の場合は無視されることを示唆していますが、私はこの特定の情報を掘り下げることができませんでした。これは、クエリのヒントなしでは意味がありませんMAXDOP。 これら2つのリクエストの予想される動作を誰かに教えてもらえますか? 例1: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 30 例2: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 70

1
N'Șc 'は、Latin1_General_CI_AS照合を使用してN'C'の重複キーを検討しました
NVARCHAR(50)列を含む一意のキーを持つテーブルがあります(正しいかどうかはわかりますが、あります)。そのため、挿入しようとすると、ȘcまたはC(挿入の順序は関係ありません)、照合の問題により2番目の挿入で中断します。ここにエラーがあります: (1行が影響を受けました)メッセージ2601、レベル14、状態1、行16一意のインデックス 'IX_TestT'を持つオブジェクト 'dbo.testT'に重複するキー行を挿入できません。重複するキーの値は(C)です。 返品を選択: データベースのデフォルトの照合はLatin1_General_CI_ASです。既存の構造をあまり変更せずに、その解決方法をしばらく探しましたが、機能する方法を見つけることができませんでした。さまざまな照合順序と組み合わせを試しましたが、すべて失敗します。まだ展開されていないキャラクターの展開などについて(こことここ)を読んでください。これは、問題を再現するために使用しているサンプルコードです。自由に変更し、これを解決するのに役立つと思われるものをお勧めします。 CREATE TABLE testT ( [Default_Collation] [NVARCHAR] (50) COLLATE DATABASE_DEFAULT, [Latin1_General_CI_AS] [NVARCHAR] (50) COLLATE Latin1_General_CI_AS, [Latin1_General_CI_AI] [NVARCHAR] (50) COLLATE Latin1_General_CI_AI, [SQL_Collation] [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS); CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation]) ON [PRIMARY] GO INSERT INTO testT SELECT N'Șc', --COLLATE Latin1_General_CI_AS N'Șc', --COLLATE …

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