データベース管理者

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

2
効率的な範囲集計クエリのためのデータベース?
簡単な例として、次のようなテーブルがあるとします。 seq | value ----+------ 102 | 11954 211 | 43292 278 | 19222 499 | 3843 テーブルには数億のレコードが含まれる可能性があり、次のようなクエリを頻繁に実行する必要があります。 SELECT sum(value) WHERE seq > $a and seq < $b seqインデックスが作成されている場合でも、一般的なデータベース実装は各行をループして、最良の場合の合計を計算します。O(n)ここnで、は範囲のサイズです。 O(log(n))クエリごとに、これを効率的に実行できるデータベースはありますか? ここで説明するように、セグメントツリーと呼ばれるデータ構造に遭遇しました。範囲ツリーまたは間隔ツリーとも呼ばれますが、これらの名前はすべて、データ構造のわずかに異なるバリエーションとして説明されることがよくあります。 しかし、そのようなデータ構造を実装するデータベースに出くわしたことはありません。インメモリ構造の場合、最初から実装するのは簡単ですが、永続化する必要がある場合や、メモリに収まりきらない場合は注意が必要です。これを既存のデータベースの上に実装するための効率的なパターンがある場合、それも役立ちます。 補足:これは追加専用のテーブルではないため、この場合、累積合計を保持するなどの解決策は機能しません。

1
SQL仕様ではEXISTS()にGROUP BYが必要ですか?
マイクロソフトでは現在、この構文を許可しています。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ノーがあることに注意してくださいGROUP BYにEXISTS句は、その有効なANSI SQLです。それとも単に実装の詳細を公開するだけなのでしょうか。 参考までに、これと同じ構文はPostgreSQLでは許可されていません。 エラー:列 "tx"はGROUP BY句に出現するか、集計関数で使用する必要があります しかし、この構文は許可されています。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS …

1
最初に空のB +ツリーへのキーを持つレコードを入力する方法は?
順序(1、2、3、4、5)のキーを持つレコードを、最初は空のB + –次数m = 3のツリーに入力した結果を表示します。オーバーフローの場合は、ノードを分割し、再配布しないでください隣人への鍵。木の高さを低くするために、キーを使用してレコードを異なる順序で入力することは可能ですか? 以下からの動的な木構造組織、P.50:リレーショナルDBMSの内部、第5章 私はこれが得意ではありませんが、左側で≤、右側で>を実行しようとしました: 1,2の挿入まで: 次に、ノードを分割し、近隣にキーを再配布しないようにする必要がある限り(私はそれを息子ノードとして理解しています)、2のセルの右側にのみ挿入しました。 そして、私は5を挿入するときと同じことを続けました: しかし、これはかなり奇妙です。これらのような空のノードを見たことがありません...そして、それがいくつかの非常に基本的なBツリープロパティを尊重するかどうかわかりません: 各ノードは最大で(m-1)個のキーを持ち、少なくとも(⌈(m / 2)⌉-1)個のキーを持ちます。 最初の試み:注文のエラーにより、あいまいなツリーが明らかになりました 最初に、「順序」が何であるか(ノードあたりの子の最大数)を誤解しました。したがって、ノードには3つのスペース(したがって、4つの子)を含めることができると思いました。次数4のツリーを作成していたと思います。 1,2,3の挿入まで: 4を挿入して、ノードを分割し、キーを近隣に再配布しない限り(これは矛盾しているようです)、3の後の右側の葉に1,2,3および4,5を割り当てます。
11 btree 

