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

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

1
SQL Server-ネストされた非決定的なビュースタック内の文字列のローカライズの処理
私がアクセスされる一部の非決定的関数参照しているビューに出くわしたデータベースプロファイリングしながら、毎分1000から2500回をするために、各このアプリケーションのプール内の接続を。SELECTビューからの単純な結果は、次の実行計画をもたらします。 これは、数か月ごとに1行または2行の変更が発生する可能性がある1000行未満のビューの複雑な計画のようです。しかし、次のその他の遵守事項により悪化します。 ネストされたビューは非決定的であるため、インデックスを作成できません 各ビューは複数UDFのを参照して文字列を作成します 各UDFにはUDF、ローカライズされた言語のISOコードを取得するためのネストされたsが含まれています スタック内のビューは、s から返された追加の文字列ビルダーを述語として使用していますUDFJOIN 各ビュースタックはテーブルとして扱われます。つまり、基礎となるテーブルに書き込むためにそれぞれにINSERT/ UPDATE/ DELETEトリガーがあります。 ビューのこれらのトリガーは、これらの文字列構築をより多く参照CURSORSするEXECストアドプロシージャを使用しますUDF。 これはかなり腐っているように見えますが、TSQLの経験は数年しかありません。それも良くなります! これは素晴らしいアイデアだと判断した開発者UDFは、スキーマ固有の文字列から返された文字列に基づいて、格納されている数百の文字列を翻訳できるように、すべてを実行したようです。 スタック内のビューの1つを次に示しますが、それらはすべて等しく劣っています。 CREATE VIEW [UserWKStringI18N] AS SELECT b.WKType, b.WKIndex , CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.I18NString ELSE il.I18nString END AS WKString ,CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.IETFLangCode ELSE il.IETFLangCode END AS IETFLangCode ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, …

6
a = 0およびb = 0および…z = 0 vs a + b + c + d = 0のパフォーマンス
これは簡単な質問ですが、答えが見つからないようです。 パフォーマンスの観点から、のWHEREような条項がある場合a=0 and b=0 and ... z=0、その条件をに置き換えてもパフォーマンスは向上しa+b+...+z=0ますか 言い換えれば、次のものを置き換えることによってパフォーマンスが向上しますか Select * From MyTable Where A=0 and B=0 and C=0 and D=0... と Select * From MyTable Where A+B+C+D=0... 私はそれがインデックスに依存することを知っていますが、この目的のために、インデックスが存在しないとだけ言ってみましょう。算術演算子(+)のパフォーマンスは、「OR」または「AND」論理演算子よりも優れていますか? ANDまたはORを使用した複数の条件よりも、追加の方がパフォーマンスが良いという印象を受けています。 試験結果 420万行のテーブル A = 0、B = 0、C = 0の行を返す-> 351748行 追加(A + B + C = 0)には5秒かかりましたが、論理条件A = 0およびB = 0およびC …

3
SQL Serverの膨大なデータとパフォーマンス
非常に大量のレコードを収集して保存するSQL Serverバックエンドを使用してアプリケーションを作成しました。ピーク時の平均レコード量は、1日あたり30〜40億(20時間の操作)の範囲にあると計算しました。 私の元の解決策(データの実際の計算を行う前)は、クライアントが照会する同じテーブルにアプリケーションがレコードを挿入することでした。明らかに、多くのレコードが挿入されているテーブルをクエリすることは不可能だからです。 2番目のソリューションは、2つのデータベースを使用することでした。1つはアプリケーションが受信したデータ用で、もう1つはクライアント対応データ用です。 私のアプリケーションはデータを受け取り、それを〜10万レコードのバッチにチャンクし、ステージングテーブルに一括挿入します。〜100kの記録後、アプリケーションはその場で、以前と同じスキーマで別のステージングテーブルを作成し、そのテーブルへの挿入を開始します。それは、100kレコードを持つテーブルの名前でジョブテーブルにレコードを作成し、SQL Server側のストアドプロシージャは、ステージングテーブルからクライアント対応の本番テーブルにデータを移動してから、アプリケーションによって作成された一時テーブル。 両方のデータベースには、同じスキーマを持つ5つのテーブルの同じセットがありますが、ジョブテーブルがあるステージングデータベースは例外です。ステージングデータベースには、大量のレコードが存在するテーブルに整合性の制約、キー、インデックスなどがありません。以下に示すように、テーブル名はSignalValues_stagingです。目標は、できるだけ早くデータをSQL Serverにバタンと置くことでした。簡単に移行できるようにテーブルをオンザフライで作成するワークフローは非常にうまく機能します。 以下は、ステージングデータベースからの5つの関連テーブルと、jobsテーブルです。 私が作成したストアドプロシージャは、すべてのステージングテーブルからのデータの移動と本番環境への挿入を処理します。以下は、ステージングテーブルからプロダクションに挿入するストアドプロシージャの一部です。 -- Signalvalues jobs table. SELECT * ,ROW_NUMBER() OVER (ORDER BY JobId) AS 'RowIndex' INTO #JobsToProcess FROM ( SELECT JobId ,ProcessingComplete ,SignalValueStagingTableName AS 'TableName' ,(DATEDIFF(SECOND, (SELECT last_user_update FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID(DB_NAME()) AND OBJECT_ID = OBJECT_ID(SignalValueStagingTableName)) ,GETUTCDATE())) SecondsSinceLastUpdate FROM SignalValueJobs …

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つだけ埋めるのに十分です。 …

