タグ付けされた質問 「sql-server-2016」

SQL Server 2016(メジャービルドバージョン13.00.xxxx)。sql-serverにもタグを付けてください。

3
単純なCCI行グループを作成するのに最大30秒かかるのはなぜですか?
挿入物の一部が予想よりも長くかかっていることに気付いたとき、CCIを含むデモに取り組んでいました。再現するテーブル定義: DROP TABLE IF EXISTS dbo.STG_1048576; CREATE TABLE dbo.STG_1048576 (ID BIGINT NOT NULL); INSERT INTO dbo.STG_1048576 SELECT TOP (1048576) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN FROM master..spt_values t1 CROSS JOIN master..spt_values t2; DROP TABLE IF EXISTS dbo.CCI_BIGINT; CREATE TABLE dbo.CCI_BIGINT (ID BIGINT NOT NULL, INDEX CCI CLUSTERED COLUMNSTORE); テストでは、ステージングテーブルから1048576行すべてを挿入しています。何らかの理由でトリミングされない限り、圧縮された行グループを1つだけ埋めるのに十分です。 …


1
この派生テーブルがパフォーマンスを改善するのはなぜですか?
json文字列をパラメーターとして受け取るクエリがあります。jsonは、緯度と経度のペアの配列です。入力例は次のとおりです。 declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867] ,[41.8662374,-87.6908788],[37.784873,-122.4056546]]'; それは、1,3,5,10マイルの距離で、地理的なポイントの周りのPOIの数を計算するTVFを呼び出します。 create or alter function [dbo].[fn_poi_in_dist](@geo geography) returns table with schemabinding as return select count_1 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e)) ,count_3 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e)) ,count_5 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 5,1,0e)) ,count_10 = count(*) from dbo.point_of_interest where LatLong.STDistance(@geo) <= 1609.344e …

2
なぜAT TIME ZONEは非決定的ですか?
SQL Server 2016はAT TIME ZONE非決定的と思われます。ただし、これを公式に説明したり、その背後にある理由について理論的根拠を示したりする文書を見つけることができませんでした。 なぜAT TIME ZONE非決定的ですか? 非決定性を示す例 実行中: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); 次のエラーを返します。 Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.

1
クラスター化列ストアの非クラスター化インデックスストレージ
SQL Serverでは、行ストアテーブルの一意でない非クラスター化インデックスに、非クラスター化インデックス構造のすべてのレベルでベースオブジェクトのブックマーク(RIDまたはクラスター化キー)が組み込まれます。ブックマークは、すべてのインデックスレベルで非クラスター化インデックスキーの一部として保存されます。 一方、非クラスター化インデックスが一意である場合、ブックマークはキーの一部としてではなく、インデックスのリーフレベルにのみ存在します(実際には、ブックマークは1つ以上の含まれる列として存在します)。 SQL Server 2016では、列指向のテーブル(クラスター化された列ストアインデックスを持つテーブル)に非クラスター化Bツリーインデックスを構築できます。 クラスター化された列ストアテーブルの非クラスター化Bツリーインデックスに使用される「ブックマーク」とは何ですか? 上記の一意および非一意の非クラスタ化インデックスの違いは引き続き適用されますか?

2
挿入中にディスク容量がいっぱいになりました、どうなりますか?
今日、データベースを保存するハードドライブがいっぱいであることを発見しました。これは以前にも起こりましたが、通常、原因は非常に明白です。通常、不適切なクエリがあり、tempdbに大量の流出が発生し、ディスクがいっぱいになるまで増大します。今回は、tempdbがドライブ全体の原因ではなく、データベースそのものであるため、何が起こったのかが少しわかりにくくなりました。 事実: 通常のデータベースサイズは約55 GBでしたが、605 GBに増加しました。 ログファイルのサイズは標準で、データファイルは巨大です。 データファイルには85%の使用可能なスペースがあります(これを「空気」と解釈します:使用されたが、解放されたスペースです。SQLServerは、割り当てられるとすべてのスペースを予約します)。 tempdbのサイズは正常です。 考えられる原因を見つけました。あまりにも多くの行を選択するクエリが1つあります(不正な結合により、数十万が予想される110億行が選択されます)。これはSELECT INTOクエリであり、次のシナリオが発生したのではないかと思いました。 SELECT INTOが実行されます ターゲット表が作成されます データは選択されたとおりに挿入されます ディスクがいっぱいになり、挿入が失敗する SELECT INTOは中止され、ロールバックされます ロールバックは領域を解放します(既に挿入されたデータは削除されます)が、SQL Serverは解放された領域を解放しません。 ただし、この状況では、によって作成されたテーブルSELECT INTOがまだ存在することを期待していなかったため、ロールバックによって削除されるはずです。私はこれをテストしました: BEGIN TRANSACTION SELECT T.x INTO TMP.test FROM (VALUES(1))T(x) ROLLBACK SELECT * FROM TMP.test これは次の結果になります。 (1 row affected) Msg 208, Level 16, State 1, Line 8 Invalid object name 'TMP.test'. …

