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

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

2
WHERE句が「含まれる」列の恩恵を受けるのはなぜですか?
この回答によれば、制限に使用される列にインデックスが構築されない限り、クエリはインデックスの恩恵を受けません。 私にはこの定義があります: CREATE TABLE [dbo].[JobItems] ( [ItemId] UNIQUEIDENTIFIER NOT NULL, [ItemState] INT NOT NULL, [ItemPriority] INT NOT NULL, [CreationTime] DATETIME NULL DEFAULT GETUTCDATE(), [LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(), -- other columns ); CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex] ON [dbo].[JobItems]([ItemId] ASC); GO CREATE INDEX [GetItemToProcessIndex] ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime]) INCLUDE (LastAccessTime); …

4
異なるテーブルのデータを1つに集約するのは悪い習慣ですか?
バックグラウンド 私は、大規模なヘルスレコードDBについて多くの大きなレポートを作成し、一般的に管理しています(SP、機能、ジョブなどを作成します)。元のスキーマとそれを使用するソフトウェアは別のベンダーのものであるため、構造についてはあまり変更できません。ラボ、手順、ワクチンなど、追跡を必要とする多くのレコードがあり、それらは多数のテーブルに散らばっています。その多くは肥大化しており、インデックス付けが不十分です(これを多少修正できました)。 問題 問題は、DBをほとんど制御できないため、また特定の更新やパッチから変更される可能性があるため、これらのレポートの作成と保守が困難で面倒になることです(特に重複が多い場合)。必要なのは1つのパッチだけで、多数のレポートの大部分を書き直しています。さらに、結合、ネスト、選択、適用が積み重なると、クエリはすぐに難読化され、遅くなります。 私の「解決策」 私の計画は、これらすべてのレコードを1つの「キャッチオール」テーブルに書き込み、元のテーブルにトリガーを書き込んで、この集約テーブルのレコードを維持することでした。もちろん、更新後にトリガーが完全であることを確認する必要がありますが、保守性の観点から、データを参照するだけの方がはるかに簡単です。 テーブルは薄くて長く、必要なデータのみを保存します。次のようなものです。 CREATE TABLE dbo.HCM_Event_Log ( id INT IDENTITY, type_id INT NULL, orig_id VARCHAR(36) NULL, patient_id UNIQUEIDENTIFIER NOT NULL, visit_id UNIQUEIDENTIFIER NULL, lookup_id VARCHAR(50) NULL, status VARCHAR(15) NULL, ordered_datetime DATETIME NULL, completed_datetime DATETIME NULL, CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id) ) 次に、type_idやアイテムのグループ化などのさまざまなリレーショナルテーブルを作成します。 これらのテーブルのいくつかはかなり書き込まれているので、私はこの考えを二番目に推測し始めています。私が書いているSPとレポートはデータも多く参照します。したがって、このテーブルが大量のI / Oを伴うレコードのロックとパフォーマンスの悪夢になることを心配しています。 …

1
ドライブのルートにSQL Serverをインストールするのが悪い習慣なのはなぜですか
たとえばD:\、SQL Serverをドライブのルートにインストールすると、サードパーティのソフトウェアからデータベースデプロイヤを実行するとエラーが発生します。 しかし、SQL ServerインスタンスをD:\SQL\(ドライブ内のフォルダーに移動する)に移動すると、インストールは完全に機能します。 私の質問は、データベースデプロイヤに関するものではありませんが、SQLがドライブのルートにインストールされることで問題が発生する理由に関するものです。これは悪い習慣ですか?ドライブのルートにSQL Serverをインストールしないのはなぜですか?

