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

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

2
インデックスの数が多すぎる/いついるかを知る方法は?
Microsoft SQL Server Profilerを時々実行すると、作成する新しいインデックスと統計情報がたくさんあります(「... 97%の改善が見込まれる...」)。 私の理解から、追加されたすべてのインデックスは、SQL SELECTクエリを高速化できますが、インデックスを調整する必要があるため、クエリも低速化UPDATEできINSERTます。 私が疑問に思うのは、いつ「多すぎる」インデックス/統計がありますか? たぶんこれに関する明確な答えはありませんが、いくつかの経験則があります。

6
複数の列でEXISTSを効率的にチェックする方法は?
これは私が定期的に出くわす問題であり、まだ良い解決策を見つけていません。 次のテーブル構造を想定 CREATE TABLE T ( A INT PRIMARY KEY, B CHAR(1000) NULL, C CHAR(1000) NULL ) 及び要件はNULL可能列のいずれかかどうかを決定することであるBまたはC実際に含むNULL値(及び場合どのように一方(S))。 また、テーブルに数百万行が含まれていると仮定します(このクラスのクエリのより一般的なソリューションに興味があるため、覗くことができる列統計はありません)。 これにアプローチする方法はいくつか考えられますが、すべてに弱点があります。 2つの別個のEXISTSステートメント。これには、a NULLが見つかるとすぐにクエリがスキャンを停止できるという利点があります。ただし、実際に両方の列にが含まれていないNULL場合、2回の完全スキャンが実行されます。 単一の集計クエリ SELECT MAX(CASE WHEN B IS NULL THEN 1 ELSE 0 END) AS B, MAX(CASE WHEN C IS NULL THEN 1 ELSE 0 END) AS C FROM T …

5
古いデータのアーカイブ
データベースが大きくなりすぎているため、現在いくつかのパフォーマンスの問題に直面しています。過去10年間のデータが保存されており、2年以上前のデータを新しいデータと同じテーブルに保存する必要がある理由はわかりません。 現在、私はデータベースの管理にあまり深い経験がないので、古いデータをアーカイブする最良の方法を探しています。 情報 データベースには合計で約310'000'000レコードがあります。 データベースには、ハードディスクに250 GBが必要です。 サーバーのバージョンは、互換性レベルがSQL Server 2005(90)のSQL Server 2008ですが、SQL Server 2012へのアップグレードを近日中に計画しています 私は2つの可能性について考えました: 新しいデータベース 実動サーバー上のデータベースと同様のデータベースを作成し、すべての古いデータを新しいデータベースに挿入します。 欠点:リンクサーバーは環境で許可されていないため、必要に応じて古いデータを結合することは困難です。 履歴スキーマ 本番データベースと同じテーブルで新しいスキーマfe [hist]を作成します。新しいスキーマのこれらの新しいテーブルにすべての古いデータを挿入します。 利点:将来的に古いデータが必要になる場合、簡単に参加できます 解決策の1つを他よりも優先しますか? どうして? より良い可能性はありますか? このタスクを簡単に実行できる既存のツールはありますか? 他に考えはありますか? 前もって感謝します 編集 追加の質問: 新しく作成されたアーカイブテーブルもプライマリ/外部キーを必要としますか? または、キー/制約のない列だけが必要ですか?

7
値が最後に変更された時間を見つけようとする
ID、値、および日付を持つテーブルがあります。この表には多くのID、値、および日付があります。 レコードはこのテーブルに定期的に挿入されます。IDは常に同じままですが、ときどき値が変更されます。 IDと値が変更された最新の時間を提供するクエリを作成するにはどうすればよいですか?注:値は常に増加します。 このサンプルデータから: Create Table Taco ( Taco_ID int, Taco_value int, Taco_date datetime) Insert INTO Taco Values (1, 1, '2012-07-01 00:00:01'), (1, 1, '2012-07-01 00:00:02'), (1, 1, '2012-07-01 00:00:03'), (1, 1, '2012-07-01 00:00:04'), (1, 2, '2012-07-01 00:00:05'), (1, 2, '2012-07-01 00:00:06'), (1, 2, '2012-07-01 00:00:07'), (1, 2, '2012-07-01 00:00:08') …

3
デッドロックをシミュレートするコード
アプリケーションをテストしています。データベースサイトのデッドロックを安定してシミュレートするコードが必要です(可能であればSQLスクリプト)。 ありがとうございました。 追加: 1つのテーブルのみが関与するデッドロックを再現する

