データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

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。 質問: 可能であれば、上記の特性を使用して設計をさらに最適化したいと思います。 正直に言うと、これをどのように行うのか、どこから試すのかわからないので、この投稿です。

1
ローリングサム/カウント/日付間隔の平均
18か月にわたる1,000のエンティティにまたがるトランザクションのデータベースで、クエリを実行して、可能な30日間ごとにentity_idトランザクション量のSUMとその30日間のトランザクションのCOUNTでグループ化します。クエリを実行できる方法でデータを返します。多くのテストの後、このコードは私が望むものの多くを達成します: SELECT id, trans_ref_no, amount, trans_date, entity_id, SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total, COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count FROM transactiondb; そして、次のような構造の大きなクエリで使用します。 SELECT * FROM ( …

3
実稼働環境でのINTからBIGINTへのALTER主キー列(MySQL 5.6.19a)
実稼働データベースのいくつかのINNODBテーブルは、2147483647のINT AUTO_INCREMENT制限に達しようとしているため、BIGINTに変更する必要があります。そうしないと、書き込みが失敗し始めます。 テーブルは、Amazon RDSで実行されている実稼働MySQL 5.6.19aデータベースにあります。 常に発生しているプロダクションの読み取りと挿入を中断せずに、このようなALTERを実行するにはどうすればよいですか? ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT; 表のDDLは次のとおりです。 CREATE TABLE `MYTABLE` ( `id` int(11) NOT NULL AUTO_INCREMENT, `siteId` int(11) NOT NULL, `filter` varchar(10) NOT NULL DEFAULT 'ALL', `date` varchar(10) NOT NULL, `cards` varchar(250) NOT NULL, `apples` varchar(45) NOT NULL, `carrots` varchar(45) NOT NULL, …
20 mysql  innodb 

4
個別の範囲を可能な限り最大の連続する範囲に結合する
複数の日付範囲(最大負荷は約500、ほとんどの場合は10)を、最大の連続する日付範囲に重複する場合も重複しない場合もあります。例えば: データ: CREATE TABLE test ( id SERIAL PRIMARY KEY NOT NULL, range DATERANGE ); INSERT INTO test (range) VALUES (DATERANGE('2015-01-01', '2015-01-05')), (DATERANGE('2015-01-01', '2015-01-03')), (DATERANGE('2015-01-03', '2015-01-06')), (DATERANGE('2015-01-07', '2015-01-09')), (DATERANGE('2015-01-08', '2015-01-09')), (DATERANGE('2015-01-12', NULL)), (DATERANGE('2015-01-10', '2015-01-12')), (DATERANGE('2015-01-10', '2015-01-12')); テーブルは次のようになります。 id | range ----+------------------------- 1 | [2015-01-01,2015-01-05) 2 | [2015-01-01,2015-01-03) 3 | [2015-01-03,2015-01-06) …

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 

4
DBMSの主キーとスーパーキーの違いは何ですか
私はDBMSに不慣れで、まだ理論を学んでいます。 私はこの重要なビジネスに本当に混乱しており、グーグルで検索した後、取得できない2つのキー(プライマリキーとスーパーキー)に絞り込みました。 DBMSに関していくつか質問があります。あなたが私のためにそれらに答えることができれば私は感謝するでしょう。 1)DBMSのプライマリキーとスーパーキーの違いは何ですか? 包括的な例を使用して適切に説明できる場合は、高く評価してください 2)プライマリキーとスーパーキーの両方に複数の列を組み合わせて、プライマリキーとスーパーキーを形成できますか? 3)主キーはスーパーキーのサブセットですか、またはその逆ですか?

5
列とフィールド:これらの用語を間違って使用していませんか?
私はここでちょっと恥ずかしい思いをします。私は常に「コラム」と「フィールド」という用語を完全に交換可能に使用してきました。 しかし、これは正しいとは限らないと言われました(各用語をスプレッドシートの用語に翻訳し、データ型やデータベースを有用にする他のすべてのものを無視します): データベース列:スプレッドシート列のような データベースレコード:スプレッドシート行のような データベースフィールド:スプレッドシートの「セル」(特定の行の特定の列) これは正解?列とフィールドはそれよりも同じ意味で使用されていると宣誓できたでしょう。私は確かにされています。 したがって、テーブルにフィールドを追加するのではなく、テーブルに列を追加します。フィールドは、レコード内のデータについて話すときにのみ関連しますか? 列とフィールドに関する他の考えは? 編集:明確にするために、現在のコンテキストはMS SQL Serverです。SQLサーバー以前の私の背景はMS Accessであり、これらの用語の使用に影響を与える可能性があります。

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

4
INNODBバッファープールの統計情報を理解する
mysqlドキュメンテーションのこのページを読んだ後、現在のInnoDBの使用法を理解しようとしました。現在、バッファプールに6GBのRAMを割り当てています。データベースのサイズはほぼ同じです。次に、show engine innodb status\Gv5.5の実行結果を示します。 ---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 6593445888; in additional pool allocated 0 Dictionary memory allocated 1758417 Buffer pool size 393215 Free buffers 853 Database pages 360515 Old database pages 133060 Modified db pages 300 Pending reads 0 Pending writes: LRU 0, flush list …

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