データベース管理者

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

1
クエリ実行時の低メモリ状態をシミュレートする方法
低メモリ状態でのSQL Serverの実行エンジンの動作をよりよく理解しようとしています。メモリ付与の観点から言えば、GrantedMemoryに等しくなるように強制する方法があるかどうか疑問に思っていRequiredMemoryます。(私の推測では、それを行うための文書化されていないトレースフラグがあります。誰がそれを知っていますか?)

1
メモリ最適化テーブルを使用したSQL Server 2016の不適切な動作
次のSQLクエリをご覧ください。 CREATE TYPE dbo.IN_MEMORY_TABLE_TYPE AS TABLE ( source_col INT NULL, target_col INT not NULL INDEX ix_InMemoryTable NONCLUSTERED (target_col) ) WITH (MEMORY_OPTIMIZED = ON) GO DECLARE @t dbo.IN_MEMORY_TABLE_TYPE INSERT @t ( source_col, target_col ) VALUES (10, 0), (0, 0) UPDATE r1 SET target_col = -1 FROM @t r1 WHERE EXISTS ( …

3
1時間ごとにMS SQL Studioでクエリを自動的に実行する
私は大企業のアプリケーションをサポートしています。私の役割の1つはデータのクリーンアップです。1時間ごとに実行する必要があるクエリがあり、それを自動化する必要があります。組織ポリシーのため、SQL Serverエージェントジョブを作成したり、スキーマを変更したりすることはできません。データを操作することしかできません。 終わりのない WHILE(1=1) BEGIN WAITFOR DELAY '01:00'; --do work END 私のために仕事をしますが、私はパーマオープン接続の考えで肩をすくめます。 理想的には、MS SS自体のスクリプトを作成して1時間ごとに特定のコードを実行しますが、それが可能かどうかはわかりません。 この問題の解決策はありますか?

3
LIKE文字の長さ制限を克服する
ここでこのLIKE文字の長さの制限を読むと、LIKE句で〜4000文字より長いテキストを送信できないように見えます。 特定のクエリのクエリプランキャッシュからクエリプランをフェッチしようとしています。 SELECT * FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?' 内のクエリLIKEが4000文字より長い場合、クエリがキャッシュプランに含まれていても結果は0になります。(少なくともエロルが予想されていました)。 この問題を回避する方法はありますか?> 10000charsの長さのクエリがあり、> で検索できないようLIKEです。

2
外部キーの削除に時間がかかるのはなぜですか?
次のように、一度に1つずつ、データベースからすべての外部キーを削除するスクリプトを作成しました。 ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2 私が驚いたのは、スクリプトに時間がかかることです。DROPFKごとに平均20秒です。今、私はFKを作成することは大したことかもしれないことを理解しています、なぜならサーバーはFK制約が最初から侵害されていないことを確認しなければならないからです?時間がかかるFKをドロップするとき、サーバーは何をしますか?これは私自身の好奇心のためであり、物事をより速くする方法があるかどうかを理解するためです。FKを(単に無効にするだけでなく)削除できると、移行中にはるかに高速になり、したがってダウンタイムを最小限に抑えることができます。

1
Perfmonカウンターの「次善の計画/秒」は実際に何を測定しますか?
SQL Serverでは、Perfmonカウンターの「ワークロードグループの統計:次善の計画/秒」は何を測定しますか? これはリソースガバナーカウンターの1つであるため、ワークロードグループで測定されます(RGを構成するかどうかに関係なく、ユーザーはこれを使用します)。 何が良い計画か悪い計画かを尋ねるのではなく、その対抗策は具体的に何であり、正確な対応する計画をどこで見つけますか?たとえば、「準最適なプラン/秒」カウンターをトリガーするクエリに一致すると思われる拡張イベントには何も見つかりません。
13 sql-server 

1
UNPIVOTがUNION ALLに変換されるのを防ぐにはどうすればよいですか?
多少複雑なOracleクエリがあり、完了に約30分かかります。クエリの遅い部分を取り出して個別に実行すると、数秒で終了します。以下は、分離されたクエリのSQLモニターレポートのスクリーンショットです。 以下は、完全なクエリの一部として実行される場合と同じロジックです。 色は両方のスクリーンショットの同じ表に対応しています。遅いクエリの場合、Oracle MERGE JOINはに等値条件を持たない2つのテーブル間で実行していますJOIN。その結果、約1億5,000万の中間行が不必要に処理されます。 クエリヒントまたはリライトを使用してこの問題を回避できますが、この問題を将来回避し、バグレポートをOracleに送信できるように、できるだけ多くの根本原因を理解したいと思います。悪いプランを取得するたびUNPIVOTに、クエリテキストUNION ALL内がプラン内に変換されます。さらに調査するために、そのクエリ変換が発生しないようにしたいと思います。この変換の名前を見つけることができませんでした。また、クエリヒントまたはアンダースコアパラメーターを見つけることができませんでした。私は開発サーバーでテストしているので、何でもできます。 私は、クエリ変換を防ぐために行うことができますが何であるUNPIVOTのはUNION ALL?Oracle 12.1.0.2を使用しています。 IPの理由で、クエリ、テーブル名、またはデータを共有できません。単純な複製を思い付くことができませんでした。とはいえ、質問に答えるためにその情報が必要な理由は私にはわかりません。以下は、UNPIVOTクエリと、UNION ALLとして実装された同じクエリの例です。

2
SQL Server 2016の空間データ用のMakeValid()の代替
LINESTRINGOracleからSQL Serverに移行する地理データの非常に大きなテーブルがあります。Oracleのこのデータに対して実行される評価は多数あり、SQL Serverのデータに対しても実行する必要があります。 問題:SQL ServerにはLINESTRING、Oracleよりも有効な要件が厳しい。「LineStringインスタンスは、2つ以上の連続したポイントの間隔で自身をオーバーラップさせることはできません」。LINESTRINGsの パーセンテージがその基準を満たしていないということが起こります。つまり、データを評価するために必要な関数が失敗します。データを調整して、SQL Serverで正常に検証できるようにする必要があります。 例えば: LINESTRINGそれ自体に倍増する非常にシンプルな検証: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).IsValidDetailed() 24413: Not valid because of two overlapping edges in curve (1). MakeValidそれに対して関数を実行する: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).MakeValid().STAsText() LINESTRING (0 -0.999999999999867, 0 0, …

4
最初の1億個の正の整数を文字列に変換するにはどうすればよいですか?
これは、実際の問題から少し逸脱しています。コンテキストの提供が役立つ場合、このデータの生成は、文字列の処理方法のパフォーマンステスト、カーソル内で何らかの操作を適用する必要がある文字列の生成、または機密データの一意の匿名名の置換の生成に役立ちます。SQL Server内でデータを効率的に生成する方法に興味があるだけです。このデータを生成する必要がある理由を尋ねないでください。 ある程度正式な定義から始めようと思います。文字列は、A〜Zの大文字のみで構成される場合、シリーズに含まれます。シリーズの最初の用語は「A」です。シリーズは、最初に長さ、2番目に一般的なアルファベット順でソートされたすべての有効な文字列で構成されます。文字列がという列のテーブルにあるSTRING_COL場合、順序はT-SQLでとして定義できますORDER BY LEN(STRING_COL) ASC, STRING_COL ASC。 あまり正式ではない定義を行うには、Excelのアルファベット順の列ヘッダーを見てください。シリーズは同じパターンです。整数を基数26の数値に変換する方法を検討してください。 1-> A、2-> B、3-> C、...、25-> Y、26-> Z、27-> AA、28-> AB、... 「A」は10を基数とする0とは異なる動作をするため、類推は完全ではありません。以下に、選択した値の表を示します。 ╔════════════╦════════╗ ║ ROW_NUMBER ║ STRING ║ ╠════════════╬════════╣ ║ 1 ║ A ║ ║ 2 ║ B ║ ║ 25 ║ Y ║ ║ 26 ║ Z ║ ║ 27 ║ AA ║ …


2
array_agg()が非集約ARRAY()コンストラクターより遅いのはなぜですか?
8.4より前のPostgreSQL向けに作成された古いコードをレビューしたところ、本当に気の利いたものが見つかりました。当時はカスタム関数でこれの一部を実行していたことを覚えていますが、事前にarray_agg()どのようなものかを忘れていました。レビューのために、現代の集計はこのように書かれています。 SELECT array_agg(x ORDER BY x DESC) FROM foobar; しかし、昔々、このように書かれていました、 SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC); それで、私はいくつかのテストデータでそれを試しました。 CREATE TEMP TABLE foobar AS SELECT * FROM generate_series(1,1e7) AS t(x); 結果は驚くべきものでした。.#OldSchoolCoolの方法は非常に高速で、25%高速化されました。さらに、ORDERを使用せずに単純化すると、同じ遅延が示されました。 # EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Result (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 …

