ホームページ php教程 php手册 (Oralce) Web ページめくりの最適化の例

(Oralce) Web ページめくりの最適化の例

Jun 21, 2016 am 09:15 AM
auction from select

ウェブ|ページめくり|最適化

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 に落ちました














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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

jqueryでselect要素を非表示にする方法 jqueryでselect要素を非表示にする方法 Aug 15, 2023 pm 01:56 PM

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

Select Channels Goの非同期処理方法 golangを使った並行プログラミング Select Channels Goの非同期処理方法 golangを使った並行プログラミング Sep 28, 2023 pm 05:27 PM

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

オークションとは何の通貨ですか? オークションとは何の通貨ですか? Feb 25, 2024 am 10:00 AM

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

jQueryで選択要素の変更イベントバインディングを実装する方法 jQueryで選択要素の変更イベントバインディングを実装する方法 Feb 23, 2024 pm 01:12 PM

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

Linux が select を使用する理由は何ですか? Linux が select を使用する理由は何ですか? May 19, 2023 pm 03:07 PM

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

mysqlのselect構文の使い方 mysqlのselect構文の使い方 Jun 01, 2023 pm 07:37 PM

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

FROM 句で更新するターゲット テーブル 'table_name' を指定できません - MySQL エラーの解決方法: FROM 句でターゲット テーブルを更新できません FROM 句で更新するターゲット テーブル 'table_name' を指定できません - MySQL エラーの解決方法: FROM 句でターゲット テーブルを更新できません Oct 05, 2023 am 10:25 AM

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

選択チャネルの実装 golang による同時プログラミングのパフォーマンス最適化 選択チャネルの実装 golang による同時プログラミングのパフォーマンス最適化 Sep 27, 2023 pm 01:09 PM

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

See all articles