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

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

1
トリガーを使用した同期
私は以前の議論と同様の要件を持っています: 単純な銀行スキーマの作成:残高を取引履歴と同期させるにはどうすればよいですか? トランザクションと組み合わせたトリガー 私は2つのテーブルを持っています、[Account].[Balance]そして[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); [Transaction]テーブルに対して挿入、更新、または削除がある場合、に[Account].[Balance]基づいてを更新する必要があり[Amount]ます。 現在、私はこの仕事をするきっかけを持っています: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR EXISTS (select 1 …

3
SQL Serverデータベースミラーリングは死ぬでしょう。今すぐ高可用性を保証するにはどうすればよいですか?
SQL Server のデータベースミラーリング機能はなくなります。 この機能は、Microsoft SQL Serverの将来のバージョンでは削除される予定です。新しい開発作業ではこの機能を使用せず、現在この機能を使用しているアプリケーションの変更を計画してください。代わりにAlwaysOn可用性グループを使用してください。 誰もが知っていますか?高可用性(およびクイックリカバリ)データベースのオプションは何ですか?

3
SELECT句とGROUP BY句の両方のSQL計算フィールド
多くの場合、MS SQL Serverデータベースのクエリで、次のような計算フィールドを作成する必要があります (CASE WHEN A.type = 'Workover' THEN 'Workover' ELSE (CASE WHEN substring(C.category, 2, 1) = 'D' THEN 'Drilling' WHEN substring(C.category, 2, 1) = 'C' THEN 'Completion' WHEN substring(C.category, 2, 1) = 'W' THEN 'Workover' ELSE 'Other' END) END) 次に、この計算フィールド(特に)で結果をグループ化する必要があります。したがって、SELECT句とGROUP BY句の両方で同じ計算を行っています。SQLサーバーは実際にこれらの計算を2回実行していますか、それとも1回だけ実行するのに十分スマートですか?
11 sql-server 

4
SQLサーバーのCPU使用率が高い-クエリが遅い[終了]
この質問が今後の訪問者を助けることはほとんどありません。これは、地理的に狭い地域、特定の瞬間、またはインターネットの世界中のオーディエンスには一般的に適用できない非常に狭い状況にのみ関連しています。この質問をより広く適用するためのヘルプについては、ヘルプセンターにアクセスしてください。 6年前休業。 MS SQL Serverは、CPUパワーの約95%を使用しています。 サーバー(ハードウェア)の再起動後、またはSQLサービスの再起動後、使用率は0%で、1〜3日かけてゆっくりと増加します。使用量によって異なります。 80%を超えると、すべてのクエリが非常に遅くなります。 私たちのウェブサイトは多くの大きなクエリを扱っているので、それらのいくつかは45-60秒かかります。再起動後(CPU使用率が80%未満)、同じクエリで11〜20秒かかります。 どうすれば修正できますか?アフィニティマスクでCPU使用率を調整できることをオンラインで読みましたが、アフィニティ設定が無効になっています。変更できません。これはプロセッサが1つしかないためですか? クエリ自体にはたくさんのトリックがありますが、私たちのWebサイトとサービスは非常に大きく、変更するのは多すぎます。 それらのほとんどはすでにかなり最適化されています。 2秒しかかかりませんが、SQLサービスを再開し続けることができません。ユーザーが電話をかけてメッセージを録音できるアラームサービスがあるため、選択したグループが呼び出され、録音されたメッセージが聞こえます。 このシステムは何百人もの捜索救助チームによって使用されており、SQLサービスがアラーム中に再起動した場合、システムは終了し、呼び出した人には通知されません。 あちこち検索してみましたが、「アフィニティマスク」以外は変更できません。 現在のクエリを終了せずに、CPUキャッシュをクリアする方法が必要です... SQL: Microsoft SQL Server 11.0.2100.60 OS: Windows Server 2012 x64 Processor: 2.30 GHz RAM: 4.00 GB

2
クラスター化インデックスを無効にすると、テーブルにアクセスできなくなるのはなぜですか?
インデックスが無効になると、定義はシステムカタログに残りますが、使用されなくなります。SQL Serverはインデックスを維持せず(テーブルのデータが変更されるため)、インデックスを使用してクエリを満たすことはできません。場合はクラスタ化インデックスが無効になっている、テーブル全体がアクセスできなくなります。 Bツリーを破棄してテーブルから直接データにアクセスできないのはなぜですか?(おそらくテーブルを行ごとにスキャンすることにより)データに完全にアクセス不能にするよりも適切でしょうか? それは純粋に理論的な質問です-私は実際にはそうしません。それはシナリオでも、やることでもありません。なぜそうなるのかを知りたいのですが、内部的な問題だと考えてください。

3
新しいサーバーでのパフォーマンスの低下
私たちは専用サーバー(シングルクアッドコア、6 GB RAM)を使用しており、新しい専用サーバー(2xヘキサコア、32 GB RAM)に移行しています。どちらもWindows Server 2008、SQL Server 2008です。新しいサーバーのパフォーマンスは、古い低速サーバーよりもわずかに劣ります。 テストでは、ASP.NETアプリケーションの実行速度が10〜20%遅くなります。STATISTICS IOおよびSTATISTICS TIMEを使用して個々の負荷の高いクエリを実行すると、新しいサーバーでの経過時間が10〜20%長くなります。SQLクエリプロファイルは、高価なクエリでのより高いCPU使用率を示します。 新しいサーバーのタスクマネージャーは、sqlserver.exeが22 GBのRAMを消費していることを示していますが、CPU値は常に非常に低いままです。 私はすべての統計を更新し、インデックスを再構築または再編成しました。実行したテストの量を考えると、この時点で実行プランは新しいサーバーに保存されているはずです。欠落しているインデックスがある場合(私はないと思います)、新旧のサーバーに同じように影響します。新しいものは古いものと同じデータの復元されたバックアップを持っています。 新しいサーバーでのパフォーマンスはもっと良くなると思っていましたが、負荷の方が心配です。負荷がかかった状態でも古いサーバーのパフォーマンスが向上している場合、この少し新しくなった新しいサーバーがその負荷をかけなければならない場合はどうなりますか? ここで他に何が欠けているでしょうか? 編集:MAXDOPを6に設定。 古いサーバーのOS、データベース、tempdbは同じ物理ドライブ(RAID 10)上にあります。合計4つの15k 3 Gb / s 3.5インチSAS。新しいサーバーには3つのドライブセットがあります。RAID1上のOS、RAID 10上のデータベース、RAID 5上のtempdb。合計9つの15K 6 Gb / s 2.5インチSAS。 古いサーバーには、1 x Intel Xeon E5620 2.40 GHz Quad-Core 8スレッド(w H / T)があります。新しいサーバーには、2つのIntel Xeon E5-2640 2.5 GHz 6コア12スレッド(w H …

2
LATCH_EXリソースMETADATA_SEQUENCE_GENERATORで待機
インベントリレポートを生成するプロセスがあります。クライアント側では、プロセスは構成可能な数のワーカースレッドを分割して、多数(潜在的に数千、通常は数十)のうちの1つのストアに対応するレポートのデータのチャンクを構築します。各ワーカースレッドは、ストアドプロシージャを実行するWebサービスを呼び出します。 各チャンクを処理するためのデータベースプロセスは、一連のデータを#Temporaryテーブルに収集します。各処理チャンクの最後に、データはtempdbの永続テーブルに書き込まれます。最後に、プロセスの最後に、クライアント側の1つのスレッドが永続的なtempdbテーブルにすべてのデータを要求します。 このレポートを実行するユーザーが多いほど、速度は低下します。データベース内のアクティビティを分析しました。ある時点で、プロセスのある時点で35の個別のリクエストがすべてブロックされているのがわかりました。これらのすべてのSPIDはLATCH_EX、リソースで約50ミリ秒待機していましたMETADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)。1つのSPIDにこのリソースがあり、他のすべてのSPIDがブロックしています。ウェブ検索でこの待機リソースについて何も見つかりませんでした。 使用しているtempdbのテーブルにはIDENTITY(1,1)列があります。これらのSPIDはIDENTITY列を待機していますか?ブロッキングを削減または排除するためにどのような方法を使用できますか? サーバーはクラスターの一部です。サーバーは64ビットのWindows 2008 R2 Enterpriseで64ビットのSQL Server 2012 Standard Edition SP1を実行しています。サーバーには64 GBのRAMと48のプロセッサがありますが、データベースは標準エディションであるため、16しか使用できません。 (このすべてのデータを保持するためにtempdbの永続テーブルを使用する設計にわくわくしないことに注意してください。これを変更することは、技術的および政治的な興味深い課題になりますが、私は提案を受け入れます。) 2013年4月23日更新 マイクロソフトでサポートケースをオープンしました。詳細については、この質問を更新していきます。 2013年5月10日更新 SQL Serverのサポートエンジニアは、待機がIDENTITY列によって引き起こされたことに同意しました。IDENTITYを削除すると、待機がなくなりました。SQL 2008 R2では問題を再現できませんでした。SQL 2012でのみ発生しました。

2
スキーマの変更は可用性グループを「破壊」しますか、それとも透過的に処理されますか?
私の組織はSQL Server 2012可用性グループの採用を計画しており、それがアプリケーションのアップグレードプロセスに与える影響(ある場合)を理解しようとしています。 私たちは8週間のサイクルでアプリケーションの更新をリリースします。どのリリースにもスキーマの変更やデータの移行が含まれる可能性があります。 私が理解しようとしているのは、HA / DRソリューションがスキーマの変更を透過的に処理する(新しい列、インデックスがセカンダリに追加される)かどうか、または各インスタンスでスキーマを作成してからAlways Onをオンに戻すために手動で介入する必要があるかどうかです。 私が想定しているデータ移行の部分は透過的に処理されますが、それも確認したいと思います。 また、可用性グループの構成に基づいてこれらの動作に違いはなく、誤っている可能性もないと全面的に想定しています。私にお知らせください。 一言で言えば; アプリケーションの特定のリリースでは、非常に大きなテーブル(数千から数億のレコード)に列を追加することで、テーブルを変更できます。一部の列は「完全に新しい」ため、Enterprise Onlineのスキーマ変更機能を利用できます。他の列は既存の列のリファクタリングである可能性があり(FullNameはFirstNameとLastNameに分割されます)、これらのフィールドに入力するために、テーブルの各行に対して移行が実行されます。これらの動作のいずれかでは、DBAがAlwaysOn構成を変更する必要がありますか、それともデフォルトで処理され、すべてのセカンダリがDDLおよびDMLステートメントを「無料」で取得しますか? あなたが提供できる明確さをありがとう。

2
付与されているにもかかわらず、「オブジェクトに対するSELECT権限が拒否されました」を受け取る
私はプログラマーであり、dbaではありません...私は危険なだけのことを知っています。 私は、データベースのdb_ownerであるレガシーユーザーを持つデータベースを継承しました。ビジネス上の理由から、既存のテーブル、スキーマなどに対するこのユーザーの権限を調整することはできませんが、いくつかの新しいテーブルが作成されており、このユーザーにそれらのSELECTアクセスのみを許可します。 これらのテーブルに対するこのユーザーの権限が設定されているため、GRANTに設定されているSELECTを除いてすべてが拒否されます。 ただし、このユーザー(dbadmin)がこれらのテーブル(AccountingAudit)の1つでSELECTを実行しようとすると、次のエラーが発生します。 The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. このSQLを実行して、このテーブル/ユーザーに設定されている権限を確認しました。 select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) as grantor, permission_name, state_desc from sys.database_permissions そして、これは私が返すものです: AccountingAudit dbadmin dbo ALTER DENY AccountingAudit dbadmin dbo CONTROL DENY AccountingAudit dbadmin dbo DELETE DENY AccountingAudit dbadmin …

3
.bakがバックアップであるデータベースよりもはるかに小さいのはなぜですか?
SQL Serverデータベースのバックアップを取ったところです。MDFファイルとLDFファイルの合計は約29 GBですが、.bakファイルはわずか23 GBで、約20%小さくなりました。 データセットの1つのバージョンが同じデータを含む別のバージョンよりも小さい場合の最初の推測はデータ圧縮ですが、圧縮は通常、特に高度に順序付けされたデータ(データベーステーブルなど)の場合、20%よりはるかに優れた圧縮率をもたらします。 )また、圧縮されたデータを簡単にさらに圧縮することはできませんが、.bakファイルは圧縮できることを知っています。 したがって、データが圧縮されておらず、何も破棄されていない場合(バックアップを作成することの目的は、後でデータを同じ状態に復元できるためです)、その20%が考慮されていません。