4
SQL Server 2016 DBメールが送信されない
私はSQL Server 2016を使用していますが、急いでいます... DBメールが送信されず、見る場所がなくなりました。DBmail実行可能ファイルに対するSQLアカウントの許可を再確認しました-読み取りと実行が完了しました。ファイアウォールのアウトバウンドポート587のルールを入力しました。同じ未送信の問題で別のメールアカウントとプロファイルを試しました。ログ(dbメールログ)の唯一のエントリは、サービスの開始と終了です。私が見つけられるエラーはどこにもありません。電子メールは単に送信キューに入り、決して送信キューから出ないように見えます。アカウントは、自分自身で、および別のマシン上のSQL Server 2014インスタンスから電子メールを送受信できます。 送信済みステータスが「未送信」のアイテムのキューがあり、未送信メールの長いキューは別として、すべての通常の場所をチェックして、すべてのアイテムで期待される結果を確認しました。 SELECT * FROM msdb..sysmail_event_log order by log_id DESC SELECT * FROM dbo.sysmail_mailitems SELECT * FROM dbo.sysmail_sentitems USE msdb SELECT sent_status, * FROM sysmail_allitems SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb'; EXECUTE msdb.dbo.sysmail_help_status_sp 私はそれをオフにして再びオンにしてみました...この状況を明らかにするDMVなどを見逃しましたか?これは、SQL Server 2016の既知の問題で、検索には含まれていませんか?このメールを送信する他の可能な手順はありますか?

1
緩やかに変化するディメンションに対してSQL Server 2016システムバージョンのテンポラルテーブルを使用したクエリ戦略
使用している場合、システムバージョン管理一時テーブル(SQL Serverの2016年新)が、この機能は大規模なリレーショナルデータウェアハウス内の寸法を変更ゆっくり処理するために使用されるクエリのオーサリングおよびパフォーマンスの意味は何ですか? たとえば、列を含む100,000行のCustomerディメンションと、外部キー列Postal Codeを含む数十億行のSalesファクトテーブルがあるとしCustomerIDます。そして、「顧客の郵便番号別の2014年の総売上」をクエリしたいとします。簡略化されたDDLは次のようなものです(わかりやすくするために多くの列を省略しています)。 CREATE TABLE Customer ( CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED, PostalCode varchar(50) NOT NULL, SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL, SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON); CREATE …

