タグ付けされた質問 「union」

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として実装された同じクエリの例です。

3
連結物理操作:実行の順序を保証しますか?
標準SQLでは、aの結果のunion all順序は保証されていません。だから、次のようなもの: select 'A' as c union all select 'B' 任意の順序で2つの行を返すことができます(ただし、実際に知っているデータベースでは、「A」が「B」よりも前になります)。 SQL Serverでは、これは「連結」物理操作を使用した実行計画になります。 連結操作が入力をスキャンし、使用可能なレコードがある入力をすべて返すと簡単に想像できます。しかし、私はウェブ上で次の文を見つけました(ここ): クエリプロセッサは、計画に演算子が表示される順序でこの計画を実行します。最初の計画が一番上で、最後の計画が最後です。 質問:これは実際には本当ですか?これは真実であることが保証されていますか? Microsoftのドキュメントには、入力が最初から最後まで順番にスキャンされるという参照は見つかりませんでした。一方、実行しようとすると、結果は、入力が実際に順番に処理されていることを示唆しています。 エンジンが一度に複数の入力を処理する方法はありますか?私のテスト(定数よりもはるかに複雑な式を使用)は、並列対応の8コアマシン上で実行され、ほとんどのクエリは並列処理を利用しています。

2
共用体が整数を天井にキャストする際の問題(10進数)
私はこのシナリオを持っています。MySQLが最大の10進数値を取り、他の値をそれにキャストしようとしているようです。 問題は、このクエリが外部ライブラリによって生成されるため、少なくともこのレベルでは、このコードを制御できません。これを修正する方法を知っていますか? SELECT 20 AS x UNION SELECT null UNION SELECT 2.2; +------+ | x | +------+ | 9.9 | -- why from 20 to 9.9 | NULL | | 2.2 | +------+ 期待される結果 +------+ | x | +------+ | 20 | -- or 20.0, doesn't matter really in my …

1
MySQL:内部クエリで「ORDER BY」を使用してUNIONを最適化する
同じレイアウトの複数のテーブルで構成されるロギングシステムをセットアップしただけです。 データソースごとに1つのテーブルがあります。 ログビューアについて、私はしたいです UNIONすべてのログテーブル、 アカウントでそれらをフィルタリングし、 ソースを識別するための疑似列を追加し、 時間順に並べ替え、 そして、ページ分割のためにそれらを制限します。 すべてのテーブルにzeitpunktは、インデックス付きの日付/時刻列であるというフィールドが含まれています。 私の最初の試みは: (SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit, 'hp' AS source FROM is_log AS l WHERE l.account_id = 730) UNION (SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt, 'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730) ORDER …

2
差分を生成する最も効率的な方法
SQLサーバーに次のようなテーブルがあります。 Id |Version |Name |date |fieldA |fieldB ..|fieldZ 1 |1 |Foo |20120101|23 | ..|25334123 2 |2 |Foo |20120101|23 |NULL ..|NULL 3 |2 |Bar |20120303|24 |123......|NULL 4 |2 |Bee |20120303|34 |-34......|NULL 入力データとバージョン番号を取得するdiffのストアドプロシージャに取り組んでいます。入力データには、名前からfieldZまでの列があります。ほとんどのフィールド列はNULLであることが期待されています。つまり、通常、各行には最初のいくつかのフィールドのデータのみが含まれ、残りはNULLです。名前、日付、およびバージョンは、テーブルに対する一意の制約を形成します。 特定のバージョンについて、このテーブルに関して入力されたデータを比較する必要があります。各行を比較する必要があります。行は名前、日付、バージョンで識別され、フィールドの列の値を変更すると、比較結果に表示されるようになります。 更新:すべてのフィールドが10進数である必要はありません。それらのいくつかはnvarcharである可能性があります。タイプを変換せずにdiffを実行したいのですが、diff出力はすべてをnvarcharに変換できるため、それは表示目的でのみ使用されるためです。 入力が次のようであり、要求されたバージョンが2であるとします。 Name |date |fieldA |fieldB|..|fieldZ Foo |20120101|25 |NULL |.. |NULL Foo |20120102|26 |27 |.. |NULL Bar |20120303|24 …

2
ユニオンビューをより効率的に実行するにはどうすればよいですか?
私はパフォーマンスの理由でアクティブテーブルとアーカイブテーブルに分割し、直接フィールドマッピングを使用して、アーカイブプロセスを毎晩実行する大きなテーブル(数千から数億レコード)を持っています。 コード内のいくつかの場所で、アクティブテーブルとアーカイブテーブルを結合するクエリを実行する必要があります。ほぼ常に1つ以上のフィールド(両方のテーブルにインデックスを配置している)によってフィルター処理されます。便宜上、次のようなビューがあると理にかなっています。 create view vMyTable_Combined as select * from MyTable_Active union all select * from MyTable_Archive しかし、次のようなクエリを実行すると select * from vMyTable_Combined where IndexedField = @val でフィルタリングする前に、ActiveとStoreのすべてに対して結合を行う@valため、パフォーマンスが低下します。 ユニオン@valを作成する前に、ユニオンビューの2つのサブクエリを各フィルターで作成する賢い方法はありますか? それとも、私が目指していることを達成するために提案する他のアプローチがあるかもしれません。つまり、インデックス付きフィールドによってフィルター処理されたユニオンレコードセットを取得する簡単で効率的な方法ですか。 編集:ここに実行計画があります(そして実際のテーブル名がここに表示されます): 奇妙なことに、アクティブテーブルは実際には正しいインデックス(およびRID検索?)を使用していますが、アーカイブテーブルはテーブルスキャンを実行しています!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.