3
SQL Server:システムテーブルのみのファイルグループ?
私たちの企業標準の1つは、ユーザーテーブル/インデックス用に個別のファイルグループ/ファイルを用意することです。これはデフォルトとして設定されているため、CREATE TABLEステートメントを修飾する必要はありません。 だからこんな感じ fileid 1 =システムテーブル、MDF fileid 2 = t-log = LDF fileid 3 =ユーザーのもの= NDF なぜこれが義務付けられたのか、元の正当性を理解するのを手伝ってくれる人はいますか? 私はそれがブードゥー教だと思う状態できれいに来ます。私は間違っていますか...? 編集:インデックス/パーティション/アーカイブを分離するためにファイルグループを使用する方法と、断片的に復元する方法を知っています。この質問は、システムテーブル専用の同じボリューム上の別のファイルグループの使用についてです。

1
統計でヒストグラムのステップ数はどのように決定されますか
SQL Serverの統計でヒストグラムのステップ数はどのように決定されますか? キー列に200以上の異なる値があるにもかかわらず、なぜ200ステップに制限されているのですか?決め手はありますか? デモ スキーマ定義 CREATE TABLE histogram_step ( id INT IDENTITY(1, 1), name VARCHAR(50), CONSTRAINT pk_histogram_step PRIMARY KEY (id) ) テーブルに100レコードを挿入する INSERT INTO histogram_step (name) SELECT TOP 100 name FROM sys.syscolumns 統計の更新と確認 UPDATE STATISTICS histogram_step WITH fullscan DBCC show_statistics('histogram_step', pk_histogram_step) ヒストグラムの手順: +--------------+------------+---------+---------------------+----------------+ | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …

2
2,500万行以上のクエリの最適化
私はMS SQLを使用しており、同じテーブルに対して異なる基準でいくつかのクエリを実行する必要があります。最初は元のテーブルで各クエリを実行しましたが、それらはすべて何らかのフィルタリング(つまり、日付、ステータス)を共有しています。これには長い時間がかかりました(約2分)。 データ行に重複があり、すべてのインデックスがクラスタリングされていません。私の基準では4列のみに関心があり、結果はすべてのクエリについてカウントのみを出力するはずです。 :列は、必要に応じてTABLE、FIELD、AFTER、DATE、とのそれぞれにインデックスがあるDATEとはTABLE。 必要なフィールドのみを含む一時テーブルを作成した後、1:40分になりましたが、それでも非常に悪いです。 CREATE TABLE #TEMP ( TABLE VARCHAR(30) NULL, FIELD VARCHAR(30) NULL, AFTER VARCHAR(1000) NULL, DATE DATETIME, SORT_ID INT IDENTITY(1,1) ) CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID) INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE) SELECT TABLE, FIELD, AFTER, DATE FROM mytbl WITH (NOLOCK) WHERE TABLE = 'OTB' …

3
日付を整数(数値)として格納することの利点
質問1 日付が整数(実際の数値(8,0))として格納されているシステムを使用していますが、他のシステムもこのスレッドにciscoなどのintとして日付を格納していることに気付きました。例 20120101 -- 01 Jan 2012 数値日付システムを維持し、SQL日時を使用しないことの利点はありますか? 質問2 現在、2つの日付の間の顧客を見つけるために、数値の日付をループ処理しています。startおよびenddateが2か月にわたる場合、60だけではなく数千のレコードを取得します。例: create table #temp1(day int,capacity int) /* just a temp table */ declare @start int declare @end int set @start=20111201 set @end = 20120131 while (@start <= @end) Begin insert into #temp1 /* I am storing things in #temp table so …