2
24時間年中無休のマルチユーザー環境でのSQL Server 2014スキーマの変更
24時間365日利用可能なデータベースを実行するために、SQL Server 2014 Enterpriseがインストールされています。私たちのデータベースは十分に大きい(200GB +)。また、新しいデータを読み取り、更新、または挿入するためにデータベースに毎分アクセスする多くのサービスがあります。クライアントに「ホット」再デプロイ機能を提供し、日々の更新(.netおよびスキーマの更新)をクライアントに対して透過的にしたいと考えています。アプリのバイナリを更新するロードバランサーを備えたクラスターに基づいたソリューションを見つけましたが、データベースの更新展開プロセスとこの問題を解決するためのベストプラクティスについては、まだいくつかの誤解があります。 スキーマの変更については、1つのサーバーを停止し、スキーマの変更を適用し、それを再起動してから、同じ変更を2番目のインスタンスに適用します。SQL Serverツールで実現できますか?これは一般的なアプローチですか?サーバーのバックアップ後のデータの同期方法 または、私は完全に間違った方向に考えていますか?より良い解決策はありますか? 一般的なスキーマの変更:列の追加/削除、ストアドプロシージャの追加/削除

2
DBプロジェクトとAzureサーバーを比較するときにSSDTスキーマ比較が失敗する
エンタープライズDBを構築したSQLデータベースプロジェクトがあります。SSDTのスキーマ比較ツールを使用して、内部およびAWSがホストするSQLサーバーに数回デプロイしました。 SQL Ent 2012 sp2を実行しているAzure Hosted Win 2012 Serverに投稿するときの問題。「比較が完了しました。違いは検出されませんでした」と戻ってきます。 Enterprise Managerを開き、スキーマをSQLプロジェクトと比較して、違いがあることがわかるので、これが間違っていることはわかっています。 2014年のリリースでこのツールがどのように機能しなくなったかについて話している記事をいくつか見つけましたが、それらはバージョンの違いにあります。 [はい、Googleでこれを行いました。私がそうするのを忘れることで悪名高いので、述べます。] https://www.google.com/webhp?ie=utf-8&oe=utf-8#q=ssdt+data+compare+fail+to+detect+difference&start=10 私がチェックした他のことには、DBアカウントに無制限のアクセス権があることを確認することが含まれます。管理コンソールに接続できます。ローカルプログラムに接続できます。 問題があったことの最後の確認: 番号1の単一の戻り値を持つSPを作成しました。 テストのために何も返されない可能性があります。 SPを作成した後、すべてのインスタンスでスキーマ比較を実行しましたが、Azureサーバーを除くすべてのインスタンスで差異が示されました。 更新 これはサーバーで明示的に行われていることを確認しました。2台のコンピューター上の2人のユーザーがまったく同じ問題を抱えているからです。

1
最初に1つのインデックスを検索し、次に別のインデックスを検索するようにクエリを最適化する方法
衛星データからの2つの地球測定値セットがあり、それぞれに時間フィールド(平均ユリウス日付のmjd)と地理的位置(GeoPoint、空間)があり、2つのセット間の一致が時間のしきい値に一致するように探しています3時間(または.125日)およびそれらの距離は互いに200 km以内です。 テーブルと空間テーブルの両方のmjdフィールドにインデックスを作成しました。 時間の制約に参加するだけで、データベースは8秒で100,000回の一致を計算し、その時間内のすべての100,000回の一致の距離を計算します。クエリは次のようになります。 select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) ) 実行された計画は次のとおりです。 並べ替えると、9つの距離が200km未満であったため、一致します。問題は、距離制約を追加して代わりにこれを実行すると、 select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on …