1
「EXISTS(…)OR EXISTS(…)」内の句の順序
2つの事柄の1つが存在するかどうかをテストするクエリのクラスがあります。それは形です SELECT CASE WHEN EXISTS (SELECT 1 FROM ...) OR EXISTS (SELECT 1 FROM ...) THEN 1 ELSE 0 END; 実際のステートメントはCで生成され、ODBC接続を介してアドホッククエリとして実行されます。 ほとんどの場合、2番目のSELECTは最初のSELECTよりも高速であり、2つのEXISTS句の順序を切り替えると、先ほど作成した1つ以上の不正なテストケースで劇的なスピードアップが発生したことが最近判明しました。 明らかなことは、先に進んで2つの句を切り替えることですが、SQL Serverに詳しいユーザーがこれを検討する必要があるかどうかを確認したかったのです。偶然と「実装の詳細」に頼っているような気がします。 (また、SQL Serverの方が賢い場合は、両方のEXISTS句を並行して実行し、どちらかが最初に完了したときに、もう一方を短絡させます。) SQL Serverがこのようなクエリの実行時間を一貫して改善するためのより良い方法はありますか? 更新 お時間と私の質問に関心をお寄せいただきありがとうございます。実際のクエリプランについての質問は期待していませんでしたが、共有したいと思っています。 これは、SQL Server 2008R2以降をサポートするソフトウェアコンポーネント用です。データの形状は、構成と使用法によってかなり異なる場合があります。(例では)dbf_1162761$z$rv$1257927703テーブルには常にテーブルよりも多くの行数が含まれるため、私の同僚はクエリにこの変更を加えることを考えましたdbf_1162761$z$dd$1257927703。 ここに私が言及した虐待事件があります。最初のクエリは低速で、約20秒かかります。2番目のクエリはすぐに完了します。 それが価値があることについては、パラメータのスニッフィングが特定のケースを破壊していたため、「OPTIMIZE FOR UNKNOWN」ビットも最近追加されました。 元のクエリ: SELECT CASE WHEN EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$rv$1257927703 rv INNER JOIN zumero.dbf_1162761$t$tx …
11 sql-server 