1
CHECKDBがメモリ最適化テーブルを持つデータベースのトランザクションログファイルを読み取るのはなぜですか?
tl; dr:CHECKDBがメモリ最適化テーブルを持つユーザーデータベースのトランザクションログを読み取るのはなぜですか? CHECKDBは、データベースの1つ(特に、インメモリOLTPテーブルを使用するデータベース)をチェックするときに、ユーザーデータベースのトランザクションログファイルを読み取っているようです。 このデータベースのCHECKDBはまだ妥当な時間内に終了するため、ほとんどの場合、動作に興味があります。ただし、このインスタンス上のすべてのデータベースのCHECKDBの期間は間違いなく最長です。 Paul Randalの叙事詩「あらゆる角度からのCHECKDB:すべてのCHECKDBステージの完全な説明」を見ると、データベースの一貫性のあるビューを取得するために、SQL 2005より前のCHECKDB がログを読み取っていたことがわかります。ただし、これは2016年なので、内部データベーススナップショットを使用します。 ただし、スナップショットの前提条件の 1つは次のとおりです。 ソースデータベースにMEMORY_OPTIMIZED_DATAファイルグループを含めることはできません ユーザーデータベースにはこれらのファイルグループのいずれかがあるため、スナップショットがテーブルから外れているように見えます。 CHECKDBドキュメントによると: スナップショットを作成できない場合、またはTABLOCKが指定されている場合、DBCC CHECKDBはロックを取得して必要な整合性を取得します。この場合、割り当てチェックを実行するには排他的なデータベースロックが必要であり、テーブルチェックを実行するには共有テーブルロックが必要です。 さて、スナップショットの代わりにデータベースとテーブルのロックを行っています。しかし、それでもトランザクションログを読み取る必要がある理由は説明されていません。それで何が得られますか? シナリオを再現するために、以下のスクリプトを提供しました。それは使用していますsys.dm_io_virtual_file_statsログファイルの読み取りを識別するためします。 ほとんどの場合、ログの小さな部分(480 KB)を読み取りますが、それよりもはるかに多く(48.2 MB)を読み取ります。私の実稼働シナリオでは、CHECKDBを実行する深夜に、毎晩ほとんどのログファイル(2 GBファイルのうち約1.3 GB)を読み取ります。 スクリプトでこれまでに得た出力の例を次に示します。 collection_time num_of_reads num_of_bytes_read 2018-04-04 15:12:29.203 106 50545664 またはこれ: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:25:14.227 1 491520 メモリ最適化オブジェクトを通常のテーブルに置き換えると、出力は次のようになります。 collection_time num_of_reads num_of_bytes_read 2018-04-04 15:21:03.207 0 0 CHECKDBがログファイルを読み取るのはなぜですか?そして特に、なぜログファイルのはるかに大きな部分を時々読むのですか? 実際のスクリプトは次のとおりです。 -- let's …

1
SQL Server 2016の不適切なクエリプランにより、1週間に1回DBがロックされる
1週間に1度、過去5週間、ほぼ同じ時刻(早朝、人々が使用し始めたときのユーザーアクティビティに基づく場合があります)、SQL Server 2016(AWS RDS、ミラーリング)は多くのタイムアウトを開始しますクエリ。 すべてのテーブルの統計を更新すると、常にすぐに修正されます。 初回以降、すべてのテーブルのすべての統計を(毎週ではなく)毎晩更新しましたが、それでも起こりました(更新統計が実行されてから約8時間後ですが、毎日実行されるわけではありません)。 前回、クエリストアを有効にして、どの特定のクエリ/クエリプランであるかを確認できるかどうかを確認しました。私はそれを1つに絞り込むことができたと思います: そのクエリを見つけた後、この頻繁に使用されないクエリから欠落している推奨インデックスを追加しました(ただし、頻繁に使用される多くのテーブルに影響します)。 不適切なクエリプランは、インデックススキャンを実行していました(1万行のみのテーブルで)。同じスキャンを実行するために使用されたミリ秒単位で返された他のクエリプラン。新しいインデックスを作成した後の最新のクエリプランは、シークのみを行います。しかし、そのインデックスがなくても、99%の時間で数ミリ秒以内に戻りましたが、毎週、40秒以上かかりました。 タイムアウトする悪いもの:http : //brentozar.com/pastetheplan/?id=rymaWt56e タイムアウトしない以前の計画:http : //brentozar.com/pastetheplan/?id=HyN7ftcpe 新しいインデックスを使用した最新の計画:http : //brentozar.com/pastetheplan/?id=ryLuGKcag これは、2012年からSQL Server 2016に移行した後に発生し始めました。 DBCC CHECKDBはエラーを返しません。 新しいインデックスは問題を修正し、再び悪い計画を二度と選択しないようにしますか? うまく機能する計画を「強制」する必要がありますか? これが別のクエリ/プランで発生しないことを確認するにはどうすればよいですか? これはより大きな問題の症状ですか? 追加したばかりのインデックス: CREATE NONCLUSTERED INDEX idx_AppointmetnAttendee_AttendeeType ON [dbo].[AppointmentAttendee] ([UserID],[AttendeeType]) CREATE NONCLUSTERED INDEX [idx_appointment_start] ON [dbo].[Appointment] ( [ProjectID] ASC, [Start] ASC ) INCLUDE ( [ID], …

