ホームページ  >  記事  >  データベース  >  SQL データベース ステートメントの最適化分析と最適化手法の概要 (SQL 最適化ツール)

SQL データベース ステートメントの最適化分析と最適化手法の概要 (SQL 最適化ツール)

php是最好的语言
php是最好的语言オリジナル
2018-08-03 17:37:099690ブラウズ

通常、SQL データベースは最適化および分析する必要がありますが、SQL 最適化のいくつかの方法についてはここでは詳しく紹介しません。また、最適化ツール SQL Tuning Expert for Oracle も付属しています。使用方法としては、まずデータベース最適化のいくつかの原則に従う必要があります:

1. インデックスの失敗を引き起こすため、結合を使用する必要があります。複雑な結合クエリを複数のクエリに分割しながら、小さな結果セットを使用して大きな結果セットを駆動します。そうしないと、結合するテーブルが増えるほど、ロックや輻輳が発生します。

3. ファジー クエリの使用に注意し、%% の使用を避けてください。たとえば、select * from a where name like '%de%';

置換ステートメント: select * from a where name >= ' de' と name < ; 'df';

4. クエリが必要なフィールドのみをリストし、メモリを節約するために select * from... を使用しないでください。

insert into a (id ,name)
values(2,&#39;a&#39;),
(3,&#39;s&#39;);

6.limit ベースは比較的大きいです

7. ランダムにレコードを取得するために rand 関数を使用しないでください。テーブルを構築するときに null を使用しないでください。

9. count(id) ではなく count(*) を使用します

10. 不要なソートを行わず、可能な限りインデックス内でソートを完了します

まず SQL を見てみましょう:

 select
                    ii.product_id, 
                    p.product_name, 
                    count(distinct pim.pallet_id) count_pallet_id, 
                    if(round(sum(itg.quantity),2) > -1 && round(sum(itg.quantity),2) < 0.005, 0, round(sum(itg.quantity),2)) quantity,
                    round(ifnull(sum(itag.locked_quantity), 0.00000),2) locked_quantity,
                    pc.container_unit_code_name,
                    if(round(sum(itg.qoh),2) > -1 && round(sum(itg.qoh),2) < 0.005, 0, round(sum(itg.qoh),2)) qoh,
                    round(ifnull(sum(itag.locked_qoh), 0.00000),2) locked_qoh,
                    p.unit_code,
                    p.unit_code_name
                from (select 
                        it.inventory_item_id item_id, 
                        sum(it.quantity) quantity, 
                        sum(it.real_quantity) qoh 
                    from 
                        ws_inventory_transaction it
                    where 
                        it.enabled = 1 
                    group by 
                        it.inventory_item_id  
                    ) itg 
                    left join (select 
                                    ita.inventory_item_id item_id, 
                                    sum(ita.quantity) locked_quantity, 
                                    sum(ita.real_quantity) locked_qoh 
                               from 
                                    ws_inventory_transaction_action ita
                               where 
                                    1=1 and ita.type in (&#39;locked&#39;, &#39;release&#39;) 
                               group by 
                                    ita.inventory_item_id 
                               )itag on itg.item_id = itag.item_id
                    inner join ws_inventory_item ii on itg.item_id = ii.inventory_item_id 
                    inner join ws_pallet_item_mapping pim on ii.inventory_item_id = pim.inventory_item_id  
                    inner join ws_product p on ii.product_id = p.product_id and p.status = &#39;OK&#39;
                    left join ws_product_container pc on ii.container_id = pc.container_id
//总起来说关联太多表,设计表时可以多一些冗余字段,减少表之间的关联查询;
                where 
                    ii.inventory_type = &#39;raw_material&#39; and 
                    ii.inventory_status = &#39;in_stock&#39; and 
                    ii.facility_id = &#39;25&#39; and 
                    datediff(now(),ii.last_updated_time) < 3  //违反了第一个原则
                     and p.product_type = &#39;goods&#39;
                     and p.product_name like &#39;%果%&#39;   // 违反原则3

                group by 
                    ii.product_id
                having 
                    qoh < 0.005
                order by 
                    qoh desc

上記の SQL では、クエリに非常に悪影響を与えるサブクエリを使用しました。

より良い方法は次のステートメントです:

1. from ステートメントではサブクエリを使用しないでください。

2. 検索範囲を制限して狭める場合は、より多くのインデックスを使用します。

ツール SQL Tuning Expert を使用します。 for Oracle は SQL ステートメントを最適化します

SQL 開発者や DBA にとって、ビジネス ニーズに基づいて正しい SQL を作成するのは簡単です。では、SQL の実行パフォーマンスはどうでしょうか?より高速に実行できるように最適化できますか?上級DBAでないと自信がない人も多いのではないでしょうか。

幸いなことに、自動最適化ツールがこの問題の解決に役立ちます。これが今日紹介する Tosska SQL Tuning Expert for Oracle ツールです。 ダウンロード

https://tosska.com/tosska-sql-tuning-expert-tse-oracle-free-download/

このツールの発明者は、Dell の元チーフ エンジニアである Richard To です。 20 年以上の SQL 経験 最適化の経験。

1. データベース接続を作成します。これは後で作成することもできます。接続情報を入力し、「接続」ボタンをクリックします。 Oracle クライアントをインストールし、Oracle クライアント上で TNS を構成している場合は、このウィンドウで「接続モード」として「TNS」を選択し、「データベース エイリアス」でデータベース エイリアスとして構成された TNS を選択できます。


Oracle クライアントをインストールしていない場合、または Oracle クライアントをインストールしたくない場合は、「接続モード」として「基本タイプ」を選択し、データベースサーバーの IP、ポート、サービス名のみが必要です。


2. パフォーマンスに問題がある SQL を入力します。

3. [調整] ボタンをクリックすると、同等の SQL が多数自動的に生成され、実行が開始されます。テストはまだ完了していませんが、SQL 20 のパフォーマンスが 100% 向上していることがすでに確認できます。

SQL データベース ステートメントの最適化分析と最適化手法の概要 (SQL 最適化ツール)

SQL 20 を詳しく見てみましょう。SQL 20 は 2 つのヒントを使用し、最も速い実行速度を実現します。元の SQL には 0.99 秒かかりますが、最適化された SQL の実行時間は 0 秒に近くなります。

この SQL はデータベース内で毎日数万回実行されるため、最適化後はデータベースの実行時間を約 165 秒節約できます。

SQL データベース ステートメントの最適化分析と最適化手法の概要 (SQL 最適化ツール)最後に、アプリケーションのソース コード内のパフォーマンスの問題がある SQL を同等の SQL 20 に置き換えます。アプリケーションを再コンパイルし、パフォーマンスが向上しました。

調整タスクは正常に完了しました。

関連記事: SQL データベース ステートメントの最適化分析と最適化手法の概要 (SQL 最適化ツール)

SQL パフォーマンスの最適化の概要と SQL ステートメントの最適化の記事

SQL ステートメント最適化の原則、SQL ステートメントの最適化

関連ビデオ:

MySQL 最適化ビデオ チュートリアル — ブール教育

以上がSQL データベース ステートメントの最適化分析と最適化手法の概要 (SQL 最適化ツール)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。