2
SSMSがサーバーのファイルシステムを参照できないようにする
私の管理下でMS SQLサーバー2017を共有するユーザーが何人かいます。彼らは、そのサーバー上の他のユーザーとそのデータを見てはいけません(または気づいてさえいません)。各ユーザーは自分のデータベースを持っています。彼らは自分のデータベースで好きなことをすることができます。 SQL ServerのPartial Containment機能を使用して、ユーザーを適切にロックしています。ログインはデータベース内に作成されます。この方法では他のユーザーアカウントやデータベースが表示されないため、これはうまく機能します。DBログインは、このコマンドで作成したデータベースロールに追加されます。 USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole 私は新たにdbログインアカウントを作成し、それを上記の役割にのみ追加します。ユーザーには他の権限はありません(私が知っていることです)。 残っている唯一の問題は、SSMSがサーバーのファイルシステムを参照できることです。データベースを右クリックしてを選択した場合は、ファイルをTasks -> Restore -> Database選択Device: -> [...]して追加します。これにより、SSMSがサーバーのファイルシステムを参照できるようになります。これを拒否します。ユーザーは実際にDBを復元することはできませんが、ファイルシステムを参照することはできます。 ここでこの質問は SSMSは、ストアドプロシージャを使用していることを示唆しているxp_fixeddrives、xp_dirtreeとxp_fileexist。ただし、これらのストアドプロシージャは、そのグループの権限を持つユーザーとして実行されると、空の結果を返します。これは、ユーザーがsysadminロールのメンバーでない場合の動作であると読みました。私は明示的にEXECUTEをdbroleに対して拒否しているため、すでに少し混乱していますが、ユーザーは引き続きストアドプロシージャを実行できます。しかし、それでも、SSMSを介してファイルシステムを参照すると、空ではありません。 SSMSはどこからファイルシステム情報を取得し、どのようにしてこれを防ぐことができますか? 編集:私はまた、SSMSがすべてのデータベースのサーバーに存在するすべてのDBバックアップのリストを取得できることにも気づきました。繰り返しますが、どのようにしてこの情報を取得し、どのようにしてそれを防ぐことができるかは知りません。

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