1
「and」と「&」の違い
私は論理演算の優先順位を理解しようとしていますが、次のコードがあります: declare @T bit ='TRUE' declare @F bit ='False' print @T and @F そして、エラーを返します キーワード「and」付近の構文が正しくありません。 「and」を「&」に置き換えると、コードは再び機能します。前のコードが機能しなかったのはなぜですか?SQLサーバーを使用しています。
13 sql-server  t-sql 

1
SQL Serverがオブジェクト名とシステムプロシージャに渡される文字列を交換できる理由
オブジェクト名をシステムストアドプロシージャに渡すことが合法である原因は何sp_helptextですか? オブジェクト名を文字列に変換するメカニズムは何ですか? 例えば -- works sp_helptext myproc sp_helptext [myproc] sp_helptext [dbo.myproc] -- and behaves the same as a string sp_helptext 'myproc' sp_helptext 'dbo.myproc' -- does not work sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.' -- an additional case that does not work. …

1
GINインデックス付きTSVECTOR列から部分一致を取得します
これをクエリして結果を取得したい: SELECT * FROM ( SELECT id, subject FROM mailboxes WHERE tsv @@ plainto_tsquery('avail') ) AS t1 ORDER by id DESC; これは機能し、をtsv含む行を返しますAvailable。しかし、私が使用avai(ドロップlable)した場合、何も見つかりません。 すべてのクエリは辞書にある必要がありますか?このような文字だけを照会することはできませんか?電子メールの本文(コンテンツ)を含むデータベースがあり、毎秒成長するにつれて高速にしたいと思います。現在使用しています ... WHERE content ~* 'letters`

7
グループ化またはウィンドウ
ウィンドウ関数を使用して解決できると思う状況がありますが、よくわかりません。 次の表を想像してください CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …

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