2
証明書チェーンは信頼されていない機関によって発行されました
少し前に、Windows 10 Home Edition環境(正確にはラップトップ)にSQL Server 2016 Developer Editionをインストールしましたが、すべて問題ありませんでした。 その後、誰か-ボックスの管理者-私に言わずに、ボックスの名前を変更することにしました。 その後、SQLサーバーに接続しようとすると、次のエラーメッセージが表示されます。 これはこれと非常によく似た質問です。 AzureのWebサイトからVMロールのDBに接続すると、「証明書チェーンは信頼されていない機関によって発行されました」 私もここにいます: ターゲットプリンシパル名が正しくありません。SSPIコンテキストを生成できません。(Microsoft SQL Server、エラー:0) Kerberos Configuration Managerを使用していて、別のエラーメッセージが表示される SQLサーバー認証でこのSQLサーバーのインスタンスに接続できますが、 Windows認証を使用して接続したいと言っておく必要があります。 明確にするために-これはすべてローカルマシンであり、どのドメインにも属していません。 ここから先に進む方法がよくわからないので、Windows認証を使用します。 証明書に関連するエラーメッセージにより、ここで証明書を再発行することについて考えさせられます。これを行う方法について、またはこれがこの状況を回避するための有効な方法であるかどうか、私にはわかりません。 私はその日はこのマシンの周りにいませんが、できるだけ早く追いつきます。時間が許せば研究を続けます。

1
SQL Server-ストアドプロシージャとプランキャッシュのIfロジック
SQL Server 2012および2016 Standard: if-elseパラメータの値に応じて、コードの2つのブランチのいずれかを実行するためにロジックをストアドプロシージャに配置すると、エンジンは最新バージョンをキャッシュしますか? また、次の実行時にパラメーターの値が変更された場合、コードの別のブランチを実行する必要があるため、ストアドプロシージャを再コンパイルおよび再キャッシュしますか?(このクエリはコンパイルに非常にコストがかかります。)

1
datetime2(0)vs datetime2(2)
ドキュメントdatetime2(Transact-SQL)によると: ストレージサイズは 、精度が3未満の場合は6バイトです。 精度3および4の 場合は7バイトです。他のすべての精度には8バイトが必要です。 大きさはdatetime2(0)、datetime2(1)、datetime2(2)ストレージの同量(6バイト)を使用します。 datetime2(2)サイズコストを追加せずに精度の利点を享受することもできると言って正しいでしょうか? ご注意ください: この列はPKでインデックス付けされ、複合クラスター化インデックスを形成します(テーブルパーティションに使用) ミリ秒は気にしません うdatetime2(0)where句で使用された場合、より多くのCPU効率的であること、またはインデックスを通じて追求するとき? これは巨大なテーブルなので、最小の最適化で大きな違いが生じます。

1
私の同僚はどのようにして自分のスキーマを手に入れましたか?
次のストアドプロシージャがあります。 テーブルが存在するかどうかを確認し、存在する場合は削除します。 そのテーブルを再度作成します 次に、そのテーブルに約30個のクエリを入力します。 私(DBオーナー)がこのプロシージャを実行すると、すべてが意図したとおりに機能します。Active Directoryのロールを介してこのデータベースに対するDROP / CREATE権限を持っている同僚がそうすると、いくつかの問題が発生します。私の心を揺さぶるものはこれです: テーブルの作成ではdbo、名前の前に明示的に指定されたスキーマがありませんでした。これにより、tableというdomain\cowork_id.table_name_hereテーブルが作成されました。彼の個人スキーマで作成されたテーブルに加えて、彼はデータベースにそのスキーマも持っています(プロシージャを実行する前は存在していませんでした)。 どうした?SQL Server dboが指定されていない場合ではなく、ユーザーのスキーマでテーブルを作成するのはなぜですか?

1
流出をtempdbにソートしますが、推定行は実際の行と等しくなります
最大メモリを25GBに設定したSQL Server 2016 SP2では、1分間に約80回実行されるクエリがあります。クエリにより、約4000ページがtempdbに流出します。これにより、tempdbのディスクで大量のIOが発生します。 あなたが見てとるときにクエリプラン(簡体クエリを)あなたは、推定行数は実際の行数と同じであるが、依然として発生こぼれることがわかります。したがって、古い統計が問題の原因になることはありません。 私はいくつかのテストを行い、次のクエリをTempdbにスピルしました。 select id --uniqueidentifier from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) しかし、別の列を選択した場合、流出は発生しません。 select startdate --datetime from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) そこで、id列のサイズを「拡大」しようとしました。 select CONVERT(nvarchar(512),id) from SortProblem where [status] ='A' order by SequenceNumber asc option …

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