2
PIVOTクエリのヘルプ
私は以下の構造を持つテーブルを持っています: CREATE TABLE [dbo].[AUDIT_SCHEMA_VERSION]( [SCHEMA_VER_MAJOR] [int] NOT NULL, [SCHEMA_VER_MINOR] [int] NOT NULL, [SCHEMA_VER_SUB] [int] NOT NULL, [SCHEMA_VER_DATE] [datetime] NOT NULL, [SCHEMA_VER_REMARK] [varchar](250) NULL ); いくつかのサンプルデータ(sqlfiddleに問題があるようです。 INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,7,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored …

2
SQL Server 2014(Windows 2012R2)でのCLRのクラッシュ
列内の文字列に対してRegEX関数を実行するこの小さなCLRがあります。 Windows Server 2012R2上のSQL Server 2014(12.0.2000)で実行すると、プロセスがクラッシュします メッセージ0、レベル11、状態0、行0現在のコマンドで重大なエラーが発生しました。結果があれば、破棄する必要があります。 スタックダンプを提供します select count (*) from table where (CLRREGEX,'Regex') しかし、私がするとき select * from table where (CLRREGEX,'Regex') 行を返します。 Windows 8.1で実行されている同じSQL Serverビルドで完全に動作します。 何か案は? -編集それはできる限り簡単です using System; using System.Collections.Generic; using System.Text; using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean using System.Text.RegularExpressions; //Match, Regex using Microsoft.SqlServer.Server; //SqlFunctionAttribute public partial class UserDefinedFunctions …

1
統計は最新ですが、推定値が間違っています
するとdbcc show_statistics ('Reports_Documents', PK_Reports_Documents)、レポートID 18698に対して次の結果が得られます。 このクエリの場合: SELECT * FROM Reports_Documents WHERE ReportID = 18698 option (recompile) クラスター化インデックスPK_Reports_Documentsを期待どおりにシークするクエリプランを取得します。 しかし、私を困惑させるのは、推定行数の誤った値です: よると、この: サンプルクエリのWHERE句の値がヒストグラムのRANGE_HI_KEY値と等しい場合、SQL ServerはヒストグラムのEQ_ROWS列を使用して、等しい行の数を決定します これは私が期待する方法でもありますが、実際にはそうではないようです。またRANGE_HI_KEY、提供されたヒストグラムに存在する他のいくつかの値を試してみてshow_statistics、同じことを経験しました。私の場合、この問題により、一部のクエリで非常に最適でない実行プランが使用され、実行時間が数分になるのに対し、クエリヒントで1秒で実行できるように思われます。 全体として:EQ_ROWS推定行数にヒストグラムが使用されていない理由と、誤った推定値はどこから来たのかを誰かが説明できますか? もう少し(おそらく役立つ)情報: 統計の自動作成はオンであり、すべての統計は最新です。 クエリされるテーブルには、約8000万行があります。 PK_Reports_Documentsなる組み合わせPKでありReportID INT、およびDocumentID CHAR(8) クエリは合計5つの異なる統計オブジェクトをロードしているように見えますが、すべてのオブジェクトにReportIDはテーブルの+他の列が含まれています。それらはすべて新しく更新されました。RANGE_HI_KEY以下の表にあるのは、ヒストグラムの上限の列値です。 +-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+ | name | stats_id | auto_created | user_created | Leading column Type | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …

1
SQL ServerサービスアカウントWindowsの特権と権利
私の質問は、SQL Serverプロセスごとに新しいドメインユーザーアカウントを作成する場合、各アカウントにどのようなアクセス許可を設定する必要があるかということです。または、SQL構成マネージャーが実際にこれを処理し、予期しない問題が発生しましたか? Microsoft SQL Serverをセットアップする必要が頻繁にあり、サービスを実行するアカウントの構成に関するアドバイスを誰かが提供できるかどうか疑問に思いました。IMOは、Microsoftによって漠然と文書化されていますが、彼らはあなたに正しい方向を示していますが、具体的な例を見つけることはできませんでした。 これまで見てきたことを要約すると: 単純な展開\開発環境では、インストーラーが使用する仮想アカウントのデフォルトを使用してもかまいません。 NT SERVICE\MSSQLSERVER SYSTEMアカウントの使用は避けてください。これは安全ではありません。 実稼働環境およびドメイン環境では、管理されたサービスアカウントを使用するか、サービスごとにドメインユーザーアカウント(管理者ではない)を作成することをお勧めします。伝えられるところでは、インストール時にドメインアカウントを使用すると、インストーラーが必要な権限を設定します。 既存のインストールのサービスアカウントを仮想アカウントからドメインアカウントに変更する場合、SQL Server構成マネージャーを使用して新しいサービスアカウントを設定することをお勧めします。これにより、必要な権限が設定されます。 既存のインストールのサービスアカウントをドメインアカウントに変更しようとしましたが、アカウントlog on as serviceアクセス許可を付与するまでログオンに失敗します。これは、SQL Server構成マネージャーが必要なアクセス許可を設定する部分と矛盾します。(GPOがこのローカルセキュリティポリシーの設定に干渉したかどうかはわかりませんが) Microsoftは、SQL Serverセットアップがこのページで付与する権限のリストを提供しています。 しかし、サービスを実行するために作成したユーザーがそれを手動で行う必要があるかどうか、またはSQL構成マネージャーを使用してこれらのアクセス許可を自動的に設定するかどうかは明確ではありません。 SQL Server 2014、ドメインコントローラーはWindows Server 2008 R2上にあります。

2
「バッファキャッシュヒット率」の9990はどういう意味ですか?
私はブログの投稿からこのクエリを得ました: SELECT object_name, counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Buffer Manager%' AND [counter_name] = 'Buffer cache hit ratio' 投稿は、キャッシュへのヒットの割合を与えると述べた。0〜100の値になることを示しているようです(87の結果を示しました)。 しかし、それを実行すると、非常に高い数値が得られます。以下に例を示します。 object_name counter_name cntr_value SQLServer:Buffer Manager Buffer cache hit ratio 9990 これは99.90%を意味しますか? そうでない場合、それはどういう意味ですか?そして、どうすれば本当の価値を得ることができますか? 注:257から352363までの値を取得しました 関連する場合は、他のサーバー統計をいくつか示します。 ページの平均寿命:145 ページ読み取り/秒:1,380,009,009

1
CONVERT()のこの問題の原因は何ですか?
次の2つのステートメントを検討してください。 PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0); PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0); 両方のステートメントが戻り-1ます。2番目のバイナリ値は最初の値よりも10進数65,536大きいため、これは間違っていませんか? 確かに、これは無言の切り捨てによるものではないでしょうか? 次のステートメントを実行した場合: PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0); PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0); 次のエラーが表示されます。 Msg 8114, Level 16, State 5, Line 1 Error converting data type varbinary to numeric. ここで何が起こっているかを診断するにはどうすればよいですか? これをSQL Server 2012 v11.0.5058で実行しています。結果は、SQL Server 2008 R2 SP2、SQL Server …

