(Oralce) Web ページめくりの最適化の例
ウェブ|ページめくり|最適化
Web ページめくりの最適化例
作成者: Wanghai
環境:
Linux バージョン 2.4.20-8custom (root@web2) (gcc バージョン 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #3 SMP Thu Jun 5 22:03:36 CST 2003
Mem: 2113466368
Swap: 4194881536
CPU: 2 つのハイパースレッド Intel(R) Xeon(TM) CPU 2.40 GHz
最適化ステートメントの前MySQL でのクエリは約 15 秒かかります。Oracle に転送した後、インデックスとステートメントを調整しない場合、実行時間は約 4 ~ 5 秒です。調整後の実行時間は 0.5 秒未満です。
ページめくりステートメント:
SELECT * FROM (SELECT T1.*, rownum as linenum FROM (
SELECT /*+index(a ind_old)*/
a.category FROM Auction_auctions a WHERE a.category = ' 170101 ' AND a.closed='0' AND ends > sysdate AND (a.approve_status>=0) ORDER BY a.ends) T1 WHERE rownum < 18681) WHERE linenum >= 18641
がクエリされますテーブル: Auction_auctions (商品テーブル)
テーブル構造:
SQL>
名前タイプ
------------ - ------------------------ ----------------------------- - -----
ID NOT NULL VARCHAR2(32)
USERNAME VARCHAR2(32)
TITLE CLOB
GMT_MODIFIED NOT NULL DATE
STARTS NOT NULL DATE
DESCRIPTION CLOB
PICT_ URL CLOB
CATEGORY NOT NULL VARCHAR2(11)
MINIMUM_BID NUMBER
RESERVE_PRICE NUMBER
BUY_NOW NUMBER
AUCTION_TYPE CHAR(1)
DURATION VARCHAR2(7)
INCREMENTNUM NOT NULL BER
CITY VARCHAR2(30)
PROV VARCHAR2( 20)
LOCATION VARCHAR2(40)
LOCATION_ZIP VARCHAR2(6)
SHIPPING CHAR(1)
PAYMENT CLOB
INTERNATIONAL CHAR(1)
ENDS NOT NULL DATE
CURRENT _入札番号
クローズド文字(2) )
PHOTO_UPLOADED CHAR(1)
数量NUMBER(11)
ストーリーCLOB
HAVE_INVOICE NOT NUMBER(1)
HAVE_GUARANTEE NOT NUMBER(1)
STUFF_STAT米国は NULL ではありません (1)
APPROVE_STATUS NOT NULL NUMBER (1)
OLD_STARTS NOT NULL DATE
ZOO VARCHAR2(10)
PROMOTED_STATUS NOT NULL NUMBER(1)
REPOST_TYPE CHAR(1)
REPOST_TIMES NOT NULL NUMBER(4)
SECURE_TRA DE_AGREE が NULL ではありません(1)
SECURE_TRADE_TRANSACTION_FEE VARCHAR2(16)
SECURE_TRADE_ORDINARY_POST_FEE NUMBER
SECURE_TRADE_FAST_POST_FEE NUMBER
テーブルレコード番号とサイズ
SQL> ; オークション_オークションからカウント (*) を選択します
- --- ------
537351
SQL>segment_name,bytes,blocks from user_segments wheresegment_name ='AUCTION_AUCTIONS';
SEGMENT_NAME BYTES BLOCKS
AUCTION_AUCTIONS 1059 06 1760 129280
テーブルインデックスのオリジナル
auctions(closed,approve_status,category,ends) テーブルスペースにインデックス ind_old を作成します
SQL> selectsegment_name,bytes,blocks from user_segments wheresegment_name = 'IND_OLD';
SEGMENT_NAME BYTES BLOCKS
IND_OLD 20971520 2560
SQL 実行のコストを見てみましょう
SQL> SELECT * FROM (SELECT T1.*, rownum as linenum FROM (SELECT a.* FROM Auction_auctions a WHERE a.category like '18%' AND a.closed='0' AND ends > sysdate AND (a.approve_status>=0) ORDER BY a.ends) T1 WHERE rownum = 18641;
40 行が選択されました
--------------------- ----- -----------------------------
0 SELECT ステートメント オプティマイザー=選択 (コスト=19152 カード= 18347 バイト
es =190698718)
1 0 ビュー (コスト=19152 カード=18347 バイト=190698718)
2 1 カウント (ストップキー)
3 2 ビュー (コスト=19152)カード=18347バイト=19046020 7 )
4 3 'AUCTION_AUCTIONS' のテーブル アクセス (インデックス ROWID による)
(コスト = 19152 カード = 18347 バイト = 20860539)
5 4 'IND_OLD' のインデックス (範囲スキャン) (非一意) ) (コスト
=810 カード =186003)
統計
-------------------------------- -------- -------
0 再帰呼び出し
0 db ブロック取得
19437 一貫性取得
18262 物理読み取り
0 REDO サイズ
SQL*Net を介してクライアントに送信された 114300 バイト
SQL*Net を介してクライアントから受信された 56356 バイト
435 SQL*Net がクライアントとの間で往復する往復数
0 ソート (メモリ)
0 ソート (ディスク)
40行が処理されました
この SQL ステートメントは、インデックス範囲スキャンを通じて最も内側の結果セットを見つけ、最後に 2 つのビュー操作を通じてデータを取得していることがわかります。そのうち、18502 件の一貫した取得と 17901 件の物理読み取り
まず、各検索列の個別の値を見てみましょう
select count(distinct ends) from Auction_auctions;
COUNT (個別)
--------
338965
SQL> オークション_オークションからカウント(個別のカテゴリ) を選択します
COUNT( DISTINCTCATEGORY)
-----------------------
1148
SQL> オークション_オークションからカウント (終了済み) を選択します
COUNT; (DISTINCTCLOSED )
---------------------
2
SQL> オークション_オークションからカウント(個別の承認ステータス) を選択します
COUNT(DISTINCTAPPROVE_STATUS)
-----------------------------
5
ページインデックス内の列の平均保存長
SQL> オークション_オークションから avg(vsize(ends)) を選択します
AVG(VSIZE(ENDS))
----------------
7
SQL> ; オークション_オークションから avg(vsize (クローズド)) を選択します
AVG(VSIZE(クローズド))
-----------------
2
SQL> オークション_オークションから avg( vsize(category)) を選択
AVG(VSIZE(CATEGORY))
---------------------
5.52313106
SQL> Auction_auctions から avg(vsize(approve_status)) を選択
AVG(VSIZE(APPROVE_STATUS))
--------------------- -----
1.67639401
さまざまな結合インデックスのサイズを推定してみましょう。closed、approve_status、category はすべて比較的低いセットの可能性を持つ列 (より多くの繰り返し値) であることがわかります。ページインデックスに必要なスペース
column 個別の num 列 len
ends 338965 7
category 1148 5.5
closed 2 2
approve_status 5 1.7
Index1: (終了、クローズ、カテゴリ、承認ステータス) 圧縮2
終了: 個別の番号 --- 338965
終了: 個別の番号 --- 2
インデックス サイズ= 338965*2*(9+2)+ 537351*(1.7+5.5+6)=14603998
index2: (closed,category,ends,approve_status)
closed: 個別の番号 --- 2
カテゴリ: 個別の番号 --- 1148
index size=2*1148*(2+5.5)+537351*( 7+1.7+6)=7916279
index3: (closed,approve_status,category,ends)
closed: 個別の番号---2
approve_status: 個別の番号-5
index size=2*5* (2+1.7)+537351*(7+5.5+6)=9941030
結果は、index2: (closed,category,ends,approve_status) が最小のインデックスです
見てみましょうステートメントを再度実行します
SELECT * FROM (SELECT T1.*, rownum as linenum FROM (SELECT a.* FROM Auction_auctions a WHERE a.category like '18%' AND a.closed='0' AND ends > sysdate AND ( a.approve_status>= 0) ORDER BY a.ends) T1 WHERE rownum <18681) WHERE linenum >= 18641;
まず、最も内側の結果から、この SQL ステートメントには最適化の余地がたくさんあることがわかります。 set SELECT a.* FROM Auction_auctions a WHERE a.category like '18%' AND a.closed='0' AND ends > sysdate AND (a.approve_status>=0) ORDER BY a.ends、ここではインデックスになりますこの場合、条件を満たすデータが大量にある場合は、
SELECT a.rowid FROM Auction_auctions a WHERE a のように書き換えることができます。 category like '18%' AND a.closed='0' AND ends > sysdate AND ( a.approve_status>=0) ORDER BY a.ends
この場合、最も内側の結果セットにはインデックス高速フル スキャンのみが必要です。完了したら、次のステートメントを取得するように書き換えます
select * from Auction_auctions where rowid in (SELECT Rid FROM (
SELECT T1.rowid Rid, rownum as linenum FROM
(SELECT a.rowid FROM Auction_auctions a WHERE a.category like '18%' AND a.closed='0' AND ends > sysdate AND
(a.approve_status>=0) ORDER BY a.ends) T1 WHERE rownum < 18681) WHERE linenum >= 18641)
このインデックスのクエリオーバーヘッドをテストしてみましょう
select * from Auction_auctions where rowid in (SELECT Rid FROM (
SELECT T1.rowid Rid, rownum as linenum FROM
(SELECT a.rowid FROM) Auction_auctions a WHERE a.category like '18%' AND a.closed='0' AND ends > sysdate AND
(a.approve_status>=0) ORDER BY a.closed,a.ends) T1 WHERE rownum < 18681) WHERE linenum >= 18641)
実行計画
----- ---------------------------- -------------------- ---
0 SELECT ステートメント オプティマイザー=選択 (コスト=18698 カード=18344 バイト
es=21224008)
1 0 ネストされたループ (コスト = 18698 カード = 18344 バイト = 21224008)
2 1 ビュー (コスト=264 カード=18344 バイト=366880)
3 2 ソート (ユニーク)
4 3 カウント (ストップキー)
5 4 ビュー (コスト=264 カード=18344 バイト=128408)
6 5ソート (ストップキーによる順序) (コスト = 264 カード = 18344 バイト
es=440256)
7 6 'IDX_AUCTION_BROWSE' のインデックス (高速フルスキャン)
(非固有) (コスト = 159 カード = 18344バイト=440256)
8 1 「AUCTION_AUCTIONS」のテーブルアクセス(ユーザーROWIDによる) (コスト
=1カード=1バイト=1137)
統計
-------- -------------------------------------------------
0 再帰呼び出し
0 db ブロック取得
2080 一貫性取得
1516 物理読み取り
0 REDO サイズ
SQL*Net 経由でクライアントに送信された 114840 バイト
クライアントから SQL*Net 経由で受信された 56779 バイト
438クライアントとの間の SQL*Net ラウンドトリップ
2 ソート (メモリ)
0 ソート (ディスク)
40 行処理
一貫した取得が確認可能 19437 から 2080、物理読み取りが 18262 から 1516 に減少チェック時間も 4 秒ほどで 0 になります。5 秒以降、この SQL 調整は予定された効果を再度取得している可能性があります。 select * from Auction_auctions where rowid in
2 (SELECT Rid FROM (
3 SELECT T1.rowid Rid, rownum as linenum FROM
4 (SELECT a.rowid FROM Auction_auctions a
5 WHERE a.category like '18% ' AND a.closed='0' AND ends > sysdate AND
a.approve_status>=0
6 7 ORDER BY a.closed,a.category,a.ends) T1
8 WHERE rownum = 18560) ;
40 行が選択されました。
実行計画
------------------------------------------ ----------------
0 SELECT ステートメント オプティマイザー=選択 (コスト=17912 カード=17604 バイト
es=20367828)
1 0 ネストされたループ (コスト=17912)カード=17604 バイト=20367828)
2 1 ビュー (コスト=221 カード=17604 バイト=352080)
3 2 ソート (ユニーク)
4 3 カウント (ストップキー)
5 4 ビュー (コスト=221 カード= 17604 バイト=123228)
6 5 'IDX_AUCTION_BROWSE' のインデックス (範囲スキャン) (非
一意) (コスト = 221 カード = 17604 バイト = 422496)
7 1 テーブルアクセス (ユーザー ROWID 別) )OF 'AUCTION_AUCTIONS' (コスト
=1 カード = 1 バイト = 1137)
統計
------------------------------------- -----------------------------
0 再帰呼び出し
0 db ブロック取得
550 一貫性取得
14物理読み取り数
0 やり直しサイズ
117106 SQL*Net 経由でクライアントに送信されたバイト数
56497 クライアントから SQL*Net 経由で受信されたバイト数
436 SQL*Net がクライアントとの間で往復する往復数
1 ソート (メモリ)
0ソート (ディスク)
40 行処理されました
在order by里加上インデックス前导列、消除完了
6 5 SORT (ORDER BY STOPKEY) (コスト=264 カード=18344 バイト
es=440256)
、一貫した取得結果 2080 が 550 に落ちました

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