2
SQL Serverでこれらの文字がすべて等しいのはなぜですか?
わかりません。次のSQLクエリをご覧ください。 select nchar(65217) -- ﻁ select nchar(65218) -- ﻂ select nchar(65219) -- ﻃ select nchar(65220) -- ﻄ if nchar(65217) = nchar(65218) print 'equal' if nchar(65217) = nchar(65219) print 'equal' if nchar(65217) = nchar(65220) print 'equal' 推移的関係に基づいて、SQL Serverはそれらをすべて同じ文字と見なします。 ただし、たとえばC#などの他の環境では、それらは同じではありません。 私が混乱しているのは: SQL Serverでの文字列比較の仕組み 1台のマシンと1つのプラットフォームで比較が同じように動作しないのに、環境が異なる理由 これらの4つのキャラクターは、人間が理解できる1つのキャラクターを表しています。なぜUnicode文字マップが非常に豊富なのですか? もちろん、これは非常に大きな問題になります。私はテキスト処理アプリケーションに取り組んでおり、データはほぼどこからでも来ており、処理する前にテキストを正規化する必要があるためです。 違いの理由がわかっていれば、それを処理する解決策を見つけるかもしれません。ありがとうございました。

3
相互に排他的なサブクラスを持つタイプ/サブタイプデザインパターンでのサブタイプのサブタイプの実装
前書き この質問が将来の読者に役立つように、一般的なデータモデルを使用して、直面している問題を説明します。 我々のデータモデルは、としてラベル付けされなければならない3つの事業体で構成A、BおよびC。物事をシンプルに保つために、それらの属性はすべてintタイプになります。 エンティティにAは次の属性があります:D、EおよびX; エンティティにBは次の属性があります:D、EおよびY; エンティティにCは次の属性がDありZます。 すべてのエンティティが共通の属性を共有Dしているため、タイプ/サブタイプデザインを適用することにしました。 重要:エンティティは相互に排他的です!これは、エンティティがAまたはBまたはCであることを意味します。 問題: エンティティAにBは、さらに別の一般的な属性Eがありますが、この属性はエンティティに存在しませんC。 質問: 可能であれば、上記の特性を使用して設計をさらに最適化したいと思います。 正直に言うと、これをどのように行うのか、どこから試すのかわからないので、この投稿です。

2
すべてのレコードを選択し、結合が存在する場合はテーブルAと結合し、存在しない場合はテーブルBと結合します
だからここに私のシナリオがあります: 私は私のプロジェクトのローカリゼーションに取り組んでおり、通常はC#コードでこれを行いますが、SQLを少し強化しようとしているので、SQLでこれをもう少しやりたいと思っています。 環境:SQL Server 2014 Standard、C#(.NET 4.5.1) 注:プログラミング言語自体は無関係である必要があります。完全を期すためだけに含めています。 それで、私は自分が望むものをやや達成しましたが、私が望んでいた程度ではありませんでした。JOIN基本的なもの以外のSQLを実行してからしばらく(少なくとも1年)経ちましたが、これは非常に複雑JOINです。 データベースの関連テーブルの図を次に示します。(他にもたくさんありますが、この部分には必要ありません。) 画像に記述されているすべての関係はデータベースで完全です- PKとFK制約はすべて設定および操作されています。説明されている列はどれもnullできません。すべてのテーブルにはスキーマがありますdbo。 今、私はほとんど私がしたいことをするクエリを持っています:つまり、ANY Id of SupportCategoriesとANY Id of が与えられるとLanguages、それは次のいずれかを返します: その文字列のためにその言語の右適切な翻訳がある場合(IeはStringKeyId- > StringKeys.Id存在し、中LanguageStringTranslations StringKeyId、LanguageIdとStringTranslationIdの組み合わせが存在し、それはロードStringTranslations.TextそのためStringTranslationId。 場合はLanguageStringTranslations StringKeyId、LanguageIdとStringTranslationIdの組み合わせがなかったしない存在し、それはロードStringKeys.Name値を。Languages.Id与えられていますinteger。 私のクエリは、それが混乱であっても、次のとおりです。 SELECT CASE WHEN T.x IS NOT NULL THEN T.x ELSE (SELECT CASE WHEN dbo.StringTranslations.Text IS NULL THEN dbo.StringKeys.Name ELSE dbo.StringTranslations.Text END AS Result FROM …