2
サブクエリが行の推定値を1に減らすのはなぜですか?
次の不自然な単純なクエリを検討してください。 SELECT ID , CASE WHEN ID <> 0 THEN (SELECT TOP 1 ID FROM X_OTHER_TABLE) ELSE (SELECT TOP 1 ID FROM X_OTHER_TABLE_2) END AS ID2 FROM X_HEAP; このクエリの最終的な行の推定値は、X_HEAPテーブル内の行数に等しいと予想されます。サブクエリで何をしていても、行を除外できないため、行の推定値は重要ではありません。ただし、SQL Server 2016では、サブクエリが原因で行の推定値が1に減少しています。 なぜこれが起こるのですか?私はそれについて何ができますか? 適切な構文でこの問題を再現するのは非常に簡単です。これを実行するテーブル定義のセットを次に示します。 CREATE TABLE dbo.X_HEAP (ID INT NOT NULL) CREATE TABLE dbo.X_OTHER_TABLE (ID INT NOT NULL); CREATE TABLE dbo.X_OTHER_TABLE_2 …

8
誰もがsaログインを使用できるようにするのが悪い習慣なのはなぜですか?
MicrosoftでさえSQL Server認証モードの使用を推奨していませんが、アプリケーションではそれが必要です。 ユーザーにsaログインを直接使用させないで、代わりにWindows認証を使用し、それらのアカウント(またはアカウントグループ)のsysadmin特権を許可することがベストプラクティスであることを読みました。 それは本質的に同じものではありませんか?長所/短所は何ですか? ベストプラクティスは、SQL Serverインスタンスのセキュリティをどのように向上させますか? これは本番インスタンスのみに適用されますか、それとも社内開発インスタンスにも適用されますか?

1
ファイルパスが間違っているため、バックアップ時にSQL Server 2017がクラッシュする
データベースを復元しようとしていて、SQL Serverがクラッシュし続けました。SSMSで、ネットワークトランスポートエラーが発生したというメッセージが表示されます(接続がクラッシュしてクラッシュしました)。ログを確認したところ、SQL Serverが予期せず閉じられただけです。次に、サービスを再起動する必要があります。 GUIが実行しようとしているスクリプトに問題を絞り込みました。問題は、ログの末尾のバックアップを取るときに、バックアップファイルへのパスが間違っていることです。そのはずD:\mapbenefits\... BACKUP LOG [mapbenefits] TO DISK = N'D:mapbenefits_LogBackup_2019-02-21_13-58-24.bak' WITH NOFORMAT, NOINIT, NAME = N'mapbenefits_LogBackup_2019-02-21_13-58-24', NOSKIP, NOREWIND, NOUNLOAD, NORECOVERY , STATS = 5 2つの質問があります。 このパスを修正するにはどうすればよいですか?サーバー設定にアクセスしようとしましたが、バックアップパスはD:スラッシュなしです。スラッシュを追加すると、GUIによって削除されます。これはSSMS v17.9.1です。私は選ぶことができD:\mapbenefits\、それはうまくいきますが、私は欲しいですD:\DATABASE\... これはバグですか?パスが正しく入力されていないという理由だけで、SQLサーバーがクラッシュする必要がありますか?ファイルパスを修正したら、問題はありません。ファイルパスを改造するだけでいつでも再現できます。 バージョンを確認するクエリを実行するとCU13が取得されますが、設定に入るとバージョン14.0.1000.169が表示されます。 これはバグのようで、再現可能であるため、ここに投稿しました:https : //feedback.azure.com/forums/908035-sql-server/suggestions/36920542-incorrect-filepath-with-backup-log-command-原因

4
疑問符の付いた青いアイコン-それはどういう意味ですか?
SQL Serverインスタンスはアクセス可能で、問題ないようです。 Microsoft SQL Server 2016(SP1-CU2)(KB4013106)-13.0.4422.0(X64) 2017年3月6日14:18:16 Copyright(c)Windows Server 2012 R2 Standard 6.3(ビルド9600上のMicrosoft Corporation Enterprise Edition(64ビット) :)(ハイパーバイザー) しかし、白い疑問符はどういう意味ですか? これらのアイコンは、更新しても消えません。私はSQLサーバー内のシステム管理者であり、外部ではそのボックスの管理者です。 私が気づいたもう一つのことは、下の写真で見ることができます。これらは2つの異なるManagement Studioセッションです。 一番上では、自分としてログインしますDBA and sysadmin。2番目では、Management Studio run as a different userを使用して、レプリケーションに使用するドメインアカウントを使用しますが、そうではありませんsysadmin。 2番目blue iconのサーバーにはこのサーバーと他のサーバーもありますが、私のサーバーは通常の緑色のサーバーです。