jquery で select 要素を非表示にする方法: 1. hide() メソッド。jQuery ライブラリを HTML ページに導入します。さまざまなセレクターを使用して select 要素を非表示にできます。ID セレクターは、selectId を選択した select 要素の ID に置き換えます。実際に使用する; 2. css() メソッド、ID セレクターを使用して非表示にする必要がある select 要素を選択し、css() メソッドを使用して表示属性を none に設定し、selectId を select 要素の ID に置き換えます。

golang を使用した SelectChannelsGo 同時プログラミングの非同期処理方法 はじめに: 同時プログラミングは、アプリケーションのパフォーマンスと応答性を効果的に向上させることができる、現代のソフトウェア開発における重要な領域です。 Go 言語では、Channel と Select ステートメントを使用して同時プログラミングを簡単かつ効率的に実装できます。この記事では、SelectChannelsGo 同時プログラミングの非同期処理メソッドに golang を使用する方法を紹介し、具体的な方法を提供します。

オークション通貨とは何ですか? AUCTION 通貨は、オークション通貨とも呼ばれる暗号通貨です。オークションという会社が発行・管理しています。 AUCTION通貨は仮想通貨市場全体で大きな注目を集めており、多くの投資家やトレーダーの注目を集めています。この記事では、AUCTION 通貨の基本的な概念、特徴、用途について説明します。基本的な考え方 オークション通貨は、ブロックチェーン技術をベースとしたデジタル通貨です。分散型アプローチを採用し、従来の金融システムの制限や監視を回避し、ユーザーにプライバシーとセキュリティを提供します。 AUCTION 通貨はスマート コントラクトを通じて実装されるため、サードパーティの介入を必要とせずに取引を実行できます。機能A