4
SSMSがインストールされていないSQL Serverのバージョン/エディションを見つけるにはどうすればよいですか?
管理スタジオをインストールせずに、どのエディションがインストールされているかを調べるにはどうすればよいですか?別のソフトウェアのライセンスマネージャーとして機能するサーバーがあります。高いRAM使用率のアラートを調査すると、sqlservr.exeプロセスがほぼ2 GBのRAMを使用していることがわかりました。 プログラムメニューを見てみると、構成マネージャーがインストールされていることがわかりました。EXEファイルのプロパティをクリックして10.50.1600.1を見つけましたが、Express、Dev、STN、ENTなどであるかどうかを示す場所は見つかりませんでした。 私が推測しなければならなかった場合、これはエクスプレス版ですが、明白な物語の兆候があるかどうかを知りたかったです。 更新:@Bob-ファイルはエディションではなく、私が知っていることを教えてくれます。 @valo-そのコマンドを実行すると次のエラーが発生し、名前付きパイプが有効になっていることを確認しました。 HResult 0x35、レベル16、状態1名前付きパイププロバイダー:SQL Server [53]への接続を開けませんでした。Sqlcmd:エラー:Microsoft SQL Server Native Client 10.0:SQL Serverへの接続の確立中にネットワーク関連またはインスタンス>特定のエラーが発生しました。サーバーが見つからないか、アクセスできません。インスタンス名が正しいかどうか、およびSQL Serverがリモート接続を許可するように構成されているかどうかを確認します。詳細については、SQL Server Books Onlineを参照してください。Sqlcmd:エラー:Microsoft SQL Server Native Client 10.0:ログインタイムアウトが切れました。 @thomas- 質問をする前に在庫管理単位名に気づきましたが、それは簡単すぎるようでした。最初の疑念は正しかったと思います。
20 sql-server 

2
各SQL Serverバージョンのオンライン操作の完全なリストはありますか?
5TBデータベースの大きなテーブルの一部を変更しようとしているので、オンラインで実行でき、実行中に完全ロックを保持する必要がある操作のリストが必要であることがわかりました。理想的には、このリストには、最後にコミットするためにSCH-Mロックが必要なステートメントに関する情報も含まれます。 Microsoftの時代からそれらのほとんどを知っていますが、SQL Server 2005から2014 CTPまでの進化したオンライン操作の公開リストが見つからなかったことに驚きました。 誰でもそのようなリストを利用できますか?そうでない場合、私はそれを作成することを決めるかもしれません。

1
数値へのキャスト時に奇妙なSQL Serverインスタンスがクラッシュする
C#Entity Frameworkで作業しているときに、SQL Serverインスタンスのクラッシュに気付きました。 私はこの声明まで追跡することができました: SELECT * FROM dbo.[TestTable] where mpnr in (1099059904, 1038139906, 1048119902, 1045119902, 1002109903, 1117109910, 1111149902, 1063149902, 1117159902, 1116109904, 1105079905, 1012079906, 1129129904, 1103059905, 1065059905, 1091059906, 1110149904, 1129149903, 1083029905, 1080139904, 1076109903, 1010019902, 1058019902, 1060019903, 1053019902, 1030089902, 1018149902, 1077149902, 1010109901, 1011109901, 1000119902, 1023049903, 1107119909, 1108119909, 1106119909) テーブルは次のようになります。 CREATE TABLE dbo.[TestTable]([MPNR] …

4
実行計画と統計IO注文
SQL Serverのグラフィカルな実行計画は、右から左、上から下に読みます。によって生成された出力に意味のある順序はありSET STATISTICS IO ONますか? 次のクエリ: SET STATISTICS IO ON; SELECT * FROM Sales.SalesOrderHeader AS soh JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID JOIN Production.Product AS p ON sod.ProductID = p.ProductID; この計画を生成します。 そして、このSTATISTICS IO出力: Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob …

4
HashBytes関数で適切なアルゴリズムを選択する
比較のために、nvarcharデータのハッシュ値を作成する必要があります。T-SQLには複数のハッシュアルゴリズムがありますが、このシナリオで選択するのに最適なものはどれですか? 2つの異なるnvarchar値のハッシュ値が重複するリスクが最小になるようにします。インターネットでの私の研究に基づいて、MD5が最高のようです。そうですか?MSDNは、利用可能なアルゴリズムについて(下記のリンク)を教えてくれますが、どの条件のどのアルゴリズムに関する説明はありませんか? HASHBYTES(Transact-SQL) 2つのテーブルを2つのnvarchar(max)列で結合する必要があります。ご想像のとおり、クエリの実行には時間がかかります。各nvarchar(max)データのハッシュ値を保持し、ブロブであるnvarchar(max)値ではなく、ハッシュ値で結合を行う方が良いと考えました。問題は、どのハッシュアルゴリズムが一意性を提供するかです。そのため、1つ以上のnvarchar(max)に対して1つのハッシュ値を持つリスクに直面することはありません。

2
Windows認証を使用してリンクサーバーを機能させるにはどうすればよいですか?
ドメイン環境で「ログインの現在のセキュリティコンテキストを使用して作成する」を使用して、別のサーバーServerBで作成されたServerAにリンクサーバーを取得しようとしています。Kerberosを有効にするには、各サーバーでSQL Serverを実行するサービスアカウント用にSPNを作成する必要があることを読みました。私はそれを行っており、認証スキームがKerberosであることを両方とも示していますが、まだエラーに直面しています: "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'". Active Directoryでは、ServerBのサービスアカウントがMSSQLSvcへの委任に対して信頼されていることがわかりますが、ServerAのサービスアカウントでは「このユーザーを委任に対して信頼」が有効になっていないことに気付きました。ターゲットサーバーでもそのオプションを有効にする必要がありますか?現在のWindowsログインを使用してリンクサーバーを使用できるようにするために、他に必要なものはありますか?

5
SQL Server Management Studio用のSQL Server Profilerをダウンロードする
SQL Server 2008データベースをプロファイルして、特定のデータベースで実行されているコードを確認するにはどうすればよいですか?SQL Serverプロファイラーを使用したことを覚えていますが、SQL Server 2008 R2 Expressをダウンロードした後、SQL Server Management Studioに表示されません。そのツールはどこでダウンロードしてインストールできますか?このオプションを表示するには、SQL Server 2008のフルバージョンが必要ですか?

2
更新する行の数に応じて完全に異なるプランを使用するT-SQLクエリ
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 「TOP(X)」句を含むSQL UPDATEステートメントがあり、値を更新する行には約40億行あります。「TOP(10)」を使用すると、ほぼ瞬時に実行される1つの実行プランが得られますが、「TOP(50)」以上を使用すると、クエリは(少なくとも、待機中ではなく)終了しません。まったく異なる実行計画を使用します。小さいクエリは、インデックスシークとネストされたループ結合のペアを持つ非常に単純なプランを使用します。まったく同じクエリ(UPDATEステートメントのTOP句の行数が異なる)は、2つの異なるインデックスシークを含むプランを使用します、テーブルスプール、並列処理、その他多数の複雑さ。 「OPTION(USE PLAN ...)」を使用して、より小さいクエリによって生成された実行プランを強制的に使用しました。これを行うと、数秒で100,000行も更新できます。クエリプランが良好であることはわかっていますが、SQL Serverは少数の行のみが関係している場合にのみそのプランを選択します。更新でかなり多くの行数があると、最適ではないプランになります。 並列処理のせいかもしれないと思ったのでMAXDOP 1、クエリを設定しましたが、効果はありません-そのステップはなくなりましたが、選択/パフォーマンスの低下はありません。sp_updatestatsそれが原因ではないことを確認するために、今朝も走りました。 2つの実行計画を添付しました-短いものは速いものです。さらに、問題のクエリは次のとおりです(含まれているSELECTが小さい行カウントと大きい行カウントの両方の場合に高速であるように見えることに注意する価値があります)。 update top (10000) FactSubscriberUsage3 set AccountID = sma.CustomerID --select top 50 f.AccountID, sma.CustomerID from FactSubscriberUsage3 f join dimTime t on f.TimeID = t.TimeID join #mac sma on f.macid = sma.macid and t.TimeValue between sma.StartDate and sma.enddate …

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