問題タブ [query-hints]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server-2005 - SQL 2005: NOLOCK ヒントにより読み取りが劇的に増加します。なんてこと?
NOLOCK ヒントがクエリに追加されると、より多くの読み取りを行うストアド プロシージャがあります。私は困惑しています - 理由を知っている人はいますか?
詳細: クエリは次のとおりです。
40,000回の読み取りを行っていましたが、2,000行未満です。これらの読み取りのほとんどは、3 つの TEXT 列が原因であることがわかりました。(それらを省略すると、59 回の読み取りに減少します!) しかし、WITH (NOLOCK) を削除すると、40,000 回の読み取りから 13,000 回に減少します。私は失敗したに違いないと思ったので、これを数回繰り返しましたが、両方の方法で本当に一貫しています。
sql - Query Hint Fast number_rows / FASTFIRSTROW を使用する必要がありますか?
クエリ ヒントのドキュメントを読んでいました: http://msdn.microsoft.com/en-us/library/ms181714(SQL.90).aspx
FAST number_rows 最初の number_rows の高速検索用にクエリが最適化されていることを指定します。これは非負の整数です。最初の number_rows が返された後、クエリは実行を継続し、完全な結果セットを生成します。
したがって、次のようなクエリを実行しているとき:
このようなヒントを気にする必要がありますか?SQL Server 2005 を前提としていますが、いつすべきでしょうか?
- 編集 -
また、結果を制限するときに気にする必要があります。
sql - Oracle LEADING ヒント -- なぜこれが必要なのですか?
突然(残念ながら、「突然」がいつだったのかはわかりません。過去のある時点で正常に実行されたことはわかっています)、クエリの1つが実行にミリ秒ではなく7秒以上かかり始めました。DB リンクを介して 1 つのローカル テーブルと 3 つのテーブルにアクセスしています。3 つのリモート テーブルが結合され、そのうちの 1 つがローカル テーブルと結合されます。
ローカル テーブルの where 句は、単独で実行するのに数ミリしかかからず、少数 (多くても 10 または 100) のレコードしか返しません。3 つのリモート テーブルの間には数十万、場合によっては数百万のレコードがあり、それらを適切に結合すると、数万または数十万のレコードが得られます。
ローカル テーブルの各レコードに関連するいくつかのデータを取得できるように、リモート テーブルとのみ結合しています。
しかし、何が起こっているように見えるかというと、Oracle は最初にリモート テーブルを結合し、次にローカル テーブルを最後にその混乱に結合します。特に現在存在するデータセットを考えると、これは常に悪い考えになるため/*+ LEADING(local_tab remote_tab_1) */
、クエリにヒントを追加したところ、ミリ秒単位で返されるようになりました。
BUFFER SORT
説明計画を比較したところ、リモート テーブルの 1 つを除いてほぼ同じです。
オラクルがこれに間違った方法でアプローチする原因は何でしょうか? 指数の問題ですか?何を探すべきですか?
sql - クエリ ヒント内の 1 つのテーブルの結合ごとに異なるヒントを選択するにはどうすればよいですか?
次のクエリがあるとします。
Ax と Bx と By と Cy と Dz にインデックスがあります
Azにはインデックスがありません
このクエリにヒントを与えて、Ax では INDEX ヒントを使用し、Az では USE_HASH ヒントを使用するにはどうすればよいですか? ヒントは特定の結合ではなくテーブル名のみを取るように思われるため、複数の結合を持つ単一のテーブルを使用する場合、それらすべてに対して単一の戦略しか指定できません。
別の方法として、上記のクエリで LEADING または ORDERED ヒントを使用しているとします。これらのヒントはどちらもテーブル名のみを使用するため、Ax = Bx 結合が Az = Dz 結合の前に確実に行われるようにするにはどうすればよいでしょうか? この場合、D を最初にリストすることができますが、D がその後 E に結合し、DE 結合がクエリ全体で必要な最後の結合であると想像してください。
3 番目の構成 -- Ax 結合をクエリ全体の最初にし、Az 結合を最後にしたいとします。ヒントを使用して、A からの単一の結合を実行し、その後に BC 結合を実行し、最後に AD 結合を実行するにはどうすればよいですか?
sql-server-2008 - インデックスがヒントとして使用されているかどうかを判断する
SQL Server には、クエリ ヒントを使用するオプションがあります。例えば
未使用のインデックスを削除する過程にあり、インデックスがクエリ ヒントとして使用されているかどうかを判断する方法を知りたいと思っていました。これを行う方法について誰か提案がありますか?
乾杯、ジョー
linq-to-sql - Linq to SQLでNOEXPANDヒントを使用するにはどうすればよいですか?
インデックス付きのビューがあり、それを適切に実行するには、noexpandヒントを指定する必要があります。残念ながら、NOLOCKヒントからLinq to SQLで生成されたT-SQLクエリを変更することに関して見られるように、これらのヒントを直接利用する簡単な方法はないようです。
私の考えでは、属性を使用するか、宣言的にdbmlを使用して、このようなものをカスタマイズできるようにすることは理にかなっています。また、Linq toSQLはSQLServerを対象としてのみ機能するように見えるため、これらの高度な機能(存在する場合)も活用できることは理にかなっています。実装に関係なく、私はこの問題を解決するための創造的な方法に興味があります。
sql-server-2008 - SQL Server 2008: VIEW を他の VIEW と結合する: 一時テーブルに頼らずに事前計算する
データベースで変換を実行するために、連鎖した一連のビューを頻繁に使用します。ビュー内には、共通のテーブル式があります。たとえば、次のようになります。
TransformationStep4 付近のどこかで、クエリ プランがより複雑になるため、ビューが遅くなります。これは想定内であり、問題ありません。
しかし、TransformationStep4 の一部をそれ自体に結合したい場合、オプティマイザーがソース テーブルに戻って何らかのインデックスを探しようとするため、クエリの速度が大幅に低下します。通常はこれで問題ありませんが、一時的な結果を保存してそれに結合したい場合もあります。これは、(ストーリーの設計者である)結果テーブルが非常に小さく、結合する方がはるかに高速であることを知っているためです。それの「プリフェッチ」に対して。
サブクエリがプリフェッチされて結合されるような方法でクエリ プランに影響を与えるクエリ ヒントを作成する方法はありますか? それ以外の場合は、ストアド プロシージャの一時テーブルに頼る必要がありますが、できれば避けたいと思います。
私のデザインが悪いと思うときも、提案をありがとう:-)
database - カスタム クエリ ヒントを JPA NamedQueries に割り当てることはできますか
アプリケーションが実行するすべてのクエリにクエリ番号を追加する必要があります。
例: SELECT * FROM ... WHERE ... QUERYNO 123456 ;
OpenJPA はクエリ ヒントをサポートしますが、特定の実装の特定のヒントに対してのみです。
しかし、JPA 仕様と openjpa によると、「無効なヒントまたは特定のデータベースで処理できないヒントは無視されます。それ以外の場合、無効なヒントにより ArgumentException がスローされます。」SO "QUERYNO" をヒントとして指定しても影響はないようです。
実行時に指定するカスタム クエリ ヒントを作成するにはどうすればよいですか?
... Query q = em.createQuery("select m from Magazine m where ... "); q.setHint(" com.me.CustomQueryNoHint ", new Integer(2234)); リスト r = q.getResultList(); ...
sql - 「UPDATEまたはDELETEステートメントのターゲットテーブルに適用されるFROM句で」NOLOCKが無視されるのはなぜですか。
私はBOLフレーズに混乱しています:
「挿入、更新、または削除操作によって変更されたテーブルには、READUNCOMMITTEDおよびNOLOCKを指定できません。SQLServerクエリオプティマイザは、UPDATEまたはDELETEステートメントのターゲットテーブルに適用されるFROM句のREADUNCOMMITTEDおよびNOLOCKヒントを無視します。」[1]
たとえば、私が書く場合
エラー(または警告)なしで実行され、おそらく同等です
これもエラーや警告なしで実行されます。
それは同等ですか?
テーブルは同じですが、FROMでは、論理的にはソーステーブルであり、別の(物理)テーブルとは異なるソーステーブルで書き直した可能性のあるターゲットテーブルではありません。
別のテーブルでNOLOCKを無視する必要があるのはなぜですか?
または、間違っている場合は
、1)と2)でも物理テーブルは同じですが論理的には、「UPDATEまたはDELETEステートメントのターゲットテーブルに適用されるFROM句のNOLOCKヒント」を含むUPDATEの記述方法を質問します。ソース(SELECT内)テーブルとターゲット(UPDATE内)テーブルは異なります。
WITH(NOLOCK)が無視されることを示すUPDATEステートメントを作成するにはどうすればよいですか?
なぜそれをまったく無視する必要があるのですか?無視されますか?
または、それが間違った質問である場合、
なぜ構文は無視されることが保証されているヒントを許可するのですか?
繰り返しになりますが、ドキュメンテーションに書かれているようなステートメントを書くことは不可能(またはそうですか?)であるか、「無視する」という意味がわかりません(無視するという意味は何ですか?またはまったく持つという意味ですか?) ..。。
UPDATE2:
回答は、BOLドキュメント[1]によってアサートされたUPDATEステートメントのFROM句でNOLOCKが無視されない(更新されない)ことを示しています。
さて、この質問の本質:
UPDATEステートメントのFROM句でNOLOCKを無視することが理にかなっている例(コンテキスト)を教えてください。
[1]
テーブルのヒント(Transact-SQL)
SQL Server 2008 R2
http://msdn.microsoft.com/en-us/library/ms187373.aspx
sql-server - ストアド プロシージャと OPTIMIZE FOR UNKNOWN
SQL Server 2008 OPTIMIZE FOR UNKNOWN クエリ ヒントを読みました。私はそれがどのように機能するかを理解しています。
しかし、いつ、どこで使用するかについて質問があります。UDF 内で指定することはできません。ストアド プロシージャ内で指定できます。ただし、このMSDN ブログ投稿には次のように記載されています。
4. クエリをストアド プロシージャに移動すると、それを別のプロシージャ コンテキストに入れることができ、その値をオプティマイザに表示するのに適した方法になります (注: これは SQL 2000 でも機能します)。
これは、ストアド プロシージャに渡されるすべてのパラメーターが「盗聴」され、それによって SQL Server が最適な実行プランをコンパイルするのに役立つと言っているように思えます。これは、キャッシュされたプランが再検討/再コンパイルされることを意味しています (そのメカニズムは不明です)。ただし、OPTIMIZE FOR UNKNOWN の必要性がすべて無効になるため、これは混乱を招きます。
クエリ ヒントに関する MSDN の記事では、私の質問は取り上げられていません。
理想的には、これを解決する Microsoft からの何かへのポインターを使用して、誰かが私のためにこれに答えることができますか? ありがとう。