1
統計。複数列のヒストグラムは可能ですか?
高密度の2つの列があるが、これらの列が独立していない状況を考えています。 定義 これが、テスト目的で作成したテーブルの定義です。 CREATE TABLE [dbo].[StatsTest]( [col1] [int] NOT NULL, --can take values 1 and 2 only [col2] [int] NOT NULL, --can take integer values from 1 to 4 only [col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different [col4] AS ((10)*[col1]+[col2]) …

3
特定のSQL Serverインスタンスに「メモリ内のページをロック」権限があるかどうかを確実に判断するにはどうすればよいですか?
「メモリ内のページのロック」権限は、SQL Serverが使用するサービスアカウントに付与できます。これにより、SQL Serverはメモリがディスクにページングされるのを防ぐことができます。 SQL Serverマシンのいくつかには、SQL Serverが使用するサービスアカウントにこの権利を許可するように構成されたローカルポリシーがないことに気付きました。多数のサーバーがあるため、「ローカルシステムポリシー」管理コンソールを使用して各サーバーを手動で確認するのはせいぜい面倒です。 問題のサーバーに権限があるかどうかを判断するために使用できるT-SQLクエリ、拡張ストアドプロシージャ、またはその他の方法はありますか? 私はしたいと思いません使用しEXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';、それは現在のSQL Serverエラーログを確認するに依存しているからです。サーバーが最後に再起動されてからログがロールオーバーされたと仮定すると、そのエラーログに関連するエントリが含まれない場合があります。最初のパラメーターをからなどに変更することで古いログを確認できることを理解しています0が1、エラーログは10個しか保持されておらず、十分ではない場合があります。設定を確認するフェールセーフな方法が必要です。


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