jQuery は、DOM 操作、イベント処理、アニメーション効果などを簡素化するために使用できる人気のある JavaScript ライブラリです。 Web 開発では、選択した要素のイベント バインディングを変更する必要がある状況によく遭遇します。この記事では、jQuery を使用して選択要素変更イベントをバインドする方法を紹介し、具体的なコード例を示します。まず、ラベルを使用してオプションを含むドロップダウン メニューを作成する必要があります。

select を使用すると、開発者は複数のファイル バッファーを同時に待機できるため、IO 待機時間を短縮し、プロセスの IO 効率を向上させることができます。 select() 関数は、プログラムが複数のファイル記述子を監視し、監視されている 1 つ以上のファイル記述子が「準備完了」になるのを待機できるようにする IO 多重化関数です。いわゆる「準備完了」状態とは、ファイルを指します。記述子はブロックされなくなり、読み取り可能、書き込み可能、例外を含む特定の種類の IO 操作に使用できるようになりました。 select は、ヘッダー ファイル #include にあるコンピューター関数です。この関数は、ファイル記述子の変更 (読み取り、書き込み、または例外) を監視するために使用されます。 1. セレクト機能の概要 セレクト機能はIO多重化機能です。

1. SQL ステートメント内のキーワードは大文字と小文字を区別せず、SELECT は SELECT と同等、FROM は from と同等です。 2. users テーブルからすべての列を選択するには、記号 * を使用して列名を置き換えます。構文 -- これはコメントです -- FEOM で指定された [テーブル] から [すべての] データをクエリします * は [すべての列] を意味します SELECT*FROM -- 指定された [テーブル] から指定されたデータを FROM データからクエリします列名 (フィールド) SELECT 列名 FROM テーブル名 インスタンス -- 注: 複数の列を区切るには英語のカンマを使用してください。 selectusername、passwordfrom

こんにちは、以下は 1500 ワード以内の記事です。タイトルは「Youcan'tspecifytargettable'table_name'forupdateinFROMclause-MySQL エラーの解決方法: FROM 句のターゲット テーブルを更新できません。具体的なコード例が必要です」です。 MySQL データベースの開発中に、次のエラー メッセージが表示されることがあります。

golang による SelectChannels の実装 Go 同時プログラミングのパフォーマンスの最適化 Go 言語では、ゴルーチンとチャネルを使用して同時プログラミングを実装するのが非常に一般的です。複数のチャネルを扱う場合、通常は多重化に select ステートメントを使用します。ただし、大規模な同時実行の場合、select ステートメントを使用するとパフォーマンスが低下する可能性があります。この記事では、golang による select の実装をいくつか紹介します。