1
シーケンス-キャッシュなしvsキャッシュ1
SQL Server 2012+で宣言さSEQUENCEれた使用NO CACHEと宣言された使用の間に違いはありCACHE 1ますか? シーケンス#1: CREATE SEQUENCE dbo.MySeqCache1 AS INT START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999 NO CYCLE CACHE 1; GO シーケンス#2: CREATE SEQUENCE dbo.MySeqNoCache AS INT START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999 NO CYCLE NO CACHE; GO 2つの間に違いはありますか?SQL Server 2012+環境で使用される場合、それらは異なる動作をしますか?

3
統計更新のためのサンプルサイズによる奇妙な動作
SQL Server(2012)の統計情報の更新を使用してサンプリングのしきい値を調査し、いくつかの奇妙な動作に気付きました。基本的に、サンプリングされる行の数は、同じデータセットであっても、状況によって異なるようです。 このクエリを実行します。 --Drop table if exists IF (OBJECT_ID('dbo.Test')) IS NOT NULL DROP TABLE dbo.Test; --Create Table for Testing CREATE TABLE dbo.Test(Id INT IDENTITY(1,1) CONSTRAINT PK_Test PRIMARY KEY CLUSTERED, TextValue VARCHAR(20) NULL); --Insert enough data so we have more than 8Mb (the threshold at which sampling kicks in) INSERT INTO …

3
Management StudioはSQL Server 2016インストールメディアから削除されましたか?
SQL Server 2016 Enterpriseをインストールしようとしましたが、Management Studioがデフォルトでインストールされていないことに気付きました。また、https: //msdn.microsoft.com/en-us/library/mt238290.aspxを指すインストールガイドにSSMSへの別のリンクがあることに気付きました。 この決定の理由は何ですか? 上記のURLには次のことが記載されています。 このSSMSの一般リリースは無料であり、インストールして使用するためにSQL Serverライセンスは必要ありません。 おそらく、これですか?
25 sql-server  ssms 

4
更新すべきではない列の更新を明示的に拒否する必要がありますか?
私は非常に安全な環境で作業することに慣れているため、非常に細かい粒度で権限を設計します。私が通常行うことの1つは、更新されるべきではない列DENYに対する機能を明示的にユーザーに提供するUPDATEことです。 例えば: create table dbo.something ( created_by varchar(50) not null, created_on datetimeoffset not null ); これらの2つの列は、値が設定されたら変更しないでください。したがって、私は明示的にそれらDENYのUPDATE許可をします。 最近、チームミーティング中、開発者は、「何らかの理由で値を更新する必要がある場合」に、フィールドが更新されないことを保証するロジックをデータベース層ではなくアプリケーション層に含めるべきであると指摘しました。私にとっては、典型的な開発者のメンタリティのように聞こえます(私は知っています、私は以前は1人でした!) 私は会社のシニアアーキテクトであり、アプリを機能させるために必要な最小限の特権の原則に常に取り組んできました。すべての許可は定期的に監査されます。 このシナリオのベストプラクティスは何ですか?

1
トランザクションと組み合わせてトリガーする
次の状況があると仮定します。 Table_Aトリガーがオンになっているテーブル(たとえば)がありINSERTます。トリガージョブはtable_B、に挿入された値に基づいていくつかの行を更新しtable_Aます。 さて、テーブルに単純に行を挿入するだけで問題ありませんが、トランザクションを介してデータを挿入する状況についてはどうでしょうか?トリガーは、すべてのトランザクションステートメントが正常に実行されるまで待機しますか、それとも挿入を認識するとすぐに起動しますか?最初の挿入を認識するとすぐにトリガーが起動する場合、最後の行でトランザクションが失敗するとどうなりますか?その状況に何らかのメカニズムがありますか?

2
COUNT句をOVER句とともに使用できますか?
次のクエリのパフォーマンスを改善しようとしています。 UPDATE [#TempTable] SET Received = r.Number FROM [#TempTable] INNER JOIN (SELECT AgentID, RuleID, COUNT(DISTINCT (GroupId)) Number FROM [#TempTable] WHERE Passed = 1 GROUP BY AgentID, RuleID ) r ON r.RuleID = [#TempTable].RuleID AND r.AgentID = [#TempTable].AgentID 現在、私のテストデータでは約1分かかります。このクエリが存在するすべてのストアドプロシージャに対する変更への入力は限られていますが、おそらくこの1つのクエリを変更することができます。または、インデックスを追加します。次のインデックスを追加してみました。 CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed) また、実際にクエリにかかる時間は2倍になりました。NON-CLUSTEREDインデックスでも同じ効果が得られます。 効果なしで次のように書き直してみました。 WITH …

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