1
SQL ServerクエリプランXML:QueryPlanHashの長さ
更新:これは間違いなくバグです。詳細については、こちらの接続アイテムをご覧ください。 sp_BlitzCacheへのいくつかの変更(完全な開示、私は作成者の1人)をテストしているときに、コードのバグだと思ったものに遭遇しました。 ある時点で、クエリコストを取得するためにクエリプランハッシュを照合しています。私たちはそのようにしています: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') これは、私が見た限りではうまくいきました。ただし、奇妙なケースの1つとして、XMLの部分文字列がNULL値をスローし、プランのコストはかなり高いにもかかわらず、コストが0でした。 掘り下げる実行計画(フル開示は、ホストが計画を貼り付けていること、会社のための私の仕事は)、私は、クエリプランハッシュは一つの問題ハッシュのための残りが18ここである例でありながら、17文字の長さだったことに気づきました。 QueryPlanHash = "0x4410B0CA640CDA89" QueryPlanHash = "0x2262FEA4CE645569" QueryPlanHash = "0xED4F225CC0E97E5"-問題! QueryPlanHash = "0xBF878EEE6DB955EA" QueryPlanHash = "0x263B53BC8C14A452" QueryPlanHash = "0x89F5F146CF4B476F" QueryPlanHash = "0xEF47EA40805C8961" QueryPlanHash = "0xB7BE27D6E43677A5" QueryPlanHash = "0x815C54EC43A6A6E9" クエリプランハッシュはaとしてリストされていますBINARY 8-おそらくこれは常に同じ長さでなければなりませんが、私のような人はバイナリ値について何を知っていますか? XQueryを少し試してみたところ、2番目の位置から開始するように部分文字列を変更すると、有効な(正しくないとしても)ハッシュ値が得られることがわかりました。 WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p) SELECT QueryPlanCost = statement.value('sum(/p:StmtSimple/@StatementSubTreeCost)', 'float'), **q.n.value('substring(@QueryPlanHash, …

2
副作用のある標準SQL関数はありますか?
SQL標準は副作用のある関数を定義していますか? たとえば、ファイルに書き込むための関数や、次のような場合にテーブルの特定の列の値を更新する関数がありますか? SELECT myfunction(params...); これらを時々見たことがありますが、SQL標準が同じことをしているのかどうか知りたいだけです。 *これは特にPostgreSQLに関する質問ではありません。私はPostgreSQLで見られる副作用の例のみを使用しています。

2
ネストされたループ結合が左結合のみをサポートするのはなぜですか?
クレイグ・フリードマンのブログ「ネストされたループ結合」では、ネストされたループ結合が右外部結合をサポートできない理由を説明しています。 問題は、内部テーブルを複数回(外部結合の行ごとに1回)スキャンすることです。これらの複数のスキャン中に、同じ内部行に複数回遭遇する可能性があります。特定の内側の行が結合していない、または結合しないと結論できるのはどの時点ですか? 誰かがこれを本当にシンプルで教育的な方法で説明してくれませんか? それは、ループが外側のテーブル(R1)で始まり、内側のテーブル()をスキャンすることを意味しR2ますか? とR1結合しない値については、結果セットが()になるようにR2aに置き換える必要があることを理解しています。参加しない場合に値を返すことは、私にとって不可能であるように思われます。理由は、返す値がわからないためです。しかし、それはそれが説明される方法ではありません。またはそれは?NULLNULL, R2R2R1R2 SQL Serverは、実際の最適化でない(そして多くの場合、置き換え)RIGHT JOINでLEFT JOIN、しかし問題は、それはだ理由を説明することで、技術的には不可能NESTED LOOPS JOINに使用する/サポートRIGHT JOINロジック。

2
RAMディスク上のSQL Server tempdb?
弊社のベンダーアプリケーションデータベースは非常にTempDBを集中的に使用しています。 サーバーは、SQL 2012 Enterprise SP3を実行する40コアおよび768GB RAMの仮想(VMWare)です。 TempDBを含むすべてのデータベースは、SANのTier 1 SSDにあります。tempdbデータファイルは10個あり、それぞれ1GBに事前に拡張されており、自動拡張されることはありません。70 GBのログファイルと同じです。トレースフラグ1117および1118は既に設定されています。 sys.dm_io_virtual_file_statsは、tempdbのデータとログファイルで過去1か月に50テラバイトを超えて読み書きされ、累積io_stallが250時間または10日であることを示しています。 過去2年間、ベンダーのコードとSPはすでに調整されています。 現在、大量のメモリがあるため、tempdbファイルをRAMドライブに配置することを考えています。tempdbはサーバーの再起動時に破壊/再作成されるため、サーバーの再起動時にフラッシュされる揮発性メモリに配置するのが理想的です。 低い環境でこれをテストしましたが、CPUが遅いtempdbドライブで待機するのではなく、より多くの作業を行っているため、クエリ時間は短縮されましたが、CPU使用率が増加しました。 他の誰かが、高oltp本番システムのtempdbをRAMに配置しましたか?大きな欠点はありますか?具体的に選択または回避するベンダーはありますか?

2
HTMLコードをXMLとして読み取り、SQLのサンプルのような出力を取得する方法
データベースにHTMLコードが格納されていて、それをXMLとして読みたい。 私のコード: http://rextester.com/RMEHO89992 これは私が持っているHTMLコードの例です: <div> <section> <h4> <span> A </span> </h4> <ul> <li> <span> Ab</span> AD <span> AC </span> </li> <li> <span> Ag</span> <span> AL </span> </li> </ul> <h4> <span> B </span> </h4> <ul> <li> <span> Bb</span> BD <span> BC </span> </li> <li> <span> Bg</span> <span> BL </span> </li> </ul> …
11 sql-server  t-sql  xml 

2
動的SQL(ピボットクエリ)をxml出力に変換するときに、日付の最初の桁がUnicodeに変換されるのはなぜですか?
Bluefeetのこの素晴らしい例/dba//a/25818/113298を使用して、ピボットを作成し、それをxmlデータに変換しています。 パラメータの宣言 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); 次に、多くのコードを含むCTEがあり、CTEの最終結果が一時DBに配置されます(例と同じ)。 SELECT B.[StayDate] -- this is a date dd-mm-yyyy , B.[Guid] INTO #tempDates FROM BaseSelection B colsの生成(例と同じ) SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120)) FROM #tempDates FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); 結果セットは私が期待すべきものです set @query = 'SELECT …
11 sql-server  xml  pivot 

3
SQL Serverのバージョンに応じて、RAISERRORまたはTHROWを選択することはできますか?
これが私のコードです: BEGIN TRY INSERT INTO TABLE (F1,F2,F3) VALUES ('1','2','3') END TRY BEGIN CATCH ;THROW END CATCH SQL 2008が搭載されたマシンで実行しない限り、うまく機能します。CATCHブロックでSQLバージョンをチェックし、それが2012以上の場合はTHROWを実行し、2008の場合はRAISERRORを実行します。構文エラー、それが可能かどうか疑問に思っています。このような単純なものでさえ、私にはうまくいきません。 BEGIN CATCH IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW END CATCH 任意のアドバイスをいただければ幸いです。

4
SET操作に参加できるローカル変数の最大数はいくつですか?
ビジネスロジックを含むストアドプロシージャがあります。その中には約1609の変数があります(理由は聞かないでください、これがエンジンのしくみです)。SET変数を他のすべての変数の連結値にしようとしています。結果として、作成中にエラーが発生します。 メッセージ8631、レベル17、状態1、手順XXX、行YYY内部エラー:サーバーのスタック制限に達しました。クエリで潜在的に深い入れ子を探し、それを単純化してみてください。 エラーは、SET操作で使用する必要がある変数の数が原因であることがわかりました。2つに分けて割り当てができます。 私の質問は、この領域にいくつかの制限があるのですか?チェックしましたが何も見つかりませんでした。 このKBに記載されているエラーを確認しましたが、これは私たちのケースではありません。CASEコード内では式を使用しません。その一時変数を使用して、CLR関数を使用して置き換える必要がある値のリストを準備します。SQL ServerをSP3 CU6(最新)に更新しましたが、まだエラーが発生しています。

2
SQL Server-NTEXT列と文字列操作
というNTEXT列のあるテーブルがありますcomments。私は2番目の文字列を持っている、のは、それを呼びましょうanothercomment(varcharニーズが与えられたの内側に置くこと)comments言葉の後の文字列UPDATEHERE。 キャストするnvarchar(max)とcomments文字列が切り捨てられるため、CHARINDEX()(のようなものは使用できませんMsg 8152, Level 16, State 10, Line 2 String or binary data would be truncated.)。以前datalength()は、8000文字を超える数千の列があることを確認してきました。 (はるかに長い文字列ではありますが)私が達成したいことの例: コメント- This is a test UPDATEHERE This is the end of the test 別のコメント- . This is inserted. 結果の文字列- This is a test UPDATEHERE. This is inserted. This is the end of the …

10
標準SQLまたはT-SQLで1、2、3、3、2、1、1、2、3、3、2、1、…シリーズを生成する方法は?
二つの数を考えるnとm、私は、フォームのシリーズを生成したいです 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 そしてそれを繰り返しmます。 たとえば、n = 3およびの場合、m = 4次の24個の数字のシーケンスが必要です。 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- PostgreSQLでこの結果を2つの方法のいずれかで達成する方法を知っています。 generate_series関数を使用する次のクエリと、順序が正しいことを保証するためのいくつかのトリックを使用します。 WITH parameters (n, …

1
###。###。####パターン一致を強制するCHECK制約
マルチパートコードにこの正規表現パターンを適用するチェック制約が必要です。 ^\d{3}\.\d{3}\.\d{4}$ ... 3つの数字、ピリオド、3つの数字、ピリオド、4つの数字。 パターンマッチングを実施するためにCLR関数を作成する必要がありますか?また、CLR関数はDDLで参照できますか? 別の方法でパターンを適用する方法はありLIKEますか?

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