:meta-keywords: cubrid update statistics, cubrid check statistics, query plan, query profiling, sql hint, cubrid index hint, cubrid special index, cubrid using index :meta-description: How to optimize query execution in CUBRID database. Updating Statistics =================== Statistics for tables and indexes enables queries of the database system to process efficiently. Statistics are not updated automatically for DDL statements such as **CREATE INDEX**, **CREATE TABLE** and DML statements such as **INSERT** and **DELETE**. **UPDATE STATISTICS** statement is the only way to update statistics. So it is necessary to update the statistics by **UPDATE STATISTICS** statement(See :ref:`info-stats`). **UPDATE STATISTICS** statement is recommended to be executed periodically. It is also recommended to execute when a new index is added or when a mass of **INSERT** or **DELETE** statements make the big difference between the statistics and the actual information. :: UPDATE STATISTICS ON class-name[, class-name, ...] [WITH FULLSCAN]; UPDATE STATISTICS ON ALL CLASSES [WITH FULLSCAN]; UPDATE STATISTICS ON CATALOG CLASSES [WITH FULLSCAN]; * **WITH FULLSCAN**: It updates the statistics with all the data in the specified table. If this is omitted, it updates the statistics with sampling data. The sampling data is 7 pages regardless of total pages of table. .. note:: From 10.0 version, on the HA environment, **UPDATE STATISTICS** on the master node is replicated to the slave/replica node. * **ALL CLASSES**: If the **ALL CLASSES** keyword is specified, the statistics on all the tables existing in the database are updated. * **CATALOG CLASSES**: It updates the statistics of the catalog tables. .. code-block:: sql CREATE TABLE foo (a INT, b INT); CREATE INDEX idx1 ON foo (a); CREATE INDEX idx2 ON foo (b); UPDATE STATISTICS ON foo; UPDATE STATISTICS ON foo WITH FULLSCAN; UPDATE STATISTICS ON ALL CLASSES; UPDATE STATISTICS ON ALL CLASSES WITH FULLSCAN; UPDATE STATISTICS ON CATALOG CLASSES; UPDATE STATISTICS ON CATALOG CLASSES WITH FULLSCAN; When starting and ending an update of statistics information, NOTIFICATION message is written on the server error log. You can check the updating term of statistics information by these two messages. :: Time: 05/07/13 15:06:25.052 - NOTIFICATION *** file ../../src/storage/statistics_sr.c, line 123 CODE = -1114 Tran = 1, CLIENT = testhost:csql(21060), EID = 4 Started to update statistics (class "code", oid : 0|522|3). Time: 05/07/13 15:06:25.053 - NOTIFICATION *** file ../../src/storage/statistics_sr.c, line 330 CODE = -1115 Tran = 1, CLIENT = testhost:csql(21060), EID = 5 Finished to update statistics (class "code", oid : 0|522|3, error code : 0). .. _info-stats: Checking Statistics Information =============================== You can check the statistics Information with the session command of the CSQL Interpreter. :: csql> ;info stats table_name * *table_name*: Table name to check the statistics Information The following shows the statistical information of *t1* table in CSQL interpreter. .. code-block:: sql CREATE TABLE t1 (code INT); INSERT INTO t1 VALUES(1),(2),(3),(4),(5); CREATE INDEX i_t1_code ON t1(code); UPDATE STATISTICS ON t1; :: ;info stats t1 CLASS STATISTICS **************** Class name: t1 Timestamp: Mon Mar 14 16:26:40 2011 Total pages in class heap: 1 Total objects: 5 Number of attributes: 1 Attribute: code id: 0 Type: DB_TYPE_INTEGER Minimum value: 1 Maximum value: 5 B+tree statistics: BTID: { 0 , 1049 } Cardinality: 5 (5) , Total pages: 2 , Leaf pages: 1 , Height: 2 .. _viewing-query-plan: Viewing Query Plan ================== To view a query plan for a CUBRID SQL query, you can use following methods. * Press "show plan" button on CUBRID Manager. .. image:: /images/query_plan_on_CM.png * Change the value of the optimization level by running ";plan simple" or ";plan detail" on CSQL interpreter, or by using the **SET OPTIMIZATION** statement. You can get the current optimization level value by using the **GET OPTIMIZATION** statement. For details on CSQL Interpreter, see :ref:`csql-session-commands`. **SET OPTIMIZATION** or **GET OPTIMIZATION LEVEL** syntax is as following. :: SET OPTIMIZATION LEVEL opt-level [;] GET OPTIMIZATION LEVEL [ { TO | INTO } variable ] [;] * *opt-level* : A value that specifies the optimization level. It has the following meanings. * 0: Does not perform query optimization. The query is executed using the simplest query plan. This value is used only for debugging. * 1: Creates a query plan by performing query optimization and executes the query. This is a default value used in CUBRID, and does not have to be changed in most cases. * 2: Creates a query plan by performing query optimization. However, the query itself is not executed. In general, this value is not used; it is used together with the following values to be set for viewing query plans. * 257: Performs query optimization and outputs the created query plan. This value works for displaying the query plan by internally interpreting the value as 256+1 related with the value 1. * 258: Performs query optimization and outputs the created query plan, but does not execute the query. That is, this value works for displaying the query plan by internally interpreting the value as 256+2 related with the value 2. This setting is useful to examine the query plan but not to intend to see the query results. * 513: Performs query optimization and outputs the detailed query plan. This value works for displaying more detailed query plan than the value 257 by internally interpreting the value as 512+1. * 514: Performs query optimization and outputs the detailed query plan. However, the query is not executed. This value works for displaying more detailed query plan than the value 258 by internally interpreting the value as 512+2. .. note:: If you configure the optimization level as not executing the query like 2, 258, or 514, all queries(not only SELECT, but also INSERT, UPDATE, DELETE, REPLACE, TRIGGER, SERIAL, etc.) are not executed. The CUBRID query optimizer determines whether to perform query optimization and output the query plan by referring to the optimization level value set by the user. The following shows the result which ran the query after inputting ";plan simple" or "SET OPTIMIZATION LEVEL 257;" in CSQL. .. code-block:: sql SET OPTIMIZATION LEVEL 257; -- csql> ;plan simple SELECT /*+ RECOMPILE */ DISTINCT h.host_year, o.host_nation FROM history h INNER JOIN olympic o ON h.host_year = o.host_year AND o.host_year > 1950; :: Query plan: Sort(distinct) Nested-loop join(h.host_year=o.host_year) Index scan(olympic o, pk_olympic_host_year, (o.host_year> ?:0 )) Sequential scan(history h) * Sort(distinct): Perform DISTINCT. * Nested-loop join: Join method is Nested-loop. * Index scan: Perform index-scan by using pk_olympic_host_year index about olympic table. At that time, the condition which used this index is "o.host_year > ?". The following shows the result which ran the query after inputting ";plan detail" or "SET OPTIMIZATION LEVEL 513;" in CSQL. .. code-block:: sql SET OPTIMIZATION LEVEL 513; -- csql> ;plan detail SELECT /*+ RECOMPILE */ DISTINCT h.host_year, o.host_nation FROM history h INNER JOIN olympic o ON h.host_year = o.host_year AND o.host_year > 1950; :: Join graph segments (f indicates final): seg[0]: [0] seg[1]: host_year[0] (f) seg[2]: [1] seg[3]: host_nation[1] (f) seg[4]: host_year[1] Join graph nodes: node[0]: history h(147/1) node[1]: olympic o(25/1) (sargs 1) Join graph equivalence classes: eqclass[0]: host_year[0] host_year[1] Join graph edges: term[0]: h.host_year=o.host_year (sel 0.04) (join term) (mergeable) (inner-join) (indexable host_year[1]) (loc 0) Join graph terms: term[1]: o.host_year range (1950 gt_inf max) (sel 0.1) (rank 2) (sarg term) (not-join eligible) (indexable host_year[1]) (loc 0) Query plan: temp(distinct) subplan: nl-join (inner join) edge: term[0] outer: iscan class: o node[1] index: pk_olympic_host_year term[1] cost: 1 card 2 inner: sscan class: h node[0] sargs: term[0] cost: 1 card 147 cost: 3 card 15 cost: 9 card 15 Query stmt: select distinct h.host_year, o.host_nation from history h, olympic o where h.host_year=o.host_year and (o.host_year> ?:0 ) On the above output, the information which is related to the query plan is "Query plan:". Query plan is performed sequentially from the inside above line. In other words, "outer: iscan -> inner:scan" is repeatedly performed and at last, "temp(distinct)" is performed. "Join graph segments" is used for checking more information on "Query plan:". For example, "term[0]" in "Query plan:" is represented as "term[0]: h.host_year=o.host_year (sel 0.04) (join term) (mergeable) (inner-join) (indexable host_year[1]) (loc 0)" in "Join graph segments". The following shows the explanation of the above items of "Query plan:". * temp(distinct): (distinct) means that CUBRID performs DISTINCT query. temp means that it saves the result to the temporary space. * nl-join: "nl-join" means nested loop join. * (inner join): join type is "inner join". * outer: iscan: performs iscan(index scan) in the outer table. * class: o node[1]: It uses o table. For details, see node[1] of "Join graph segments". * index: pk_olympic_host_year term[1]: use pk_olympic_host_year index and for details, see term[1] of "Join graph segments". * cost: a cost to perform this syntax. * card: It means cardinality. Note that this is an approximate value. * inner: sscan: It performs sscan(sequential scan) in the inner table. * class: h node[0]: It uses h table. For details, see node[0] of "Join graph segments". * sargs: term[0]: sargs represent data filter(WHERE condition which does not use an index); it means that term[0] is the condition used as data filter. * cost: A cost to perform this syntax. * card: It means cardinality. Note that this is an approximate value. * cost: A cost to perform all syntaxes. It includes the previously performed cost. * card: It means cardinality. Note that this is an approximate value. **Query Plan Related Terms** The following show the meaning for each term which is printed as a query plan. * Join method: It is printed as "nl-join" on the above. The following are the join methods which are printed on the query plan. * nl-join: Nested loop join * m-join: Sort merge join * idx_join: Nested loop join, and it is a join which uses an index in the inner table as reading rows of the outer table. * Join type: It is printed as "(inner join)" on the above. The following are the join types which are printed on the query plan. * inner join * left outer join * right outer join: On the query plan, the different "outer" direction with the query's direction can be printed. For example, even if you specified "right outer" on the query, but "left outer" can be printed on the query plan. * cross join * Types of join tables: It is printed as outer or inner on the above. They are separated as outer table and inner table which are based on the position on either side of the loop, on the nested loop join. * outer table: The first base table to read when joining. * inner table: The target table to read later when joining. * Scan method: It is printed as iscan or sscan. You can judge that if the query uses index or not. * sscan: sequential scan. Also it can be called as full table scan; it scans all of the table without using an index. * iscan: index scan. It limits the range to scan by using an index. * cost: It internally calculate the cost related to CPU, IO etc., mainly the use of resources. * card: It means cardinality. It is a number of rows which are predicted as selected. The following is an example of performing m-join(sort merge join) as specifying USE_MERGE hint. In general, sort merge join is used when sorting and merging an outer table and an inner table is judged as having an advantage than performing nested loop join. In most cases, it is desired that you do not perform sort merge join. .. note:: From 9.3 version, if USE_MERGE hint is not specified or the **optimizer_enable_merge_join** parameter of cubrid.conf is not specified as yes, sort merge join will not be considered to be applied. .. CUBRIDSUS-13186: merge join will be deprecated .. code-block:: sql SET OPTIMIZATION LEVEL 513; -- csql> ;plan detail SELECT /*+ RECOMPILE USE_MERGE*/ DISTINCT h.host_year, o.host_nation FROM history h LEFT OUTER JOIN olympic o ON h.host_year = o.host_year AND o.host_year > 1950; :: Query plan: temp(distinct) subplan: temp order: host_year[0] subplan: m-join (left outer join) edge: term[0] outer: temp order: host_year[0] subplan: sscan class: h node[0] cost: 1 card 147 cost: 10 card 147 inner: temp order: host_year[1] subplan: iscan class: o node[1] index: pk_olympic_host_year term[1] cost: 1 card 2 cost: 7 card 2 cost: 18 card 147 cost: 24 card 147 cost: 30 card 147 The following performs the idx-join(index join). If performing join by using an index of inner table is judged as having an advantage, you can ensure performing idx-join by specifying **USE_IDX** hint. .. code-block:: sql SET OPTIMIZATION LEVEL 513; -- csql> ;plan detail CREATE INDEX i_history_host_year ON history(host_year); SELECT /*+ RECOMPILE */ DISTINCT h.host_year, o.host_nation FROM history h INNER JOIN olympic o ON h.host_year = o.host_year; :: Query plan: temp(distinct) subplan: idx-join (inner join) outer: sscan class: o node[1] cost: 1 card 25 inner: iscan class: h node[0] index: i_history_host_year term[0] (covers) cost: 1 card 147 cost: 2 card 147 cost: 9 card 147 On the above query plan, "(covers)" is printed on the "index: i_history_host_year term[0]" of "inner: iscan", it means that :ref:`covering-index` functionality is applied. In other words, it does not retrieve data storage additionally because there are required data inside the index in inner table. If you ensure that left table's row number is a lot smaller than the right table's row number on the join tables, you can specify **ORDERED** hint. Then always the left table will be outer table, and the right table will be inner table. .. code-block:: sql SELECT /*+ RECOMPILE ORDERED */ DISTINCT h.host_year, o.host_nation FROM history h INNER JOIN olympic o ON h.host_year = o.host_year; .. _query-profiling: Query Profiling =============== If the performance analysis of SQL is required, you can use query profiling feature. To use query profiling, specify SQL trace with **SET TRACE ON** syntax; to print out the profiling result, run **SHOW TRACE** syntax. And if you want to always include the query plan when you run **SHOW TRACE**, you need to add /\*+ RECOMPILE \*/ hint on the query. The format of **SET TRACE ON** syntax is as follows. :: SET TRACE {ON | OFF} [OUTPUT {TEXT | JSON}] * ON: set on SQL trace. * OFF: set off SQL trace. * OUTPUT TEXT: print out as a general TEXT format. If you omit OUTPUT clause, TEXT format is specified. * OUTPUT JSON: print out as a JSON format. As below, if you run **SHOW TRACE** syntax, the trace result is shown. :: SHOW TRACE; Below is an example that prints out the query tracing result after setting SQL trace ON. :: csql> SET TRACE ON; csql> SELECT /*+ RECOMPILE */ o.host_year, o.host_nation, o.host_city, SUM(p.gold) FROM OLYMPIC o, PARTICIPANT p WHERE o.host_year = p.host_year AND p.gold > 20 GROUP BY o.host_nation; csql> SHOW TRACE; :: === === trace ====================== ' Query Plan: SORT (group by) NESTED LOOPS (inner join) TABLE SCAN (o) INDEX SCAN (p.fk_participant_host_year) (key range: o.host_year=p.host_year) rewritten query: select o.host_year, o.host_nation, o.host_city, sum(p.gold) from OLYMPIC o, PARTICIPANT p where o.host_year=p.host_year and (p.gold> ?:0 ) group by o.host_nation Trace Statistics: SELECT (time: 1, fetch: 975, ioread: 2) SCAN (table: olympic), (heap time: 0, fetch: 26, ioread: 0, readrows: 25, rows: 25) SCAN (index: participant.fk_participant_host_year), (btree time: 1, fetch: 941, ioread: 2, readkeys: 5, filteredkeys: 5, rows: 916) (lookup time: 0, rows: 14) GROUPBY (time: 0, sort: true, page: 0, ioread: 0, rows: 5) ' In the above example, under lines of "Trace Statistics:" are the result of tracing. Each items of tracing result are as below. * **SELECT** (time: 1, fetch: 975, ioread: 2) * time: 4 => Total query time took 4ms. * fetch: 975 => 975 times were fetched regarding pages. (not the number of pages, but the count of accessing pages. even if the same pages are fetched, the count is increased.). * ioread: disk accessed 2 times. : Total statistics regarding SELECT query. If the query is rerun, fetching count and ioread count can be shrinken because some of query result are read from buffer. * **SCAN** (table: olympic), (heap time: 0, fetch: 26, ioread: 0, readrows: 25, rows: 25) * heap time: 0 => It took less than 1ms. CUBRID rounds off a value less than millisecond, so a time value less than 1ms is displayed as 0. * fetch: 26 => page fetching count is 26. * ioread: 0 => disk accessing count is 0. * readrows: 25 => the number of rows read when scanning is 25. * rows: 25 => the number of rows in result is 25. : Heap scan statistics for the olympic table. * **SCAN** (index: participant.fk_participant_host_year), (btree time: 1, fetch: 941, ioread: 2, readkeys: 5, filteredkeys: 5, rows: 916) (lookup time: 0, rows: 14) * btree time: 1 => It took 1ms. * fetch: 941 => page fetching count is 941. * ioread: 2 => disk accessing count is 2. * readkeys: 5 => the number of keys read is 5. * filteredkeys: 5 => the number of keys which the key filter is applied is 5. * rows: 916 => the number of rows scanning is 916. * lookup time: 0 => It took less than 1ms when accessing data after index scan. * rows: 14 => the number of rows after applying data filter; in the query, the number of rows is 14 when data filter "p.gold > 20" is applied. : Index scanning statistics regarding participant.fk_participant_host_year index. * **GROUPBY** (time: 0, sort: true, page: 0, ioread: 0, rows: 5) * time: 0 => It took less than 1ms when "group by" is applied. * sort: true => It's true because sorting is applied. * page: 0 => the number or temporary pages used in sorting is 0. * ioread: 0 => It took less than 1ms to access disk. * rows: 5 => the number of result rows regarding "group by" is 5. : Group by statistics. The following is an example to join 3 tables. :: csql> SET TRACE ON; csql> SELECT /*+ RECOMPILE ORDERED */ o.host_year, o.host_nation, o.host_city, n.name, SUM(p.gold), SUM(p.silver), SUM(p.bronze) FROM OLYMPIC o, (select * from PARTICIPANT p where p.gold > 10) p, NATION n WHERE o.host_year = p.host_year AND p.nation_code = n.code GROUP BY o.host_nation; csql> SHOW TRACE; trace ====================== ' Query Plan: TABLE SCAN (p) rewritten query: (select p.host_year, p.nation_code, p.gold, p.silver, p.bronze from PARTICIPANT p where (p.gold> ?:0 )) SORT (group by) NESTED LOOPS (inner join) NESTED LOOPS (inner join) TABLE SCAN (o) TABLE SCAN (p) INDEX SCAN (n.pk_nation_code) (key range: p.nation_code=n.code) rewritten query: select /*+ ORDERED */ o.host_year, o.host_nation, o.host_city, n.[name], sum(p.gold), sum(p.silver), sum(p.bronze) from OLYMPIC o, (select p.host_year, p.nation_code, p.gold, p.silver, p.bronze from PARTICIPANT p where (p.gold> ?:0 )) p (host_year, nation_code, gold, silver, bronze), NATION n where o.host_year=p.host_year and p.nation_code=n.code group by o.host_nation Trace Statistics: SELECT (time: 6, fetch: 880, ioread: 0) SCAN (table: olympic), (heap time: 0, fetch: 104, ioread: 0, readrows: 25, rows: 25) SCAN (hash temp buildtime : 0, time: 0, fetch: 0, ioread: 0, readrows: 76, rows: 38) SCAN (index: nation.pk_nation_code), (btree time: 2, fetch: 760, ioread: 0, readkeys: 38, filteredkeys: 0, rows: 38) (lookup time: 0, rows: 38) GROUPBY (time: 0, hash: true, sort: true, page: 0, ioread: 0, rows: 5) SUBQUERY (uncorrelated) SELECT (time: 2, fetch: 12, ioread: 0) SCAN (table: participant), (heap time: 2, fetch: 12, ioread: 0, readrows: 916, rows: 38) ' The following are the explanation regarding items of trace statistics. **SELECT** * time: total estimated time when this query is performed(ms) * fetch: total page fetching count about this query * ioread: total I/O read count about this query. disk access count when the data is read **SCAN** * heap: data scanning job without index * time, fetch, ioread: the estimated time(ms), page fetching count and I/O read count in the heap of this operation * readrows: the number of rows read when this operation is performed * rows: the number of result rows when this operation is performed * btree: index scanning job * time, fetch, ioread: the estimated time(ms), page fetching count and I/O read count in the btree of this operation * readkeys: the number of the keys which are read in btree when this operation is performed * filteredkeys: the number of the keys to which the key filter is applied from the read keys * rows: the number of result rows when this operation is performed; the number of result rows to which key filter is applied * temp: data scanning job with temp file * hash: hash list scan or not. See :ref:`NO_HASH_LIST_SCAN ` hint. * buildtime: the estimated time(ms) in building hash table. * time: the estimated time(ms) in probing hash table. * fetch, ioread: page fetching count and I/O read count in the temp file of this operation * readrows: the number of rows read when this operation is performed * rows: the number of result rows when this operation is performed * lookup: data accessing job after index scanning * time: the estimated time(ms) in this operation * rows: the number of the result rows in this operation; the number of result rows to which the data filter is applied **GROUPBY** * time: the estimated time(ms) in this operation * sort: sorting or not * page: the number of pages which is read in this operation; the number of used pages except the internal sorting buffer * rows: the number of the result rows in this operation * hash: hash aggregate evaluation or not, when sorting tuples in the aggregate function(true/false). See :ref:`NO_HASH_AGGREGATE ` hint. **INDEX SCAN** * key range: the range of a key * covered: covered index or not(true/false) * loose: loose index scan or not(true/false) The above example can be output as JSON format. :: csql> SET TRACE ON OUTPUT JSON; csql> SELECT n.name, a.name FROM athlete a, nation n WHERE n.code=a.nation_code; csql> SHOW TRACE; trace ====================== '{ "Trace Statistics": { "SELECT": { "time": 29, "fetch": 5836, "ioread": 3, "SCAN": { "access": "temp", "temp": { "time": 5, "fetch": 34, "ioread": 0, "readrows": 6677, "rows": 6677 } }, "MERGELIST": { "outer": { "SELECT": { "time": 0, "fetch": 2, "ioread": 0, "SCAN": { "access": "table (nation)", "heap": { "time": 0, "fetch": 1, "ioread": 0, "readrows": 215, "rows": 215 } }, "ORDERBY": { "time": 0, "sort": true, "page": 21, "ioread": 3 } } } } } } }' On CSQL interpreter, if you use the command to set the SQL trace on automatically, the trace result is printed out automatically after printing the query result even if you do not run **SHOW TRACE;** syntax. For how to set the trace on automatically, see :ref:`Set SQL trace `. .. note:: * CSQL interpreter which is run in the standalone mode(use -S option) does not support SQL trace feature. * When multiple queries are performed at once(batch query, array query), they are not profiled. .. _sql-hint: Using SQL Hint ============== Using hints can affect the performance of query execution. You can allow the query optimizer to create more efficient execution plan by referring to the SQL HINT. The SQL HINTs related tale join and index are provided by CUBRID. :: { SELECT | UPDATE | DELETE } /*+ [ { } ... ] */ ...; MERGE /*+ [ { } ... ] */ INTO ...; ::= USE_NL [ () ] | USE_IDX [ () ] | USE_MERGE [ () ] | ORDERED | USE_DESC_IDX | USE_SBR | INDEX_SS [ () ] | INDEX_LS | NO_DESC_IDX | NO_COVERING_IDX | NO_MULTI_RANGE_OPT | NO_SORT_LIMIT | NO_HASH_AGGREGATE | NO_HASH_LIST_SCAN | NO_LOGGING | RECOMPILE | QUERY_CACHE ::= [, , ... ] ::= table_name | view_name ::= USE_UPDATE_INDEX () | USE_DELETE_INDEX () | RECOMPILE SQL hints are specified by using a plus sign(+) to comments. To use a hint, there are three styles as being introduced on :doc:`comment`. Therefore, also SQL hint can be used as three styles. * /\*+ hint \*/ * --+ hint * //+ hint The hint comment must appear after the keyword such as **SELECT**, **UPDATE** or **DELETE**, and the comment must begin with a plus sign (+), following the comment delimiter. When you specify several hints, they are separated by blanks. The following hints can be specified in **UPDATE**, **DELETE** and **SELECT** statements. * **USE_NL**: Related to a table join, the query optimizer creates a nested loop join execution plan with this hint. * **USE_MERGE**: Related to a table join, the query optimizer creates a sort merge join execution plan with this hint. * **ORDERED**: Related to a table join, the query optimizer create a join execution plan with this hint, based on the order of tables specified in the **FROM** clause. The left table in the **FROM** clause becomes the outer table; the right one becomes the inner table. * **USE_IDX**: Related to an index, the query optimizer creates an index join execution plan corresponding to a specified table with this hint. * **USE_DESC_IDX**: This is a hint for the scan in descending index. For more information, see :ref:`index-descending-scan`. * **USE_SBR**: This is a hint for the statement-based replication. It supports data replication for tables without a primary key. .. note:: The data inconsistency of a table may occur between nodes since the corresponding statement is executed when the transaction log is applied in the slave node. * **INDEX_SS**: Consider the query plan of index skip scan. For more information, see :ref:`index-skip-scan`. * **INDEX_LS**: Consider the query plan of loose index scan. For more information, see :ref:`loose-index-scan`. * **NO_DESC_IDX**: This is a hint not to use the descending index. * **NO_COVERING_IDX**: This is a hint not to use the covering index. For details, see :ref:`covering-index`. * **NO_MULTI_RANGE_OPT**: This is a hint not to use the multi-key range optimization. For details, see :ref:`multi-key-range-opt`. * **NO_SORT_LIMIT**: This is a hint not to use the SORT-LIMIT optimization. For more details, see :ref:`sort-limit-optimization`. .. _no-hash-aggregate: * **NO_HASH_AGGREGATE**: This is a hint not to use hashing for the sorting tuples in aggregate functions. Instead, external sorting is used in aggregate functions. By using an in-memory hash table, we can reduce or even eliminate the amount of data that needs to be sorted. However, in some scenarios the user may know beforehand that hash aggregation will fail and can use the hint to skip hash aggregation entirely. For setting the memory size of hashing aggregate, see :ref:`max_agg_hash_size `. .. note:: Hash aggregate evaluation will not work for functions evaluated on distinct values (e.g. AVG(DISTINCT x)) and for the GROUP_CONCAT and MEDIAN functions, since they require an extra sorting step for the tuples of each group. .. _no-hash-list-scan: * **NO_HASH_LIST_SCAN**: This is a hint not to use hash list scan for scanning sub-query's result. Instead, list scan is used to scan temp file. By building and probing hash table, we can reduce the amount of data that needs to be searched. However, in some scenarios, the user may know beforehand that outer cardinality is very small and can use the hint to skip hash list scan entirely. For setting the memory size of hash scan, see :ref:`max_hash_list_scan_size `. .. note:: Hash List scan only works for predicates having a equal operation and does NOT work for predicates having OID type. * **NO_LOGGING**: This is a hint not to include the redo in the log generated when inserting, updating, or deleting records to a table. .. note:: Currently, The NO_LOGGING hint only affects the log created from the heap file when inserting, updating, or deleting records to a table. Therefore, problems such as the inconsistency between the data of the table and the data of the index might occur after recovery; and the situation of committed record cannot be recovered might also occur, etc. You should use it carefully. .. _recompile: * **RECOMPILE** : Recompiles the query execution plan. This hint is used to delete the query execution plan stored in the cache and establish a new query execution plan. * **QUERY_CACHE**: This is a hint for caching the query with its results. This hint can be specified in **SELECT** statements only. For more information, see :ref:`query-cache`. .. note:: If <*spec_name*> is specified together with **USE_NL**, **USE_IDX** or **USE_MERGE**, the specified join method applies only to the <*spec_name*>. .. code-block:: sql SELECT /*+ ORDERED USE_NL(B) USE_NL(C) USE_MERGE(D) */ * FROM A INNER JOIN B ON A.col=B.col INNER JOIN C ON B.col=C.col INNER JOIN D ON C.col=D.col; If you run the above query, **USE_NL** is applied when A and B are joined; **USE_NL** is applied when C is joined, too; **USE_MERGE** is applied when D is joined. If **USE_NL** and **USE_MERGE** are specified together without <*spec_name*>, the given hint is ignored. In some cases, the query optimizer cannot create a query execution plan based on the given hint. For example, if **USE_NL** is specified for a right outer join, the query is converted to a left outer join internally, and the join order may not be guaranteed. MERGE statement can have below hints. * **USE_INSERT_IDX** (<*insert_index_list*>): An index hint which is used in **INSERT** clause of **MERGE** statement. Lists index names to *insert_index_list* to use when executing **INSERT** clause. This hint is applied to <*join_condition*> of **MERGE** statement. * **USE_UPDATE_IDX** (<*update_index_list*>): An index hint which is used in **UPDATE** clause of **MERGE** statement. Lists index names to *update_index_list* to use when executing **UPDATE** clause. This hint is applied to <*join_condition*> and <*update_condition*> of **MERGE** statement. * **RECOMPILE**: See the above :ref:`RECOMPILE `. Table/view names to join can be specified to the joining hint; at this time, table/view names are separated by ",". .. code-block:: sql SELECT /*+ USE_NL(a, b) */ * FROM a INNER JOIN b ON a.col=b.col; The following example shows how to retrieve the years when *'Sim Kwon Ho'* won medals and the types of medals. It can be expressed by the following query. The query optimizer creates a nested loop join execution plan that has the *athlete* table as an outer table and the *game* table as an inner table. .. code-block:: sql -- csql> ;plan_detail SELECT /*+ USE_NL ORDERED */ a.name, b.host_year, b.medal FROM athlete a, game b WHERE a.name = 'Sim Kwon Ho' AND a.code = b.athlete_code; :: Query plan: idx-join (inner join) outer: sscan class: a node[0] sargs: term[1] cost: 44 card 7 inner: iscan class: b node[1] index: fk_game_athlete_code term[0] cost: 3 card 8653 cost: 73 card 9 The following example shows how to specify tables when using a **USE_NL** hint. .. code-block:: sql -- csql> ;plan_detail SELECT /*+ USE_NL(a,b) */ a.name, b.host_year, b.medal FROM athlete a, game b WHERE a.name = 'Sim Kwon Ho' AND a.code = b.athlete_code; .. _index-hint-syntax: Index Hint ========== The index hint syntax allows the query processor to select a proper index by specifying the index in the query. You can specify the index hint by **USING INDEX** clause or by { **USE** | **FORCE** | **IGNORE** } **INDEX** syntax after "**FROM** table" clause. USING INDEX ----------- **USING INDEX** clause should be specified after **WHERE** clause of **SELECT**, **DELETE** or **UPDATE** statement. **USING INDEX** clause forces a sequential/index scan to be used or an index that can improve the performance to be included. If **USING INDEX** clause is specified with the list of index names, query optimizer creates optimized execution plan by calculating the query execution cost based on the specified indexes only and comparing the index scan cost and the sequential scan cost of the specified indexes(CUBRID performs cost-based query optimization to select an execution plan). The **USING INDEX** clause is useful to get the results in the desired order without **ORDER BY**. When index scan is performed by CUBRID, the results are created in the order they were saved in the index. When there are more than one indexes in one table, you can use **USING INDEX** to get the query results in a given order of indexes. :: SELECT ... WHERE ... [USING INDEX { NONE | [ ALL EXCEPT ] [ {, } ...] } ] [ ; ] DELETE ... WHERE ... [USING INDEX { NONE | [ ALL EXCEPT ] [ {, } ...] } ] [ ; ] UPDATE ... WHERE ... [USING INDEX { NONE | [ ALL EXCEPT ] [ {, } ...] } ] [ ; ] ::= [table_spec.]index_name [(+) | (-)] | table_spec.NONE * **NONE**: If **NONE** is specified, a sequential scan is used on all tables. * **ALL EXCEPT**: All indexes except the specified indexes can be used when the query is executed. * *index_name*\ (+): If (+) is specified after the index_name, it is the first priority in index selection. IF this index is not proper to run the query, it is not selected. * *index_name*\ (-): If (-) is specified after the index_name, it is excluded from index selection. * *table_spec*.\ **NONE**: All indexes are excluded from the selection, so sequential scan is used. USE, FORCE, IGNORE INDEX ------------------------ Index hints can be specified through **USE**, **FORCE**, **IGNORE INDEX** syntax after table specification of **FROM** clause. :: FROM table_spec [ ] ... ::= { USE | FORCE | IGNORE } INDEX ( [, ...] ) ::= [table_spec.]index_name * **USE INDEX** ( <*index_spec*> ): Only specified indexes are considered when choose them. * **FORCE INDEX** ( <*index_spec*> ): Specified indexes are chosen as the first priority. * **IGNORE INDEX** ( <*index_spec*> ): Specified indexes are excluded from the choice. **USE**, **FORCE**, **IGNORE** **INDEX** syntax is automatically rewritten as the proper **USING INDEX** syntax by the system. Examples of index hint ---------------------- .. code-block:: sql CREATE TABLE athlete2 ( code SMALLINT PRIMARY KEY, name VARCHAR(40) NOT NULL, gender CHAR(1), nation_code CHAR(3), event VARCHAR(30) ); CREATE UNIQUE INDEX athlete2_idx1 ON athlete2 (code, nation_code); CREATE INDEX athlete2_idx2 ON athlete2 (gender, nation_code); Below two queries do the same behavior and they select index scan if the specified index, *athlete2_idx2*\'s scan cost is lower than sequential scan cost. .. code-block:: sql SELECT /*+ RECOMPILE */ * FROM athlete2 USE INDEX (athlete2_idx2) WHERE gender='M' AND nation_code='USA'; SELECT /*+ RECOMPILE */ * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX athlete2_idx2; Below two queries do the same behavior and they always use *athlete2_idx2* .. code-block:: sql SELECT /*+ RECOMPILE */ * FROM athlete2 FORCE INDEX (athlete2_idx2) WHERE gender='M' AND nation_code='USA'; SELECT /*+ RECOMPILE */ * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX athlete2_idx2(+); Below two queries do the same behavior and they always don't use *athlete2_idx2* .. code-block:: sql SELECT /*+ RECOMPILE */ * FROM athlete2 IGNORE INDEX (athlete2_idx2) WHERE gender='M' AND nation_code='USA'; SELECT /*+ RECOMPILE */ * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX athlete2_idx2(-); Below query always do the sequential scan. .. code-block:: sql SELECT * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX NONE; SELECT * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX athlete2.NONE; Below query forces to be possible to use all indexes except *athlete2_idx2* index. .. code-block:: sql SELECT * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX ALL EXCEPT athlete2_idx2; When two or more indexes have been specified in the **USING INDEX** clause, the query optimizer selects the proper one of the specified indexes. .. code-block:: sql SELECT * FROM athlete2 USE INDEX (athlete2_idx2, athlete2_idx1) WHERE gender='M' AND nation_code='USA'; SELECT * FROM athlete2 WHERE gender='M' AND nation_code='USA' USING INDEX athlete2_idx2, athlete2_idx1; When a query is run for several tables, you can specify a table to perform index scan by using a specific index and another table to perform sequential scan. The query has the following format. .. code-block:: sql SELECT * FROM tab1, tab2 WHERE ... USING INDEX tab1.idx1, tab2.NONE; When executing a query with the index hint syntax, the query optimizer considers all available indexes on the table for which no index has been specified. For example, when the *tab1* table includes *idx1* and *idx2* and the *tab2* table includes *idx3*, *idx4*, and *idx5*, if indexes for only *tab1* are specified but no indexes are specified for *tab2*, the query optimizer considers the indexes of *tab2*. .. code-block:: sql SELECT ... FROM tab1, tab2 USE INDEX(tab1.idx1) WHERE ... ; SELECT ... FROM tab1, tab2 WHERE ... USING INDEX tab1.idx1; The above query select the scan method of table *tab1* after comparing the cost between the sequential scan of the table *tab1* and the index scan of the index *idx1*, and select the scan method of table *tab2* after comparing the cost between the sequential scan of the table *tab2* and the index scan of the indexes *idx3*, *idx4*, *idx5*. Special Indexes =============== .. _filtered-index: Filtered Index -------------- The filtered index is used to sort, search, or operate a well-defined partials set for one table. It is called the partial index since only some data that satisfy the condition are kept in that index. :: CREATE /*+ hints */ INDEX index_name ON table_name (col1, col2, ...) WHERE ; ALTER /*+ hints */ INDEX index_name [ ON table_name (col1, col2, ...) [ WHERE ] ] REBUILD; ::= AND | * <*filter_predicate*>: Condition to compare the column and the constant. When there are several conditions, filtering is available only when they are connected by using **AND**. The filter conditions can include most of the operators and functions supported by CUBRID. However, the date/time function that shows the current date/time (ex: :func:`SYS_DATETIME`) or random functions (ex: :func:`RAND`), which outputs different results for one input are not allowed. If you want to apply the filtered index, that filtered index must be specified by **USE INDEX** syntax or **FORCE INDEX** syntax. * When a filtered index is specified by **USING INDEX** clause or **USE INDEX** syntax: If columns of which the index consists are not included on the conditions of **WHERE** clause, the filtered index is not used. .. code-block:: sql CREATE TABLE blogtopic ( blogID BIGINT NOT NULL, title VARCHAR(128), author VARCHAR(128), content VARCHAR(8096), postDate TIMESTAMP NOT NULL, deleted SMALLINT DEFAULT 0 ); CREATE INDEX my_filter_index ON blogtopic(postDate) WHERE deleted=0; On the below query, *postDate*, a column of which *my_filter_index* consists, is included on the conditions of **WHERE** condition. Therefore, this index can be used by **USE INDEX** clause. .. code-block:: sql SELECT * FROM blogtopic USE INDEX (my_filter_index) WHERE postDate>'2010-01-01' AND deleted=0; * When a filtered index is specified by **USING INDEX** (+) clause or **FORCE INDEX** syntax: Even if a column of which the index consists is not included on the condition of **WHERE** clause, the filtered index is used. On the below query, *my_filter_index* cannot be used by **"USE INDEX"** syntax because a column of which *my_filter_index* consists is not included on the **WHERE** condition. .. code-block:: sql SELECT * FROM blogtopic USE INDEX (my_filter_index) WHERE author = 'David' AND deleted=0; Therefore, to use *my_filter_index*, it should be forced by **"FORCE INDEX"**. .. code-block:: sql SELECT * FROM blogtopic FORCE INDEX (my_filter_index) WHERE author = 'David' AND deleted=0; The following example shows a bug tracking system that maintains bugs/issues. After a specified period of development, the bugs table records bugs. Most of the bugs have already been closed. The bug tracking system makes queries on the table to find new open bugs. In this case, the indexes on the bug table do not need to know the records on closed bugs. Then the filtered indexes allow indexing of open bugs only. .. code-block:: sql CREATE TABLE bugs ( bugID BIGINT NOT NULL, CreationDate TIMESTAMP, Author VARCHAR(255), Subject VARCHAR(255), Description VARCHAR(255), CurrentStatus INTEGER, Closed SMALLINT ); Indexes for open bugs can be created by using the following sentence: .. code-block:: sql CREATE INDEX idx_open_bugs ON bugs(bugID) WHERE Closed = 0; To process queries that are interested in open bugs, specify the index as an index hint. It will allow creating query results by accessing less index pages through filtered indexes. .. code-block:: sql SELECT * FROM bugs WHERE Author = 'madden' AND Subject LIKE '%fopen%' AND Closed = 0 USING INDEX idx_open_bugs(+); SELECT * FROM bugs FORCE INDEX (idx_open_bugs) WHERE CreationDate > CURRENT_DATE - 10 AND Closed = 0; On the above example, if you use "**USING INDEX** *idx_open_bugs*" or "**USE INDEX** (*idx_open_bugs*)", a query is processed without using the *idx_open_bugs* index. .. warning:: If you execute queries by specifying indexes with index hint syntax even though the conditions of creating filtered indexes does not match the query conditions, CUBRID performs a query by choosing a specified index. Therefore, query results can be different with the given searching conditions. .. note:: **Constraints** Only generic indexes are allowed as filtered indexes. For example, the filtered unique index is not allowed. Also, it is not allowed that columns which compose an index are all NULLable. For example, below is not allowed because Author is NULLable. .. code-block:: sql CREATE INDEX idx_open_bugs ON bugs (Author) WHERE Closed = 0; :: ERROR: before ' ; ' Invalid filter expression (bugs.Closed=0) for index. However, below is allowed because Author is NULLable, but CreationDate is not NULLable. .. code-block:: sql CREATE INDEX idx_open_bugs ON bugs (Author, CreationDate) WHERE Closed = 0; The following cases are not allowed as filtering conditions. * Functions, which output different results with the same input, such as date/time function or random function .. code-block:: sql CREATE INDEX idx ON bugs(creationdate) WHERE creationdate > SYS_DATETIME; :: ERROR: before ' ; ' 'sys_datetime ' is not allowed in a filter expression for index. .. code-block:: sql CREATE INDEX idx ON bugs(bugID) WHERE bugID > RAND(); :: ERROR: before ' ; ' 'rand ' is not allowed in a filter expression for index. * In case of using the **OR** operator .. code-block:: sql CREATE INDEX IDX ON bugs (bugID) WHERE bugID > 10 OR bugID = 3; :: ERROR: before ' ; ' ' or ' is not allowed in a filter expression for index. * In case of including functions like :func:`INCR`, :func:`DECR` functions, which modify the data of a table. * In case of Serial-related functions and including pseudo columns. * In case of including aggregate functions such as :func:`MIN`, :func:`MAX`, :func:`STDDEV` * In case of using the types where indexes cannot be created - The operators and functions where an argument is the **SET** type - The functions to use LOB file(:func:`CHAR_TO_BLOB`, :func:`CHAR_TO_CLOB`, :func:`BIT_TO_BLOB`, :func:`BLOB_FROM_FILE`, :func:`CLOB_FROM_FILE`) * The **IS NULL** operator can be used only when at least one column of an index is not **NULL**. .. code-block:: sql CREATE TABLE t (a INT, b INT); -- IS NULL cannot be used with expressions CREATE INDEX idx ON t (a) WHERE (not a) IS NULL; :: ERROR: before ' ; ' Invalid filter expression (( not t.a<>0) is null ) for index. .. code-block:: sql CREATE INDEX idx ON t (a) WHERE (a+1) IS NULL; :: ERROR: before ' ; ' Invalid filter expression ((t.a+1) is null ) for index. .. code-block:: sql -- At least one attribute must not be used with IS NULL CREATE INDEX idx ON t(a,b) WHERE a IS NULL ; :: ERROR: before ' ; ' Invalid filter expression (t.a is null ) for index. .. code-block:: sql CREATE INDEX idx ON t(a,b) WHERE a IS NULL and b IS NULL; :: ERROR: before ' ; ' Invalid filter expression (t.a is null and t.b is null ) for index. .. code-block:: sql CREATE INDEX idx ON t(a,b) WHERE a IS NULL and b IS NOT NULL; * Index Skip Scan (ISS) is not allowed for the filtered indexes. * The length of condition string used for the filtered index is limited to 128 characters. .. code-block:: sql CREATE TABLE t(VeryLongColumnNameOfTypeInteger INT); CREATE INDEX idx ON t(VeryLongColumnNameOfTypeInteger) WHERE VeryLongColumnNameOfTypeInteger > 3 AND VeryLongColumnNameOfTypeInteger < 10 AND SQRT(VeryLongColumnNameOfTypeInteger) < 3 AND SQRT(VeryLongColumnNameOfTypeInteger) < 10; :: ERROR: before ' ; ' The maximum length of filter predicate string must be 128. .. _function-index: Function-based Index -------------------- Function-based index is used to sort or find the data based on the combination of values of table rows by using a specific function. For example, to find the space-ignored string, it can be used to optimize the query by using the function that provides the feature. In addition, it is useful to search the non-case-sensitive names. :: CREATE /*+ hints */ INDEX index_name ON table_name (function_name (argument_list)); ALTER /*+ hints */ INDEX index_name [ ON table_name (function_name (argument_list)) ] REBUILD; After the following indexes have been created, the **SELECT** query automatically uses the function-based index. .. code-block:: sql CREATE INDEX idx_trim_post ON posts_table(TRIM(keyword)); SELECT * FROM posts_table WHERE TRIM(keyword) = 'SQL'; If a function-based index is created by using the **LOWER** function, it can be used to search the non-case-sensitive names. .. code-block:: sql CREATE INDEX idx_last_name_lower ON clients_table(LOWER(LastName)); SELECT * FROM clients_table WHERE LOWER(LastName) = LOWER('Timothy'); To make an index selected while creating a query plan, the function used for the index should be used for the query condition in the same way. The **SELECT** query above uses the last_name_lower index created above. However, this index is not used for the following condition: .. code-block:: sql SELECT * FROM clients_table WHERE LOWER(CONCAT('Mr. ', LastName)) = LOWER('Mr. Timothy'); In addition, to make the function-based index used by force, use the **USING INDEX** syntax. .. code-block:: sql CREATE INDEX i_tbl_first_four ON tbl(LEFT(col, 4)); SELECT * FROM clients_table WHERE LEFT(col, 4) = 'CAT5' USING INDEX i_tbl_first_four; .. _allowed-function-in-function-index: Functions with the function-based indexes are as follows: +-------------------+-------------------+-------------------+-------------------+-------------------+ | ABS | ACOS | ADD_MONTHS | ADDDATE | ASIN | +-------------------+-------------------+-------------------+-------------------+-------------------+ | ATAN | ATAN2 | BIT_COUNT | BIT_LENGTH | CEIL | +-------------------+-------------------+-------------------+-------------------+-------------------+ | CHAR_LENGTH | CHR | COS | COT | DATE | +-------------------+-------------------+-------------------+-------------------+-------------------+ | DATE_ADD | DATE_FORMAT | DATE_SUB | DATEDIFF | DAY | +-------------------+-------------------+-------------------+-------------------+-------------------+ | DAYOFMONTH | DAYOFWEEK | DAYOFYEAR | DEGREES | EXP | +-------------------+-------------------+-------------------+-------------------+-------------------+ | FLOOR | FORMAT | FROM_DAYS | FROM_UNIXTIME | GREATEST | +-------------------+-------------------+-------------------+-------------------+-------------------+ | HOUR | IFNULL | INET_ATON | INET_NTOA | INSTR | +-------------------+-------------------+-------------------+-------------------+-------------------+ | LAST_DAY | LEAST | LEFT | LN | LOCATE | +-------------------+-------------------+-------------------+-------------------+-------------------+ | LOG | LOG10 | LOG2 | LOWER | LPAD | +-------------------+-------------------+-------------------+-------------------+-------------------+ | LTRIM | MAKEDATE | MAKETIME | MD5 | MID | +-------------------+-------------------+-------------------+-------------------+-------------------+ | MINUTE | MOD | MONTH | MONTHS_BETWEEN | NULLIF | +-------------------+-------------------+-------------------+-------------------+-------------------+ | NVL | NVL2 | OCTET_LENGTH | POSITION | POWER | +-------------------+-------------------+-------------------+-------------------+-------------------+ | QUARTER | RADIANS | REPEAT | REPLACE | REVERSE | +-------------------+-------------------+-------------------+-------------------+-------------------+ | RIGHT | ROUND | RPAD | RTRIM | SECOND | +-------------------+-------------------+-------------------+-------------------+-------------------+ | SECTOTIME | SIN | SQRT | STR_TO_DATE | STRCMP | +-------------------+-------------------+-------------------+-------------------+-------------------+ | SUBDATE | SUBSTR | SUBSTRING | SUBSTRING_INDEX | TAN | +-------------------+-------------------+-------------------+-------------------+-------------------+ | TIME | TIME_FORMAT | TIMEDIFF | TIMESTAMP | TIMETOSEC | +-------------------+-------------------+-------------------+-------------------+-------------------+ | TO_CHAR | TO_DATE | TO_DATETIME | TO_DAYS | TO_NUMBER | +-------------------+-------------------+-------------------+-------------------+-------------------+ | TO_TIME | TO_TIMESTAMP | TRANSLATE | TRIM | TRUNC | +-------------------+-------------------+-------------------+-------------------+-------------------+ | UNIX_TIMESTAMP | UPPER | WEEK | WEEKDAY | YEAR | +-------------------+-------------------+-------------------+-------------------+-------------------+ Arguments of functions which can be used in the function-based indexes, only column names and constants are allowed; nested expressions are not allowed. For example, a statement below will cause an error. .. code-block:: sql CREATE INDEX my_idx ON tbl (TRIM(LEFT(col, 3))); CREATE INDEX my_idx ON tbl (LEFT(col1, col2 + 3)); However, implicit cast is allowed. In the example below, the first argument type of the **LEFT** () function should be **VARCHAR** and the second argument type should be **INTEGER**; it works normally. .. code-block:: sql CREATE INDEX my_idx ON tbl (LEFT(int_col, str_col)); Function-based indexes cannot be used with filtered indexes. The example will cause an error. .. code-block:: sql CREATE INDEX my_idx ON tbl (TRIM(col)) WHERE col > 'SQL'; Function-based indexes cannot become multiple-columns indexes. The example will cause an error. .. code-block:: sql CREATE INDEX my_idx ON tbl (TRIM(col1), col2, LEFT(col3, 5)); .. _tuning-index: Optimization using indexes ========================== .. _covering-index: Covering Index -------------- The covering index is the index including the data of all columns in the **SELECT** list and the **WHERE**, **HAVING**, **GROUP BY**, and **ORDER BY** clauses. You only need to scan the index pages, as the covering index contains all the data necessary for executing a query, and it also reduces the I/O costs as it is not necessary to scan the data storage any further. To increase data search speed, you can consider creating a covering index but you should be aware that the **INSERT** and the **DELETE** processes may be slowed down due to the increase in index size. The rules about the applicability of the covering index are as follows: * If the covering index is applicable, you should use the CUBRID query optimizer first. * For the join query, if the index includes columns of the table in the **SELECT** list, use this index. * You cannot use the covering index if an index cannot be used. .. code-block:: sql CREATE TABLE t (col1 INT, col2 INT, col3 INT); CREATE INDEX i_t_col1_col2_col3 ON t (col1,col2,col3); INSERT INTO t VALUES (1,2,3),(4,5,6),(10,8,9); The following example shows that the index is used as a covering index because columns of both **SELECT** and **WHERE** condition exist within the index. .. code-block:: sql -- csql> ;plan simple SELECT * FROM t WHERE col1 < 6; :: Query plan: Index scan(t t, i_t_col1_col2_col3, [(t.col1 range (min inf_lt t.col3))] (covers)) col1 col2 col3 ======================================= 1 2 3 4 5 6 .. warning:: If the covering index is applied when you get the values from the **VARCHAR** type column, the empty strings that follow will be truncated. If the covering index is applied to the execution of query optimization, the resulting query value will be retrieved. This is because the value will be stored in the index with the empty string being truncated. If you don't want this, use the **NO_COVERING_IDX** hint, which does not use the covering index function. If you use the hint, you can get the result value from the data area rather than from the index area. The following is a detailed example of the above situation. First, create a table with columns in **VARCHAR** types, and then **INSERT** the value with the same start character string value but the number of empty characters. Next, create an index in the column. .. code-block:: sql CREATE TABLE tab(c VARCHAR(32)); INSERT INTO tab VALUES('abcd'),('abcd '),('abcd '); CREATE INDEX i_tab_c ON tab(c); If you must use the index (the covering index applied), the query result is as follows: .. code-block:: sql -- csql>;plan simple SELECT * FROM tab WHERE c='abcd ' USING INDEX i_tab_c(+); :: Query plan: Index scan(tab tab, i_tab_c, (tab.c='abcd ') (covers)) c ====================== 'abcd' 'abcd' 'abcd' The following is the query result when you don't use the index. .. code-block:: sql SELECT * FROM tab WHERE c='abcd ' USING INDEX tab.NONE; :: Query plan: Sequential scan(tab tab) c ====================== 'abcd' 'abcd ' 'abcd ' As you can see in the above comparison result, the value in the **VARCHAR** type retrieved from the index will appear with the following empty string truncated when the covering index has been applied. .. note:: If covering index optimization is available to be applied, the I/O performance can be improved because the disk I/O is decreased. But if you don't want covering index optimization in a special condition, specify a **NO_COVERING_IDX** hint to the query. For how to add a query, see :ref:`sql-hint`. .. _order-by-skip-optimization: Optimizing ORDER BY Clause -------------------------- The index including all columns in the **ORDER BY** clause is referred to as the ordered index. Optimizing the query with **ORDER BY** clause is no need for the additional sorting process(skip order by), because the query results are searched by the ordered index. In general, for an ordered index, the columns in the **ORDER BY** clause should be located at the front of the index. .. code-block:: sql SELECT * FROM tab WHERE col1 > 0 ORDER BY col1, col2; * The index consisting of *tab* (*col1*, *col2*) is an ordered index. * The index consisting of *tab* (*col1*, *col2*, *col3*) is also an ordered index. This is because the *col3*, which is not referred to by the **ORDER BY** clause, comes after *col1* and *col2* . * The index consisting of *tab* (*col1*) is not an ordered index. * You can use the index consisting of *tab* (*col3*, *col1*, *col2*) or *tab* (*col1*, *col3*, *col2*) for optimization. This is because *col3* is not located at the back of the columns in the **ORDER BY** clause. Although the columns composing an index do not exist in the **ORDER BY** clause, you can use an ordered index if the column condition is a constant. .. code-block:: sql SELECT * FROM tab WHERE col2=val ORDER BY col1,col3; If the index consisting of *tab* (*col1*, *col2*, *col3*) exists and the index consisting of *tab* (*col1*, *col2*) do not exist when executing the above query, the query optimizer uses the index consisting of *tab* (*col1*, *col2*, *col3*) as an ordered index. You can get the result in the requested order when you execute an index scan, so you don't need to sort records. If you can use the sorted index and the covering index, use the latter first. If you use the covering index, you don't need to retrieve additional data, because the data result requested is included in the index page, and you won't need to sort the result if you are satisfied with the index order. If the query doesn't include any conditions and uses an ordered index, the ordered index will be used under the condition that the first column meets the **NOT NULL** condition. .. code-block:: sql CREATE TABLE tab (i INT, j INT, k INT); CREATE INDEX i_tab_j_k on tab (j,k); INSERT INTO tab VALUES (1,2,3),(6,4,2),(3,4,1),(5,2,1),(1,5,5),(2,6,6),(3,5,4); The following example shows that indexes consisting of *tab* (*j*, *k*) become sorted indexes and no separate sorting process is required because **GROUP BY** is executed by *j* and *k* columns. .. code-block:: sql SELECT i,j,k FROM tab WHERE j > 0 ORDER BY j,k; :: -- the selection from the query plan dump shows that the ordering index i_tab_j_k was used and sorting was not necessary -- (/* --> skip ORDER BY */) Query plan: iscan class: tab node[0] index: i_tab_j_k term[0] sort: 2 asc, 3 asc cost: 1 card 0 Query stmt: select tab.i, tab.j, tab.k from tab tab where ((tab.j> ?:0 )) order by 2, 3 /* ---> skip ORDER BY */ i j k ======================================= 5 2 1 1 2 3 3 4 1 6 4 2 3 5 4 1 5 5 2 6 6 The following example shows that *j* and *k* columns execute **ORDER BY** and the index including all columns are selected so that indexes consisting of *tab* (*j*, *k*) are used as covering indexes; no separate process is required because the value is selected from the indexes themselves. .. code-block:: sql SELECT /*+ RECOMPILE */ j,k FROM tab WHERE j > 0 ORDER BY j,k; :: -- in this case the index i_tab_j_k is a covering index and also respects the ordering index property. -- Therefore, it is used as a covering index and sorting is not performed. Query plan: iscan class: tab node[0] index: i_tab_j_k term[0] (covers) sort: 1 asc, 2 asc cost: 1 card 0 Query stmt: select tab.j, tab.k from tab tab where ((tab.j> ?:0 )) order by 1, 2 /* ---> skip ORDER BY */ j k ========================== 2 1 2 3 4 1 4 2 5 4 5 5 6 6 The following example shows that *i* column exists, **ORDER BY** is executed by *j* and *k* columns, and columns that perform **SELECT** are *i*, *j*, and *k*. Therefore, indexes consisting of *tab* (*i*, *j*, *k*) are used as covering indexes; separate sorting process is required for **ORDER BY** *j*, *k* even though the value is selected from the indexes themselves. .. code-block:: sql CREATE INDEX i_tab_j_k ON tab (i,j,k); SELECT /*+ RECOMPILE */ i,j,k FROM tab WHERE i > 0 ORDER BY j,k; :: -- since an index on (i,j,k) is now available, it will be used as covering index. However, sorting the results according to -- the ORDER BY clause is needed. Query plan: temp(order by) subplan: iscan class: tab node[0] index: i_tab_i_j_k term[0] (covers) sort: 1 asc, 2 asc, 3 asc cost: 1 card 1 sort: 2 asc, 3 asc cost: 7 card 1 Query stmt: select tab.i, tab.j, tab.k from tab tab where ((tab.i> ?:0 )) order by 2, 3 i j k ======================================= 5 2 1 1 2 3 3 4 1 6 4 2 3 5 4 1 5 5 2 6 6 .. note:: Even if the type of a column in the **ORDER BY** clause is converted by using :func:`CAST`, **ORDER BY** optimization is executed when the sorting order is the same as before. +----------------+----------------+ | Before | After | +================+================+ | numeric type | numeric type | +----------------+----------------+ | string type | string type | +----------------+----------------+ | DATETIME | TIMESTAMP | +----------------+----------------+ | TIMESTAMP | DATETIME | +----------------+----------------+ | DATETIME | DATE | +----------------+----------------+ | TIMESTAMP | DATE | +----------------+----------------+ | DATE | DATETIME | +----------------+----------------+ .. _index-descending-scan: Index Scan in Descending Order ------------------------------ When a query is executed by sorting in descending order as follows, it usually creates a descending index. In this way, you do not have to go through addition procedure. .. code-block:: sql SELECT * FROM tab [WHERE ...] ORDER BY a DESC; However, if you create an ascending index and an descending index in the same column, the possibility of deadlock increases. In order to decrease the possibility of such case, CUBRID supports the descending scan only with ascending index. Users can use the **USE_DESC_IDX** hint to specify the use of the descending scan. If the hint is not specified, the following three query executions should be considered, provided that the columns listed in the **ORDER BY** clause can use the index. * Sequential scan + Sort in descending order * Scan in general ascending order + sort in descending * Scan in descending order that does not require a separate scan Although the **USE_DESC_IDX** hint is omitted for the scan in descending order, the query optimizer decides the last execution plan of the three listed for an optimal plan. .. note:: The **USE_DESC_IDX** hint is not supported for the join query. .. code-block:: sql CREATE TABLE di (i INT); CREATE INDEX i_di_i on di (i); INSERT INTO di VALUES (5),(3),(1),(4),(3),(5),(2),(5); The query will be executed as an ascending scan without **USE_DESC_IDX** hint. .. code-block:: sql -- The query will be executed with an ascending scan. SELECT * FROM di WHERE i > 0 LIMIT 3; :: Query plan: Index scan(di di, i_di_i, (di.i range (0 gt_inf max) and inst_num() range (min inf_le 3)) (covers)) i ============= 1 2 3 If you add **USE_DESC_IDX** hint to the above query, a different result will be shown by descending scan. .. code-block:: sql -- We now run the following query, using the ''use_desc_idx'' SQL hint: SELECT /*+ USE_DESC_IDX */ * FROM di WHERE i > 0 LIMIT 3; :: Query plan: Index scan(di di, i_di_i, (di.i range (0 gt_inf max) and inst_num() range (min inf_le 3)) (covers) (desc_index)) i ============= 5 5 5 The following example requires descending **ORDER BY** clause. In this case, there is no **USE_DESC_IDX** but do the descending scan. .. code-block:: sql -- We also run the same query, this time asking that the results are displayed in descending order. -- However, no hint is given. -- Since ORDER BY...DESC clause exists, CUBRID will use descending scan, even though the hint is not given, -- thus avoiding to sort the records. SELECT * FROM di WHERE i > 0 ORDER BY i DESC LIMIT 3; :: Query plan: Index scan(di di, i_di_i, (di.i range (0 gt_inf max)) (covers) (desc_index)) i ============= 5 5 5 .. _group-by-skip-optimization: Optimizing GROUP BY Clause -------------------------- **GROUP BY** clause optimization works on the premise that if all columns in the **GROUP BY** clause are included in an index, CUBRID can use the index upon executing a query, so CUBRID don't execute a separate sorting job. The columns in the **GROUP BY** clause must exist in front side of the column forming the index. .. code-block:: sql SELECT * FROM tab WHERE col1 > 0 GROUP BY col1,col2; * You can use the index consisting of *tab* ( *col1*, *col2* ) for optimization. * The index consisting of *tab* ( *col1*, *col2*, *col3* ) can be used because *col3* which is not referred to by **GROUP BY** comes after *col1* and *col2*. * You cannot use the index consisting of *tab* ( *col1* ) for optimization. * You also cannot use the index consisting of *tab* ( *col3*, *col1*, *col2* ) or *tab* ( *col1*, *col3*, *col2* ), because *col3* is not located at the back of the column in the **GROUP BY** clause. You can use the index if the column condition is a constant although the column consisting of the index doesn't exist in the **GROUP BY** clause. .. code-block:: sql SELECT * FROM tab WHERE col2=val GROUP BY col1,col3; If there is any index that consists of *tab* ( *col1*, *col2*, *col3* ) in the above example, use the index for optimizing **GROUP BY**. Row sorting by **GROUP BY** is not required, because you can get the result as the requested order on the index scan. If the index consisting of the **GROUP BY** column and the first column of the index is **NOT NULL**, even though there is no **WHERE** clause, the **GROUP BY** optimization will be applied. If there is an index made of **GROUP BY** columns even when using aggregate functions, **GROUP BY** optimization is applied. .. code-block:: sql CREATE INDEX i_T_a_b_c ON T(a, b, c); SELECT a, MIN(b), c, MAX(b) FROM T WHERE a > 18 GROUP BY a, b; .. note:: When a column of **DISTINCT** or a **GROUP BY** clause contains the subkey of a index, loose index scan adjusts the scope dynamically to unique values of the each columns constituting the partial key, and starts the search of a B-tree. Regarding this, see :ref:`loose-index-scan`. **Example** .. code-block:: sql CREATE TABLE tab (i INT, j INT, k INT); CREATE INDEX i_tab_j_k ON tab (j, k); INSERT INTO tab VALUES (1,2,3),(6,4,2),(3,4,1),(5,2,1),(1,5,5),(2,6,6),(3,5,4); UPDATE STATISTICS on tab; The following example shows that indexes consisting of *tab* ( *j*, *k* ) are used and no separate sorting process is required because **GROUP BY** is executed by *j* and *k* columns. .. code-block:: sql SELECT /*+ RECOMPILE */ j,k FROM tab WHERE j > 0 GROUP BY j,k; -- the selection from the query plan dump shows that the index i_tab_j_k was used and sorting was not necessary -- (/* ---> skip GROUP BY */) :: Query plan: iscan class: tab node[0] index: i_tab_j_k term[0] sort: 2 asc, 3 asc cost: 1 card 0 Query stmt: select tab.i, tab.j, tab.k from tab tab where ((tab.j> ?:0 )) group by tab.j, tab.k /* ---> skip GROUP BY */ i j k 5 2 1 1 2 3 3 4 1 6 4 2 3 5 4 1 5 5 2 6 6 The following example shows that an index consisting of *tab* ( *j*, *k* ) is used and no separate sorting process is required while **GROUP BY** is executed by *j* and *k* columns, no condition exists for *j*, and *j* column has **NOT NULL** attribute. .. code-block:: sql ALTER TABLE tab CHANGE COLUMN j j INT NOT NULL; SELECT * FROM tab GROUP BY j,k; :: -- the selection from the query plan dump shows that the index i_tab_j_k was used (since j has the NOT NULL constraint ) -- and sorting was not necessary (/* ---> skip GROUP BY */) Query plan: iscan class: tab node[0] index: i_tab_j_k sort: 2 asc, 3 asc cost: 1 card 0 Query stmt: select tab.i, tab.j, tab.k from tab tab group by tab.j, tab.k /* ---> skip GROUP BY */ === === i j k ======================================= 5 2 1 1 2 3 3 4 1 6 4 2 3 5 4 1 5 5 2 6 6 .. code-block:: sql CREATE TABLE tab (k1 int, k2 int, k3 int, v double); INSERT INTO tab SELECT RAND(CAST(UNIX_TIMESTAMP() AS INT)) MOD 5, RAND(CAST(UNIX_TIMESTAMP() AS INT)) MOD 10, RAND(CAST(UNIX_TIMESTAMP() AS INT)) MOD 100000, RAND(CAST(UNIX_TIMESTAMP() AS INT)) MOD 100000 FROM db_class a, db_class b, db_class c, db_class d LIMIT 20000; CREATE INDEX idx ON tab(k1, k2, k3); If you create tables and indexes of the above, the following example runs the **GROUP BY** with *k1*, *k2* columns and performs an aggregate function in *k3*; therefore, the index which consists of *tab* (*k1*, *k2*, *k3*) is used and no sort processing is required. In addition, because all columns of *k1*, *k2*, *k3* of **SELECT** list are present in the index configured in the *tab* (*k1*, *k2*, *k3*), covering index is applied. .. code-block:: sql SELECT /*+ RECOMPILE INDEX_SS */ k1, k2, SUM(DISTINCT k3) FROM tab WHERE k2 > -1 GROUP BY k1, k2; :: Query plan: iscan class: tab node[0] index: idx term[0] (covers) (index skip scan) sort: 1 asc, 2 asc cost: 85 card 2000 Query stmt: select tab.k1, tab.k2, sum(distinct tab.k3) from tab tab where (tab.k2> ?:0 ) group by tab.k1, tab.k2 /* ---> skip GROUP BY */ The following example performs **GROUP BY** clause with *k1*, *k2* columns; therefore, the index composed with *tab* (*k1*, *k2*, *k3*) is used and no sort processing is required. However, *v* column in the **SELECT** list is not present in the index composed of *tab* (*k1*, *k2*, *k3*); therefore, it does not apply covering index. .. code-block:: sql SELECT /*+ RECOMPILE INDEX_SS */ k1, k2, stddev_samp(v) FROM tab WHERE k2 > -1 GROUP BY k1, k2; :: Query plan: iscan class: tab node[0] index: idx term[0] (index skip scan) sort: 1 asc, 2 asc cost: 85 card 2000 Query stmt: select tab.k1, tab.k2, stddev_samp(tab.v) from tab tab where (tab.k2> ?:0 ) group by tab.k1, tab.k2 /* ---> skip GROUP BY */ .. _multi-key-range-opt: Multiple Key Ranges Optimization -------------------------------- Optimizing the **LIMIT** clause is crucial for performance because the most queries have limit filter. A representative optimization of this case is Multiple Key Ranges Optimization. Multiple Key Ranges Optimization generate the query result with Top N Sorting to scan only some key ranges in an index rather than doing a full index scan. Top N Sorting always keeps the best N tuples sorted rather than selecting all tuples and then sorting. Therefore, it shows the outstanding performance. For example, when you search only the recent 10 posts which your friends wrote, CUBRID which applied Multiple KEY Ranges Optimization finds the result not by sorting after finding all your friends' posts, but by scanning the index which keeps the recent 10 sorted posts of each friends. An example of Multiple Key Ranges Optimization is as follows. .. code-block:: sql CREATE TABLE t (a int, b int); CREATE INDEX i_t_a_b ON t (a,b); -- Multiple key range optimization SELECT * FROM t WHERE a IN (1,2,3) ORDER BY b LIMIT 2; :: Query plan: iscan class: t node[0] index: i_t_a_b term[0] (covers) (multi_range_opt) sort: 1 asc, 2 asc cost: 1 card 0 On a single table, multiple key range optimization can be applied if below conditions are satisfied. :: SELECT /*+ hints */ ... FROM table WHERE col_1 = ? AND col_2 = ? AND ... AND col(j-1) = ? AND col_(j) IN (?, ?, ...) AND col_(j+1) = ? AND ... AND col_(p-1) = ? AND key_filter_terms ORDER BY col_(p) [ASC|DESC], col_(p+1) [ASC|DESC], ... col_(p+k-1) [ASC|DESC] LIMIT n; Firstly, upper limit(*n*) for **LIMIT** should be less than or equal to the value of **multi_range_optimization_limit** system parameter. And you need the proper index to the multiple key range optimization, this index should cover all *k* columns specified in the **ORDER BY** clause. In other words, this index should include all *k* columns specified in the **ORDER BY** clause and the sorting order should be the same as the columns' order. Also this index should include all columns used in **WHERE** clause. Among columns that comprise the index, * Columns in front of range condition(e.g. IN condition) are represented as equivalent condition(=). * Only one column with range condition exists. * Columns after range condition exist as key filters. * There should be no data filtering condition. In other words, the index should include all columns used in **WHERE** clause. * Columns after the key filter exist in **ORDER BY** clause. * Columns of key filter condition always should not the column of **ORDER BY** clause. * If key filter condition with correlated subquery exists, related columns to this should be included into **WHERE** clause with no range condition. On the below example, Multiple Key Ranges Optimization can be applied. .. code-block:: sql CREATE TABLE t (a INT, b INT, c INT, d INT, e INT); CREATE INDEX i_t_a_b ON t (a,b,c,d,e); SELECT * FROM t WHERE a = 1 AND b = 3 AND c IN (1,2,3) AND d = 3 ORDER BY e LIMIT 2; Queries with multiple joined tables can also support Multiple Key Ranges Optimization: :: SELECT /*+ hints */ ... FROM table_1, table_2, ... table_(sort), ... WHERE col_1 = ? AND col_2 = ? AND ... AND col_(j) IN (?, ?, ... ) AND col_(j+1) = ? AND ... AND col_(p-1) = ? AND key_filter_terms AND join_terms ORDER BY col_(p) [ASC|DESC], col_(p+1) [ASC|DESC], ... col_(p+k-1) [ASC|DESC] LIMIT n; If queries with multiple joined tables can support Multiple Key Ranges Optimization, below conditions should be satisfied: * Columns in **ORDER BY** clause only exist on one table, and this table should satisfy all required conditions by Multiple Key Ranges Optimization on a single table query. Let the "sort table" be the table that contains all sorting columns. * All columns of "sort table" specified in a JOIN condition between "sort table" and "outer tables" should be included on an index. In other words, there should be no data filtering condition. * All columns of "sort table" specified in a JOIN condition between "sort table" and "outer tables" should be included on the **WHERE** clause with no range condition. .. note:: In most cases available to apply Multiple Key Ranges Optimization, this optimization shows the best performance. However, if you do not want this optimization on the special case, specify **NO_MULTI_RANGE_OPT** hint to the query. For details, see :ref:`sql-hint`. .. _index-skip-scan: Index Skip Scan --------------- Index Skip Scan (here after ISS) is an optimization method that allows ignoring the first column of an index when the first column of the index is not included in the condition but the following column is included in the condition (in most cases, =). Applying ISS is considered when **INDEX_SS** for specific tables is specified through a query hint and the below cases are satisfied. 1. The query condition should be specified from the second column of the composite index. 2. The used index should not be a filtered index. 3. The first column of an index should not be a range filter or key filter. 4. A hierarchical query is not supported. 5. A query which an aggregate function is included is not supported. In a **INDEX_SS** hint, a list of table to consider applying ISS, can be input; if a list of table is omitted, applying ISS for all tables can be considered. :: /*+ INDEX_SS */ /*+ INDEX_SS(tbl1) */ /*+ INDEX_SS(tbl1, tbl2) */ .. note:: When "INDEX_SS" is input, the ISS hint is applied to all tables; when "INDEX_SS()" is input, this hint is ignored. .. code-block:: sql CREATE TABLE t1 (id INT PRIMARY KEY, a INT, b INT, c INT); CREATE TABLE t2 (id INT PRIMARY KEY, a INT, b INT, c INT); CREATE INDEX i_t1_ac ON t1(a,c); CREATE INDEX i_t2_ac ON t2(a,c); INSERT INTO t1 SELECT rownum, rownum, rownum, rownum FROM db_class x1, db_class x2, db_class LIMIT 10000; INSERT INTO t2 SELECT id, a%5, b, c FROM t1; SELECT /*+ INDEX_SS */ * FROM t1, t2 WHERE t1.b<5 AND t1.c<5 AND t2.c<5 USING INDEX i_t1_ac, i_t2_ac limit 1; SELECT /*+ INDEX_SS(t1) */ * FROM t1, t2 WHERE t1.b<5 AND t1.c<5 AND t2.c<5 USING INDEX i_t1_ac, i_t2_ac LIMIT 1; SELECT /*+ INDEX_SS(t1, t2) */ * FROM t1, t2 WHERE t1.b<5 AND t1.c<5 AND t2.c<5 USING INDEX i_t1_ac, i_t2_ac LIMIT 1; Generally, ISS should consider several columns (C1, C2, ..., Cn). Here, a query has the conditions for the consecutive columns and the conditions are started from the second column (C2) of the index. :: INDEX (C1, C2, ..., Cn); SELECT ... WHERE C2 = x AND C3 = y AND ... AND Cp = z; -- p <= n SELECT ... WHERE C2 < x AND C3 >= y AND ... AND Cp BETWEEN (z AND w); -- other conditions than equal The query optimizer eventually determines whether ISS is the most optimum access method based on the cost. ISS is applied under very specific situations, such as when the first column of an index has a very small number of **DISTINCT** values compared to the number of records. In this case, ISS provides higher performance compared to Index Full Scan. For example, when the first column of index columns has very low cardinality, such as the value of men/women or millions of records with the value of 1~100, it may be inefficient to perform index scan by using the first column value. So ISS is useful in this case. ISS skips reading most of the index pages in the disk and uses range search which is dynamically readjusted. Generally, ISS can be applied to a specific scenario when the number of **DISTINCT** values in the first column is very small. If ISS is applied to this case, ISS provides significantly higher performance than the index full scan. However, it means improper index creation that ISS is applied to a lot queries. So DBA should consider whether readjusting the indexes or not. .. code-block:: sql CREATE TABLE tbl (name STRING, gender CHAR (1), birthday DATETIME); INSERT INTO tbl SELECT ROWNUM, CASE (ROWNUM MOD 2) WHEN 1 THEN 'M' ELSE 'F' END, SYSDATETIME FROM db_class a, db_class b, db_class c, db_class d, db_class e LIMIT 360000; CREATE INDEX idx_tbl_gen_name ON tbl (gender, name); -- Note that gender can only have 2 values, 'M' and 'F' (low cardinality) UPDATE STATISTICS ON ALL CLASSES; .. code-block:: sql -- csql>;plan simple -- this will qualify to use Index Skip Scanning SELECT /*+ RECOMPILE INDEX_SS */ * FROM tbl WHERE name = '1000'; :: Query plan: Index scan(tbl tbl, idx_tbl_gen_name, tbl.[name]= ?:0 (index skip scan)) .. code-block:: sql -- csql>;plan simple -- this will qualify to use Index Skip Scanning SELECT /*+ RECOMPILE INDEX_SS */ * FROM tbl WHERE name between '1000' and '1050'; :: Query plan: Index scan(tbl tbl, idx_tbl_gen_name, (tbl.[name]>= ?:0 and tbl.[name]<= ?:1 ) (index skip scan)) .. _loose-index-scan: Loose Index Scan ---------------- When **GROUP BY** clause or **DISTINCT** column includes a subkey of a index, loose index scan starts B-tree search by adjusting the range dynamically for unique value of each of the columns that make up the subkey. Therefore, it is possible to significantly reduce the scanning area of B-tree. Applying loose index scan is advantageous when the cardinality of the grouped column is very small, compared to the total data amount. Loose index scan optimization is considered to be applied when **INDEX_LS** is input as a hint and the below cases are satisfied: 1. when an index covers all **SELECT** list, that is, covered index is applied. 2. when the statement is **SELECT DISTINCT**, **SELECT** ... **GROUP BY** statement or a single tuple **SELECT**. 3. all aggregate functions (with the exception of **MIN**/**MAX**) must have **DISTINCT** input 4. **COUNT(*)** should not be used 5. when cardinality of the used subkey is 100 times smaller than the cardinality of the whole index a subkey is a prefix part in a composite index; e.g. when there is INDEX(a, b, c, d), (a), (a, b) or (a, b, c) belongs to the subkey. When you run the below query regarding the above table, .. code-block:: sql SELECT /*+ INDEX_LS */ a, b FROM tbl GROUP BY a; CUBRID cannot use a subkey because there is no condition for the column a. However, if the condition of the subkey is specified as follows, loose index scan can be applied. .. code-block:: sql SELECT /*+ INDEX_LS */ a, b FROM tbl WHERE a > 10 GROUP BY a; As follows, a subkey can be used when the grouped column is on the first and the WHERE-condition column is on the following position; therefore, also in this case, loose index scan can be applied. .. code-block:: sql SELECT /*+ INDEX_LS */ a, b FROM tbl WHERE b > 10 GROUP BY a; The following shows the cases when loose index scan optimization is applied. .. code-block:: sql CREATE TABLE tbl1 ( k1 INT, k2 INT, k3 INT, k4 INT ); INSERT INTO tbl1 SELECT ROWNUM MOD 2, ROWNUM MOD 400, ROWNUM MOD 80000, ROWNUM FROM db_class a, db_class b, db_class c, db_class d, db_class e LIMIT 360000; CREATE INDEX idx ON tbl1 (k1, k2, k3); CREATE TABLE tbl2 ( k1 INT, k2 INT ); INSERT INTO tbl2 VALUES (0, 0), (1, 1), (0, 2), (1, 3), (0, 4), (0, 100), (1000, 1000); UPDATE STATISTICS ON ALL CLASSES; .. code-block:: sql -- csql>;plan simple -- add a condition to the grouped column, k1 to enable loose index scan SELECT /*+ RECOMPILE INDEX_LS */ DISTINCT k1 FROM tbl1 WHERE k1 > -1000000 LIMIT 20; :: Query plan: Sort(distinct) Index scan(tbl1 tbl1, idx, (tbl1.k1> ?:0 ) (covers) (loose index scan on prefix 1)) .. code-block:: sql -- csql>;plan simple -- different key ranges/filters SELECT /*+ RECOMPILE INDEX_LS */ DISTINCT k1 FROM tbl1 WHERE k1 >= 0 AND k1 <= 1; :: Query plan: Sort(distinct) Index scan(tbl1 tbl1, idx, (tbl1.k1>= ?:0 and tbl1.k1<= ?:1 ) (covers) (loose index scan on prefix 1)) .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE INDEX_LS */ DISTINCT k1, k2 FROM tbl1 WHERE k1 >= 0 AND k1 <= 1 AND k2 > 3 AND k2 < 11; :: Query plan: Sort(distinct) Index scan(tbl1 tbl1, idx, (tbl1.k1>= ?:0 and tbl1.k1<= ?:1 ), [(tbl1.k2> ?:2 and tbl1.k2< ?:3 )] (covers) (loose index scan on prefix 2)) .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE INDEX_LS */ DISTINCT k1, k2 FROM tbl1 WHERE k1 >= 0 AND k1 + k2 <= 10; :: Query plan: Sort(distinct) Index scan(tbl1 tbl1, idx, (tbl1.k1>= ?:0 ), [tbl1.k1+tbl1.k2<=10] (covers) (loose index scan on prefix 2)) .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE INDEX_LS */ tbl1.k1, tbl1.k2 FROM tbl2 INNER JOIN tbl1 ON tbl2.k1 = tbl1.k1 AND tbl2.k2 = tbl1.k2 GROUP BY tbl1.k1, tbl1.k2; :: Sort(group by) Nested loops Sequential scan(tbl2 tbl2) Index scan(tbl1 tbl1, idx, tbl2.k1=tbl1.k1 and tbl2.k2=tbl1.k2 (covers) (loose index scan on prefix 2)) .. code-block:: sql SELECT /*+ RECOMPILE INDEX_LS */ MIN(k2), MAX(k2) FROM tbl1; :: Query plan: Index scan(tbl1 tbl1, idx (covers) (loose index scan on prefix 2)) .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE INDEX_LS */ SUM(DISTINCT k1), SUM(DISTINCT k2) FROM tbl1; :: Query plan: Index scan(tbl1 tbl1, idx (covers) (loose index scan on prefix 2)) .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE INDEX_LS */ DISTINCT k1 FROM tbl1 WHERE k2 > 0; :: Query plan: Sort(distinct) Index scan(tbl1 tbl1, idx, [(tbl1.k2> ?:0 )] (covers) (loose index scan on prefix 2)) The following shows the cases when loose index scan optimization is not applied. .. code-block:: sql -- csql>;plan simple -- not enabled when full key is used SELECT /*+ RECOMPILE INDEX_LS */ DISTINCT k1, k2, k3 FROM tbl1 ORDER BY 1, 2, 3 LIMIT 10; :: Query plan: Sort(distinct) Sequential scan(tbl1 tbl1) .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE INDEX_LS */ k1, k2, k3 FROM tbl1 WHERE k1 > -10000 GROUP BY k1, k2, k3 LIMIT 10; :: Query plan: Index scan(tbl1 tbl1, idx, (tbl1.k1> ?:0 ) (covers)) skip GROUP BY .. code-block:: sql -- csql>;plan simple -- not enabled when using count star SELECT /*+ RECOMPILE INDEX_LS */ COUNT(*), k1 FROM tbl1 WHERE k1 > -10000 GROUP BY k1; :: Query plan: Index scan(tbl1 tbl1, idx, (tbl1.k1> ?:0 ) (covers)) skip GROUP BY .. code-block:: sql -- csql>;plan simple -- not enabled when index is not covering SELECT /*+ RECOMPILE INDEX_LS */ k1, k2, SUM(k4) FROM tbl1 WHERE k1 > -1 AND k2 > -1 GROUP BY k1, k2 LIMIT 10; :: Query plan: Index scan(tbl1 tbl1, idx, (tbl1.k1> ?:0 ), [(tbl1.k2> ?:1 )]) skip GROUP BY .. code-block:: sql -- csql>;plan simple -- not enabled for non-distinct aggregates SELECT /*+ RECOMPILE INDEX_LS */ k1, SUM(k2) FROM tbl1 WHERE k1 > -1 GROUP BY k1; :: Query plan: Index scan(tbl1 tbl1, idx, (tbl1.k1> ?:0 ) (covers)) skip GROUP BY .. code-block:: sql -- csql>;plan simple SELECT /*+ RECOMPILE */ SUM(k1), SUM(k2) FROM tbl1; :: Query plan: Sequential scan(tbl1 tbl1) .. _in-memory-sort: In Memory Sort -------------- The "in memory sort(IMS)" feature is an optimization applied to the **LIMIT** queries specifying **ORDER BY**. Normally, when executing a query which specifies **ORDER BY** and **LIMIT** clauses, CUBRID generates the full sorted result set and then applies the **LIMIT** operator to this result set. With the IMS optimization, instead of generating the whole result set, CUBRID uses an in-memory binary heap in which only tuples satisfying the **ORDER BY** and **LIMIT** clauses are allowed. This optimization improves performance by eliminating the need for a full unordered result set. Whether this optimization is applied or not is not transparent to users. CUBRID decides to use in memory sort in the following situation: * The query specifies **ORDER BY** and **LIMIT** clauses. * The size of the final result (after applying the **LIMIT** clause) is less than the amount of memory used by external sort (see **sort_buffer_size** in :ref:`memory-parameters`). Note that IMS considers the actual size of the result and not the count of tuples the result contains. For example, for the default sort buffer size (two megabytes), this optimization will be applied for a **LIMIT** value of 524,288 tuples consisting of one 4 byte **INTEGER** type but only for ~2,048 tuples of **CHAR** (1024) values. This optimization is not applied to queries requiring **DISTINCT** ordered result sets. .. _sort-limit-optimization: SORT-LIMIT optimization ----------------------- The SORT-LIMIT optimization applies to queries specifying **ORDER BY** and **LIMIT** clauses. The idea behind it is to evaluate the **LIMIT** operator as soon as possible in the query plan in order to benefit from the reduced cardinality during joins. A SORT-LIMIT plan can be generated when the following conditions are met: * All referred tables in the **ORDER BY** clause belong to the SORT-LIMIT plan. * A table belonging to a SORT-LIMIT plan is either: * The owner of a foreign key from a fk->pk join * The left side of a **LEFT JOIN**. * The right side of a **RIGHT JOIN**. * **LIMIT** rows should be specified as less rows than the value of **sort_limit_max_count** system parameter(default: 1000). * Query does not have cross joins. * Query joins at least two relations. * Query does not have a **GROUP BY** clause. * Query does not specify **DISTINCT**. * **ORDER BY** expressions can be evaluated during scan. For example, the below query cannot apply SORT-LIMIT plan because **SUM** cannot be evaluated during scan. .. code-block:: sql SELECT SUM(u.i) FROM u, t where u.i = t.i ORDER BY 1 LIMIT 5; The below is an example of planning SORT-LIMIT. .. code-block:: sql CREATE TABLE t(i int PRIMARY KEY, j int, k int); CREATE TABLE u(i int, j int, k int); ALTER TABLE u ADD constraint fk_t_u_i FOREIGN KEY(i) REFERENCES t(i); CREATE INDEX i_u_j ON u(j); INSERT INTO t SELECT ROWNUM, ROWNUM, ROWNUM FROM _DB_CLASS a, _DB_CLASS b LIMIT 1000; INSERT INTO u SELECT 1+(ROWNUM % 1000), RANDOM(1000), RANDOM(1000) FROM _DB_CLASS a, _DB_CLASS b, _DB_CLASS c LIMIT 5000; SELECT /*+ RECOMPILE */ * FROM u, t WHERE u.i = t.i AND u.j > 10 ORDER BY u.j LIMIT 5; The above **SELECT** query's plan is printed out as below; we can see "(sort limit)". :: Query plan: idx-join (inner join) outer: temp(sort limit) subplan: iscan class: u node[0] index: i_u_j term[1] cost: 1 card 0 cost: 1 card 0 inner: iscan class: t node[1] index: pk_t_i term[0] cost: 6 card 1000 sort: 2 asc cost: 7 card 0 .. _query-cache: QUERY CACHE =========== The **QUERY_CACHE** hint can be used to enhance the performance for the query which is executed repeatedly. The query is cached in dedicated memory area and its results are also cached at the separated disk space. The hint is applied to SELECT query only; however, for the following cases, the hint is not applicable to the query and the hint is meaningless: * a system time or date related attribute in the query as below ex) SELECT SYSDATE, ADDDATE(SYSDATE,INTERVAL -24 HOUR), ADDDATE(SYSDATE, -1); * a SERIAL related attribute is in the query * a column-path related attribute is in the query * a method is in the query * a stored procedure or a stored function is in the query * a system tables like dual, _db_attribute, and so on, is in the query * a system function like sys_guid() is in the query When the hint is set and a new SELECT query is processed, the query cache is looked up if the query appears in the query cache. The queries are considered identical in case they use the same query text and the same bind values under the same database. If the cached query is not found, the query will be processed and then cached newly with its result. If the query is found from the cache, the results will be fetched from the cached area. AT the CSQL, we can measure the enhancement easily to execute the query repeatedly using the COUNT function as below example. The query and its results will be cached at the first appearance, so the response time is slower than the next same query. The second query's result is fetched from the cached area, so the response time is much faster than the prior same query's one. :: csql> SELECT /*+ QUERY_CACHE */ count(*) FROM game; === === count(*) ============= 8653 1 row selected. (0.107082 sec) Committed. 1 command(s) successfully processed. csql> SELECT /*+ QUERY_CACHE */ count(*) FROM game; === === count(*) ============= 8653 1 row selected. (0.003932 sec) Committed. 1 command(s) successfully processed. The user can check the query to be cached or not by putting the session command *;info qcache'* in CSQL as follows: :: csql> ;info qcache LIST_CACHE { n_hts 1010 n_entries 1 n_pages 1 lookup_counter 1 hit_counter 1 miss_counter 0 full_counter 0 } list_hts[0] 0x6a74d10 HTABLE NAME = list file cache (DB_VALUE list), SIZE = 211, REHASH_AT = 147, NENTRIES = 1, NPREALLOC = 0, NCOLLISIONS = 0 HASH AT 0 LIST_CACHE_ENTRY (0x6c46d18) { param_values = [ ] list_id = { type_list { 1 integer/1 } tuple_cnt 1 page_cnt 1 first_vpid { 65 32766 } last_vpid { 65 32766 } lasttpl_len 24 query_id 2 temp_vfid { 64 32766 } } uncommitted_marker = false tran_isolation = 4 tran_index_array = [ ] last_ta_idx = 0 query_string = select /*+ QUERY_CACHE */ count(*) from [game] [game]?193="en_US";194="en_US";249="Asia/Seoul";user=0|833|1 time_created = 11/23/20 16:07:12.779703 time_last_used = 11/23/20 16:07:22.772330 ref_count = 1 deletion_marker = false } The cached query is shown as **query_string** in the middle of the result screen. Each of the **n_entries** and **n_pages** represents the number of cached queries and the number of pages in the cached results. The **n_entries** is limited to the value of configuration parameter **max_query_cache_entries** and the **n_pages** is limited to the value of **query_cache_size_in_pages**. If the **n_entries** is overflown or the **n_pages** is overflown, some victims among the cache entries are selected and they are uncached. The number of victims is about 20% of **max_query_cache_entries** value and of the **query_cache_size_in_pages** value. They went down to the water-side to try the effects of a bath in the surf as it rolled in from the Pacific Ocean. They found it refreshing, and were tempted to linger long in the foam-crested waves. Near by there was a fishing-place, where several Japanese were amusing themselves with rod and line, just as American boys and men take pleasure in the same way. Fish seemed to be abundant, as they were biting freely, and it took but a short time to fill a basket. In the little harbor formed between the island and the shore several junks and boats were at anchor, and in the foreground some smaller boats were moving about. There was not an American feature to the scene, and the boys were thoroughly delighted at this perfect picture of Japanese life. It was sea-life, too; and they had island and main, water and mountain, boats and houses, all in a single glance. "For our sick soldiers!" "Yes, I'm going to take that away with me to-day." "I destroyed it. There was no object in keeping it. I tore it up then and there and pitched it on the pavement. The motor was driven by a dumb man, who conveyed me to the corner house. It struck me as strange, but then the owner might have returned. When I got there I found the man subsequently murdered suffering from a combination of alcoholic poisoning and laudanum. It was hard work, but I managed to save him. A Spanish woman--the only creature besides my patient I saw--paid me a fee of three guineas, and there ends the matter." fatherly letter--but frank! He said he saw from the address that I ¡°Who are you, please?¡± Sandy shot the question out suddenly. He had gone back. "You'll come through all right," said the Surgeon smiling. "You're the right kind to live. You've got grit. I'll look at your partner now." 'he Took Another Look at his Heavy Revolver.' 254 But after the gun was gone, and after Shorty had written a laborious letter, informing Sammy of the shipment of the gun and its history, which letter inclosed a crisp greenback, and was almost as urgent in injunctions to Sammy to write as Sammy had been about his piece of ordnance, Shorty sat down in sadness of heart. He was famishing for information from Maria, and at the lowest calculation he could not hope for a letter from Sammy for two weeks. The firing and stone-throwing lasted an hour or more, and then seemed to die down from sheer exhaustion. Odiam had triumphed at last. Just when Reuben's unsettled allegiance should have been given entirely to the wife who had borne him a son, his farm had suddenly snatched from him all his thought, all his care, his love, and his anxiety, all that should have been hers. It seemed almost as if some malignant spirit had controlled events, and for Rose's stroke prepared a counter-stroke that should effectually drive her off the field. The same evening that Rose had gone weeping and shuddering upstairs, Reuben had interviewed the vet. from Rye and heard him say "excema epizootica." This had not conveyed much, so the vet. had translated brutally: "I don't ask for that to-night¡ªall I ask is food and shelter, same as you'd give to a dog." "Yes, yes, we will consider of some more fitting answer," said Leicester fiercely;¡ªand after consulting earnestly for a few minutes with Jack Straw, Thomas Sack, and other leaders, he returned to De Vere, and said¡ª HoMEÃâ·ÑÍøÕ¾Ò»¼¶ÊÓÆµ²¤ÂÜÃÛ ENTER NUMBET 0018shanghaiba.org.cn
www.sbjgjkqc.com.cn
51amiba.com.cn
b031.com.cn
www.arvix.com.cn
www.meiso.com.cn
www.gjuq.com.cn
www.whhxhb.com.cn
gkbpo.com.cn
www.wkyv.com.cn
迷人的浪屄 重口味av 狂操小姐特爽吗 美女屄照片 仓井空片子 潘号 美女大胸色图 美女xingjiao18p 妇女小穴图片 c168b91e000357e6 丝袜骚妇爱爱 操逼图1234 制服诱惑五月四房间 美鲍图下载 亚洲猛女性交图片150p 欧美做爱15图片 草妈妈小姨子穴 刘亦菲无码艳照图 少女和狗性交 裸模陈丽佳 WWW.73XH.COM WWW.22222SE.COM WWW.QOEDU.ORG WWW.NNNN16.COM WWW.KYFDZ.COM WWW.CCC156.COM WWW.GUOXUE.COM WWW.YLQWX.COM WWW.TFKRQ.COM WWW.MAODH.COM WWW.BBB184.COM WWW.2323AV.COM WWW.JAVCHIP.COM WWW.BX2500.COM WWW.SYFX168.COM WWW.XIEEGUO.COM WWW.DSYQ.COM WWW.2651.CN WWW.222128.COM BAWRIBOON.CHANREUA WWW.N9B3.COM WWW.999KPW.COM WWW.ZG99.COM WWW.HHH689.COM WWW.SJ1718.COM WWW.AIDJE.COM WWW.7777RR.COM WWW.BOBO138.COM WWW.QQHJY.COM WWW.5ITAOTU.COM WWW.576586.COM WWW.44SJSJ.COM WWW.464HP.COM WWW.CX765.COM WWW.CCC559.COM WWW.H3AA.COM WWW.998QQ.COM WWW.696EE.COM WWW.752HH.COM WWW.PLAYQTU.COM WWW.HWXNT.COM WWW.BST818.COM WWW.WJABBS.COM WWW.YSTS8.COM WWW.JXAXS.COM WWW.96ZIE.COM WWW.161XS.COM WWW.74KD.COM WWW.VERISIGN.COM WWW.16KK.COM WWW.YNSERVER.COM WWW.QDH100.COM WWW.520SU.COM WWW.CENTOSCN.COM WWW.CCC680.COM WWW.ES60.COM WWW.AXQ2.COM WWW.CK180.COM WWW.38TVTV.COM WWW.KDSMIT.COM WWW.4455FF.COM WWW.HBYPHG.COM WWW.Y5ZN.COM WWW.111FN.COM ILYA.IOSIFOV WWW.YJSBB.COM WWW.9877YX.COM FABRIZIO.FERRACAN WWW.3344G.COM WWW.SJYHOME.COM WWW.984AA.COM WWW.PPAV1515.COM 青青草注册会员 chengrenseqingyingyuan 亚洲丰满大肥屁股视频 欧美少女OOXX svs视频精品分享视频 719BBcom AV制服丝袜 13yn_com wwwOOSIHUCOMmagnet 一本道处女A片视频 抽打妈妈的淫穴15p 播色网1 三邦车视欧洲 成人动漫阿凡达 成人综合社区免费视频www5xsq1com 乱伦家庭一级a片在线播放 四虎影库必出精品浅仓彩音 干老太太wwwjiujiu6pcom wwwonlyjizzcom 连裤袜成人 sq小说网站 欧美色图就爱啪啪啪 亚洲内衣振动器magnet 午夜剧场成人av专场 自拍av射射 伦理琪琪影院a 天天电影网吧 wwwxixi5566 女人下部真实图片 淫荡的黄蓉校园春色 校园春色古典武侠在线视频 雨宫琴音小朋友 武侠古典长篇连载黄色笑话校园春色性爱技巧淫妻交换 干法国小姑娘 童颜巨乳港台三级视频 调教家政妇serious漫画在线观看 wwwvom色小姐 赵薇评价古巨基 男生舔女生bb的照片 东京热苍井空QVOD aluoli5社区 wwwaicbbcom 校花跟我xxx 制服美女小色网 黄色视频机哇插屁股 俄罗斯三级排行 啪啪影院破解版免费 wwwyoujizzjizzcom 三圾片都有哪些 都市激情校园春色家庭乱伦文学 网盘迅雷五月 文爱小说h xfplay丝袜美腿 www3324444comwwwwoaisikucom av爱爱aaa 久久打炮性生活 性爱偷情乱伦做爱操逼 熟女炮友自拍在线视频 裸成人AV 美国成年免费网站 葵司三级片 38p0pocom XxPen成人免费视频 色播五月情天 亚州女性自慰视频wwwjiujiu6pcom 九九色大姐 免费在线视频色小说无广告 欧美下体艺术写真 www4hu41 能见到毛的免费日本电影 影音免费观看欧美A片 japanese12在线homesextopnetsextopnet 给个网站你们懂的2017 久草热av在线小说 q1se 爆操白嫩人妻p 72bao在线 天天拍天天操天天撸 avtt2020 幼女av电影资源种子 3D台湾香港经典三级日本 国产成年人Av影院 琪琪影院金瓶梅 亚洲色~ 性爱合成图片 www5060lucom 尤物人妻小说 张柏芝艳照门在线手机 妓院虐待美女图 3W699UUUCOM wwwyy4480org亚洲AVqq 裸妇熟女 古装一级无码A片王昭君rmvb av空姐蕾丝 dizhi99妇科检查 AV区亚洲AV欧美男同AV 迅雷蚂蚁泰国女优 小骚逼操操操啊啊啊 大鸡巴逼 孙子狂草奶奶 wwwaa456com 9115sss视频在线 少妇少男同奸 3p夫妻交换做爱 狼人综合网123 wwwkkkk25 外国幼女网址 成人视频在线看青青草在线看 狗和人的伦理电影 qiuxis6com 大胆操逼BB人体 月光宝盒官网bai5acn 最新黄色口交图 成人老婆在线性爱视频 不要vip的完整黄片 色和尚香蕉撸 熟妇人妻在线av pornxxx幼女 裸体赌过程 三级片满清十大酷刑 在车上被强嗯啊不要120p wwwxbxbcon 真实偷拍初中生厕所12p 东方av亚洲图片欧美图片bbcc789com 澳门博彩裸体艺术图片 成人动画理论片 亚洲欧美日韩强奸 妓女学校妓女小说 LELEHEIUSmagnet 轮奸文章 淫妻按摩录 色爱影视 幼女嫩穴下载 超碰免费动漫视频 狠狠干胖妞 大机巴饶了我吧视频 人体艺术摄影动漫 幼女色吧 狼人艹综合 先锋资源av色撸 影视操逼的人生 亚洲性爱www8oyxcom 五月姬情 美女姐姐15p 亚洲欧洲校园另类心灵捕手 欧美亚洲激情小说色图另类 妈妈被我t 欧美肥婆性爱 亚zhou色图 人妻好吊视频在线观看 萝莉裸下体 磨豆腐漫画 同学妈妈随便逼操 2B姐姐的色图 偷拍自拍下载 色色色色色小说激情 平井玛利亚 女仆 尻绳 欧美性爱偷拍自拍古典武侠 欧美另类幼女做爱 在线手机播放器 伊人88综合图片网 有声小说每天撸一撸 麻生希第一部快播 制服诱惑亚洲图片 风月恶之花剧情介绍 ckck爱情电影网 女优美弥藤无码先锋影音 戌人快播电影 欧美肥臀影视 着a片 2017宝妈手机在线看片 欧韩久久视频 成人小说3q 成人ob快播 母子乱伦爱爱在线mmissno1com 干网在线清洗流程图 骑淫妻网 wap9999akcom ye3333com 暴插大奶少妇 Yinse人妻 看黄色网站主持人大屁股大逼图 swwwbu370comhtmindexhtm 亚州强爆乱伦视频 亚洲激情性 色莱坞免在线视频 美女粉色AV 极品夫妻大白屁股 丝袜护士的逼 987资源网 丝袜妹子穿丝袜wwwyymeizicom 交换人妻番号 人妖重口味另类文学 综合征服色的站 人妖性爱高潮图片 巨乳幻想第二集 殴美色妇1024 AV作品免费视频 www淫色色淫com奇米综合网 44kkmm` 啊鲁啊奴 我抽插巨乳女教师 守望先锋av动画在线 日本中文a漫 激情五月狠狠干 美国搞师傅 porn91明星 a片哪里可以下载地址 wwwribiavcom W66cccom 瑜伽口交无码成人自拍 欧美人与XXX 亚洲有码偷拍制服丝袜 www115cdcom aV天堂手一 男女全裸舔逼高清片 啊撸啊了嗯 女自拍揉胸视频大全 西方黄色成人三集A片 撸春 超碰爸爸闯进来 亚洲清纯美女性爱炮图片15p 日本黄色电影成年网 射精女性xxx 乱伦熟女人妻在线 波多野结衣床上被操 夜夜撸在线视频暗暗撸在线视频加多撸在线视频天天撸在线视频 淫荡啊浪叫啊操我 国产谷露1 册册XX 美日韩A片在线观看mp4 WWW55ybybC0m下载 夜夜撸wwwkanav05comwwwqbiryfrdoizcn 3344EVCOM 足交手机在线 美女直播videombaiducom 久久在线视频精品99re6wwwbs799com6655acom 中国成人av视频 羞涩涩 av红楼梦在线播放 动漫套图第一页 经典干幼幼小说mchinadmdcomwwwgzyunhecom 捆绑色色色 美女艺术照无码 www凤凰网con 在线播放成人网 偷拍自拍强奸乱伦要在线观看 250pp6wpin 闹洞房就去干 乱伦电影狠狠撸hhh600com 巴扎黑电影 操老师嫰穴 日屄短文 女性阴体艺术图147 熟女沙织漫画 白虎小穴被早 张悠雨叉开腿露b高清 偷看屄的故事 黄色动画图片小说 插菊花色色 幼奸吧 WWW_ZZZ13K_COM 肏笓片 我把就舅妈给操了 进进出出美少女 人与动物交配哪里者 影音先锋激情综合网 超清躶体美女写真 53kkk亚洲小说 杨永晴ed2k 张莜雨人体艺术致意 抠屄淫色网 zipailaobishipin 国模茶雪大尺度高清局部私处人体艺术图片 小女孩逼尿屄图片 南宁极品美女 欧美 性交图片 113rr WWW_RIRIHEI_COM 夫妻性交真像视频 a片强奸系列快播片 k8经典伦理 韩国女主播朴妮唛的黄色小说 和妈妈在火车上做边爱 色 WWW_WW789MM_COM 那个爽啊 出卖女友刘晴小说 干逼空姐电影 av销量第一的番号 撸管色中色 水果干影院 电影 高清口交图 ed2k佐佐木 黑木耳验收材料 老奶奶跟孙子做爱电影 弟弟和姐姐乱伦 147日本人大胆子女艺术图 黄色漫画书免费3级 一个20岁的凶虎 进爆欧美性爱 中国老女人草比 苍井空av百度网盘高清 亚洲美女论坛 与淑女乱伦 婷婷五月性 少男裸体人体艺术 尼钭空 龚玥菲xiaos 欧美裸体私处照 制服丝袜松下美由纪 调教日本女优 幼幼撸片 侏儒女 � aikojiaocom 32式夫妻性姿势动态图 xingaidexiaoshuo 美女一丝挂全一裡图 护士嫩b50p 第四成人黄色网站 京野结衣电影 漂亮女人下载 小色迷ge 美女车模操逼 西西自拍波多野结衣 欧美动态成人视频 女人一天最多能承受多少次性爱 五月天天色小说 越南女优 外国成人频道在线 欧美裸体影 丁香裸图 入江辉美在线电影 葵花牌壮腰健肾片 广末凉子成人片被性侵 美女裸体人体大胆脱小内内露b穴毛图 成人大胆摄图 亚洲色图 筱 和公公乱伦的女人们 少妇美嫁娘 中国人做爱自拍偷拍视频 银虎导航网银虎新地址 田韩a片 我姐尻屁片 儿子强奸继母图 美女全裸劈腿被奸照片 月野沙里qovd 护士不穿内衣要我的大鸡巴操她逼 经典性爱图片 精品少妇被老外硬刺无码吞精 qvod 套动换妻 色色艹妹妹 免费成人网8888 中华人民共和国行政诉讼法 暑假危机夏令营修改器 彩色面条机 兴业银行赤道银行 大朗启明星初级中学 孟锦云照片 俄罗是做爱 巨乳超美熟妇人妻 gegeyaocaobidianying 郑州私人影院装修 pornsoraaoi 小姐操逼照片删除删除 非洲美女大胆人体艺术照 weiriguobidejiba 狠撸撸蜜桃 klk第一主双插双枪爆菊 毛逼网站 做爱图片激情小说 WWW260TUCOM 大尺度裸体操逼图片 制服美女淫影院 射在里面的照片16p 美鲍色图操b 学生尻妣视频 www色中色在线色com 张柏芝艳照偷拍 美女性爱过程图 同志小说一直男干了我和老婆 日本少女乳头人体艺术照 美女用手掰逼套图 日韩在线自拍在线 各地美女人体艺犬 农村黄 好看的乡村熟妇小说 父与女偷摸乱伦 我和少女做爱视频 我插入女老师体内 东京热无需播放器 快播一本道a波多野姐姐 淫秽网站专区 水里狠插屄 丝袜骚妇人妻乱伦 酒色1413 大胆人体艺术导航 快播孕妇影片 欧美自拍偷拍下载 oumei在线长篇小说 WWWKE47COM 章子怡淫照 操阴快片 宋祖英大胆人体艺术 香港成人免费电影艳照门 首页52avzycom mac版淫色网站 美女被马强奸小说 综合色站影音先锋 儿子操妈妈bi 影院里那些男孩的秘密txt 免费在线3p口交图片 亚卅大胆人体艺术摄影 美国性感波吧 强奸丝袜美女的视频 为什么上不去成人电影网了 张幼女大胆美女人体艺网 韩国限制片迅雷种子下载 女乱15p 骚逼大咪咪高潮了 亚洲色区成人电影图片 与老师性交 农夫导航人体艺术 日本丝袜片子下载 3p性感尤物内射她的小骚穴 粉红亚洲妹偷拍自拍 风情谱女公关第10集下 黑人大战亚洲骚货 五月天婷婷乱伦图书 美女图片大胸删除 屄草垮 黄色glf 黑人强奸熟女影音先锋 足x番号 插逼里动态图 妹妹干偷拍私拍自拍性爱色图 激情美丽小骚屄 温州女友做爱视频 迅雷黑人a片下载 美女邪恶裸露人体艺术 日本黄seibt 苍井空擦b 第9影院在线观看 丰乳肥臀迅雷 WWWWW87XXOOCOM 快播大陆少女1级片 丝袜足交老师小说 国产视频熟女系列 女人与大黑狗真实插入播放器 农夫成人电影人与兽交 淫崎千鹤动画 五月天乱伦色色的有哪些小说 工具插入小穴 鸡巴图片网 怒火街头在线视频 快播日本a优 久操偷拍自拍 18女人人体 lu二哥男人影院 零度战姬ed2k 性感日本古典黄色图集 姐妹情室光棍 日木三极片 激情亚洲色图先锋 动慢成人 伊人在线琪琪色酒色网 朋户区av视频 肉丝裤袜跳蛋小说 丝袜美腿新感觉要操逼网 日本老奶性视频在线观看 爆乳欲室在线观看 狼人干综合新地址HD播放 saiavloanmagnet 性启蒙番号 老淫哥 搞清大片人人看欧美 亚洲美穴15p 彩漫哥哥的sex计划 av成人视频干妹妹 xx妹妹 裸体毛网站 亚洲幼女口交电影 亚洲色偷拍亚洲图片18m18vecom 国产自拍韩国综合 三级片嫩模做爱视频成人片 激情乱伦三级片 女性做爱人体艺术 狼国网成人小说网 我和妹妹在浴室里操 大姨姐与妹夫乱伦偷情 妻子蜜穴 夫妻自拍和朋友做爱偷拍自拍全部视频 overthumbspenis图 酒色狼国成人 干呦呦图片 裸体漏阴茎阴道性交流k精 狼国3p图 父女奸淫荡 pom黄片 小说区黄色小说 av磁力网站 www美女sex 米奇影影 新婚开苞 日本大胸熟女妈妈在线视频 色就是色欧美图片亚洲图片7eavcom 强插小嫩妹 撸撸火影同人 wwwmumu50comuc 就爱啪欧 女教师成人电影网 亚洲色图制服丝袜骚秘书 金麟岂是池中物无修版 久久热人兽交配 成人电影成人网站成人小说网 模特公车痴汉在线 mama姐弟cao oojizz 成人性交免费一级黄片 日本漂亮的av无码网址 全裸无码无内衣照片 女王专区 夜i夜i骑 欧美五月香婷婷 黄色三级片爱色色哥哥 同性恋黄色小说小卖部 人体艺术照sadrine私房美女图 MP4视频亚洲日韩色就是色欧美setu avHS动漫网站 艹比视频免 成人诱惑网 丝袜淫母 最新幼交自拍上传视频 丝袜美女说我爱被你插在线播放 男屁眼被曰小说 男男性爱想双飞XX网 av女苍井空大胆人体 插射进去操综合网 先锋影音av资源站馒头 女婿让我疯狂 wwwhaorenshuoc 空港magnet 249hh快播电影 70岁操屄 色影院 另类有声小说 小泽玛利亚码新作 小泽玛利亚vod 哪里有h网 www小沈阳网com www松原油区二中 东京热antianshaji 东京热妇女 酒色网电影 手机现在怎么看黄片 去哪看黄片 想看黄色小说 彩美旬果 国产自拍 就爱插比 就去黄色 性爱用品 苍井空与狗 广播五月天 淫荡色小说 007成人网 12点文学网 人间风月影院 台灣佬娛樂網 唐伯虎成人站 淫妹妹激情图 163色电影网 在线电影性乐汇色高清 桃花族 撸特特 篱笆女人和狗电视剧 一本道avt天堂网大香蕉 好吊妞视频 mp4 亚洲欧美动漫在线字幕 淫色人妻午夜 色色色999韩在线播放 狼人干综合亚洲av 外兔网黄色网 DVDES- -664 mp4 av在线东方影库 免费看片美女 久久爱一本道 老鸭窝伊人无码不卡无码一本道 亚洲日韩色偷高猫咪 丁香五月综会缴猜小说 美祢藤コウ影院 吉泽明步 极道之妻 先锋 舒淇三彶在线观看 鲁大妈Xo 裸条在线观看神马在线 女捜査官西条琉璃在线 IPTD 853 在线 色色影视插插综合网 AV成人电影天堂 泷泽萝拉无码 ftp 大波浪综合成人网 欧美手机成网站 绝色福利导航视频 200bbb 国产自拍 视频 - 色色风-成人在线视频首选! 祼露毛片 jlzzjlzz现在播放 靠逼动漫影音 自拍经典迅雷下载 91大神扬风回馈网友支持,邀请网友一起3P白嫩性感的大奶女友,前半夜操完睡觉后 佐藤佳代无码 妹妹影院福利片 秋霞电院在线情侣偷拍 性8春暖花开论坛亚洲区 兄妹番号 新疆梦郎车震3P轮战50老逼 青青草免费在线播放 全裸正面叉视全裸正面叉视频 亚洲aV 性感皮裤高跟36D爆乳骚货情人性欲高涨 边看AV边暴力淫操 高潮迭起 浪叫不断 使劲 校园春色视频 求一个免费看成人直播的网站 小片网站 日韩无码国产精品欧美激情 日本无遮拦搞基视频 在线偷拍女厕正面视频 日韩丝袜写真视频 影音先锋看片资源q814@ 圆挺奶 在线观看美肉流刑地 天堂鸟影院西瓜 幼女自拍 超频免费视频12 剧情演绎在线 春野樱黄 萝莉做爱 日本午夜大片免费下载 欧美一本道字慕v 曹逼逼 成人影院d 91apt cn/mc taosege 玉足亲吻袜袜屋关注的视频 曰本人男女做爰视频 人休艺术张伯 用啥看考比视频下载 福利视频伊一 广州sm论坛 泰国古装A片 下载 五月福利视频导航 宅男福利成人在线 亚洲 视频偷拍 五月色播 loli h movie 下载大鸡巴视频资源在线播放 火星打接触在线免费观看 诱惑自拍 爱情鸟做爱视频 丝袜全包挑战视频采集 灵猴福利影院下载 三级做爱网站视频 少妇寂寞与狗迅雷下载 下载 被大鸡吧塞满的视频 99福利视频在线 大香蕉一本道富二代 李宗瑞在线午夜福利 欧美艳舞在线播放XXX yy6080影视觉影 黄色小视频一 公海 日本 美女 MP4下载 操你啦在线视频综合视频 亚州福利色 苍老师唯一流出视频看 女神自慰磁力下载 殴美黄色视频 g0g0图片大全 big acg 杨丽箐丝袜 美山兰子 富姐搭讪坐顺风车被 爆乳天堂 麻酥酥哟完整视频 magnet 美教师地狱责问 免费啪啪free 女生自拍在线 蜜桃直播脱内内 欲忘岛在线免费视频 迅雷下载 双穴 高分影视盒视频播放器 色爱亚洲五月天 wwwuuu7777com 无翼鸟少女全集 美莉喷奶截图 深夜影院免费打炮无码电影 台湾理论一本道电影 四库影院在线看的免费视频 午夜影院色琪琪 初川南 xfplay 2018黄色网站仼你搞不一样的搞法 caositayingyuan 曾舒蓓 w午福利人 91大神经典作品酒吧认识 青青草在线自拍综合 韩国操逼现场 jux886在线观看 樱井莉亚97集在线播放 t66y上榴人士 4444国产自拍 农夫av片导航电影 足控电影有哪些 三级riri看 亚洲强奸乱伦比比资源站 欧美破苞手机在 韩国可疑的美容院电影斑马影院 4438x2最新 韩国演艺圈1313在线观看 网站升级反问 xfyy卡通动漫 弱气乙女 浴室套图 成人资源AC av在线直播 韩国 年轻妈妈在瑜伽室做爱 最后还在家里的电影 www,5x脳,coM 8055神马电影 六点成人 波波视频成人影院 av插进去 看片+v信 www路AV av网站国产在线观看 俺去啦怎么打不开在 神马综合天堂 疯狂做爱dvd xianfengAV 德国老太AAA视频免费一览 第3页自拍tp 大香蕉狼人3d动漫 大香蕉新人人现 飞机福利视频导航 福利gof 浮淫视频 对白精彩淫荡风骚眼镜熟女妈妈与干儿子淫乱直播吊钟大奶妈妈是真的骚被爆操内 xx4s4scc 噜噜ccc 88电影于是院 18ansvideosdese ov 日本成人黄色动漫视频 大香蕉高清网站在线 高富帅小鲜肉微信约炮粉嫩小穴童颜美眉啪啪啪 青青草小穴视频 小奶屄 成人隔壁老王网站 国产综合5x视频在线 白虎嫩滑视频 激色猫欧美系列大香蕉 求黄片百度云链接 韩国女主播种子下载 magnet 波儿影院 99rehd。cc 欧美视频1随机播放 人人妻在线人人 成人av所有网址 天天re99 俺播 视频二区 亚洲 欧美免费 涩琪琪手机原网站 一冢本av中文字幕 wwwAV手机 朴妮唛福利全集霸气村 xxxooo日韩 御工黄色视频 色色播播,四四播播 ai美女鲍鱼b 今日推荐视频更新于 ------------------------ 《幼幼》两个18岁日本学妹背着 日本公开在线无码视频 182福利大香蕉影院 sosonn 在线漫画 午午西西影院 好看的吃奶av番号 eee119改域名 口交视频app 小黄瓜免费的福利视频 梦莉视频导航 馒头B紧身裤视频热舞 国产2017自拍视频 国产 偷拍 日韩 欧美 9丨福利社区你懂的 xxxx日本免费视频高清无码 【正在播放 [MXGS-754] 別顏空姐 麻生希[中文字幕] 第1集_日本av电影 av网站 青青草韩国演艺圈悲惨 0077cao改成什么了 丁香花开心五月手机在线 51av影院 醉地艾迪东方 秋霞影院www,eeussyy 守望先锋AV动漫版 影音先锋 兽兽门2008在线 理论片中文动漫dvd 午夜无码影院百度 亚洲色农夫Av 狼狼在线观看免费 新人主播性感长腿小安妮,情趣内衣火辣热舞,粉嫩骚逼激情自慰,呻吟可射,精彩不要错过第二弹 射精王 成人短片库m4格式 被窝全黄色片 妹控ova 日日操无码视频 香丁六月婷香丁网 河南露脸超嫩 日日在线 在线偷拍福利视频 一本道插逼逼 美女破处 大空美绪 午夜av影院 手机版 色尼姑影灰灰影院 日韩护士丝袜无码迅雷看看 免得黄色视频 伊甸园李丽莎福利在线 日本偷拍免费高清视频, 3344动画伦理片 图片小说 西瓜影音 黄色视频小说网站 番号水杯里面下药 WWW4T4F 日本女人喷潮完整视频 撸大爷影院 日必在线播放 91在线福利影院 最美人妻女教师 苍井空 Z影院。 gvg464中文字幕 成年轻人网站色直接看免费 电影颐和园耒删版在线播放 男人天堂在线资源tb hqnxiucao ffeex日本女孩 7k7k成人网 柳州莫菁视频12部全集 有点婴儿肥的清纯巨乳小学妹 资源影院tom51西瓜 9uu18 con 369看片永久免费 star-527古川ぃぉり 泰国天皇秀视频高清 757午夜视频第28集 极品F罩杯二次元狂热少女女生寝室场景视角自拍视频 51avi免费视频新地址 小明中文字幕免费视频在线观看 想看老外日屄的视频 性爱 视频 性交细节抽插视频 邪恶少漫画大全3d全彩欧美 鸭王2abc影 性交视频中国 小雪小视频bd 邪恶全彩无码ac漫画大全 JAVHIHIHI视频 神马影院dy88 福利 松果儿你懂的 幼nv fanhao App爱波成人影院 艺术片 伦理片 国产精品 od369韩国漫画 阿v在线观看免费 天堂 ananshe 日本东凛视频在线 成人电影午夜剧场a 开心丁香综合缴情网 任你在干线 玖玖色北条麻妃 av小说秘 欧美脚交在线视频foot 巴西美女按摩视频 色色哒福利 绝色老人轮奸波多野结衣 操妞视频播放 she一夜做爱视频 日亚洲欧美牛b叉电影 CcCC77欧美性爱 s第一福利 岛国激情片 我的老师黄片 hd东京热无码视频 成人性感动漫xxx 午夜影院xo暴爽影院 想要零用钱妹妹 素股 春节来历 催乳成人福利视频在线观看 亚州色图片成人插入视频 淫色草民电影 1027 核工厂 down xp 黄色视频高潮 播放s级毛片 日本成人性视频 日本厕所偷拍视频tub 摸射你在线视频 四虎尻屁影库 群橹大香蕉一本道dvd 白石さゆり 司机 亚里沙tsdv 41636在线 白白操在线免费观看 人人澡人人漠大学生 擼擼色綜合 黄色网站2117 芥麦色片 五月天亚洲网站 国外a片成人网 北山柑菜 中文字幕 被知道丈夫隔着魔镜 美容 国产在线导肮 苍井老师成人视频免费下载 猜谜系列的AV 波兰性交比赛视频 草莓午夜视频在国产 北京熟女楼凤群交 视频 国模超级福利在线 av导航大全 白肉淫 成人快播有声毛片 凹逼美女 老太太影院 黄播龙虾直播 陌陌约炮视频在线观看 自拍 欧美福利图片 800AV最新地址 未封av网站 蝌蚪窝窝在线观看 台湾怡红院 2018av国产手机在线视频 肉嫁高柳 magnet 澳门avav pppd424正在播放 向井蓝AV天堂 rbd浣肠 ts国产视频大全 wanz226mp4 vidz老湿影院 RIBENSANJIXIANGGANGSANJIHUANGSEWANGZHAN sl深夜福利 叉开大腿b我要添视频 rhj 228 播放 北川瞳在线高清 成人啪啪碰在线视频 RHJ-228 savk10 屄片小 se86视频在线观看 波多野结衣在家线观看 renrenmoshiping 美女主播露全身视频 プレステージ在线电影 国内偷看在线 93gao免费视频 绫波世娜磁力迅雷链接 老婆被 后入 91 KTDS-681 在线播放 ipx-072播放 电影我被人强奸 伦理片冫 日本女人,淫荡视频 干b乱视频 女同a片 9l国产自拍 吉吉影音冲田杏梨 乳胶xo影院 国内夫妻自拍tu视频 俺去啦在线不要播放器 橘佑金短视频 在线亚洲 欧美综合网 可以看的手机小视频 AV福利人妖 爱爱黄业视频 足交丝控漫画 海贼王黄版视频在线观看 2222老司机福利 女人与马干 thunder 日本三级,韩国三级,香港三级黄色视频在线观看色就是色 黄色丝袜小视频 美女主播仙桃福利视频ck kan3p cn在线电影 在线内射 mp4 后λ视频 国产精品在线视频Chinese 被大阴茎插哭的经历 偷拍 自偷 亚洲 在线 678dvd yy4408 伦理电影 牛牛视频露脸 黑人碰碰视频在线观看 1234色视频 韩国美女ⅴiρ神马视频 日本高清做爱无码视频网站 黑丝白肉我珍藏的av女优 春暖花开性吧有你亚洲无码 骑兵射福利一本道电影 无码嘿嘿嘿种子 波多野结衣末剪版在线观看 操呦呦777 仓多真央电影在线 国产自拍视频 yunfile 韩国最新网红主播福利视频大秀在线 国产在线偷录叫床 国产足j在线观看 韩国女主播福利导航 国模嘉妮大尺度视频 淫荡网欧美性交 免费性感a片野视频 熟母乱伦在线 pppd424在线播放午夜剧场 0 d恋老视频 SM 自拍 免费下载 747看看福利午夜影院 qingqingcaohaodiaosi 5566夜色在线 吐痰推荐,国外收费作品高品质CG动画51V整合1 四虎影院wap 1做爱 日本 中国人 小老汉在线视频 182tv-人人草-大香蕉-av在线 欧美激情日本视频 极品H片 我爱你AV52 亚卅无码最大视频 午夜影院费试看一分钟 84papa av网站800东方在线 日本三级香港三级成人网自拍在线观看 哪可以看工口 种子番号全集 ftp 村上丽奈番号 天天操天天玩 创造女生脱裤子洗澡 灰灰福利dianshioing 伦理图片二本道 国产自拍在线网页 在线 熟 激情邪恶大香蕉 九洲做爱视频 伊人久久五十路 一次肯德基哄骗邻家 十大暴力番号 第一福利成人在线 裸体女人的福利 伦理片天天射 美女被调教视频网址 乱伦交配视频 美国十次人与兽 美女91影院下载 乱伦片 下载 乱交在线视频 琪琪影院 黄页网站大全免费视频酥酥影院 全国最大成人网4438x9 青青在线自拍频vip 极品女神级网红美女可爱小胖丁和长屌土豪酒店约炮 白皙皮肤 经典欧美推荐第一页 吉迟明步1313 姐弟亲嘴啪啪啪视频 精子窝最新永久视频 青娱乐首页 耄耋视频亚洲 伦理巨乳速发福利 4438x是啊 伦理电影在线观看自慰 曰本lAV视频 yuojizz中国熟女 紫藤·伊莉娜h动画 偷拍广东情侣野战视频 大香蕉520 去便利店的途中在车内发情的妹妹 国产重口在线 不橹三二一 琪琪在线va 日本性交真灬 奇米第四春影视盒 百合情韵在线观看 唐山葬本子 动漫里番在线 se0107com 午夜伦天堂理影院 水滴摄像头偷拍 青虹资源搜索网站 双性人妖系列在线 mc小仙儿喊麦mp3 zzaa1 海瑟格拉汉姆大尺度电影 javhdvideo15,18岁 深喉 视频 @ simulant 黑人插pp 24p动态视频 黄瓜视频网站在线播放 女主播赫本磁力 好看的欧美无码中文字幕 护士被羞辱调教 一级黄片XxXx 桃园怜奈磁力 人 妻 少妇 很恨鲁在线视频播放 日本老熟妇性欲 wankz小黄鸭 国产自拍 黑丝诱惑 欧美性爱免播放器在线播放 后入 夫妻 自拍 视频 夫妻一级黄色录像片子 亚洲无码自拍 成人两性拍拍红番阁 四虎女友 皮皮虾无码 肛虐泥鳅在线看 邪恶里番漫画 四虎伦理手机在线 仔仔网 九州 国产自拍 av 动漫番号种子 韩国女主播迅雷磁力链 特殊视频百度云资源 ooxxoum 国产自拍偷拍操逼视频 女同偷拍自拍 秘密网av 石原莉奈电影院痴汉 26uuu小说 magnet 猫咪热播喷奶视频 婷婷丁香色 东京热哥av 女主播BT 在线成人av影院 视频 女神思瑞在线播放p 我与憧憬的太太中文字幕 mm无码 扣逼免费视频 亚洲一本道免费观看看 艾薇儿口爆百度云盘 wwwtoutouyaocom 韩色漫app 国外操逼磁力链接 下载 免费GAY片在线播放 男生福利影剧院 好逼免费电影 国内丝足熟女视频 内裤哥郭静在线 动漫XXOO视频在线观看 澳门自拍偷拍视频 丝袜伦理中文版 蛋蛋剧场骑士影院 涉谷果步sdde 绝色毛片无遮挡 无码性爱视频播放器 91超频碰人人在线 午夜视频是看体验区30区 伦理片 在线听书 午夜玩bb视频 国产 日韩 中文 自拍 8x在线成人 在线视频 手机视频在线日本 宅男啪啪福利 汤姆影院 avtom_四虎_四虎影库 欧美三级电影 甜蜜的乐团 AV超级搜索 猫咪maomi永久发布 日本X××oo 921影院 av隔壁老王每日更新在线 窝窝炮 西瓜影音 www99bb9com 福利前线影院 三上悠亚xz 插萝莉影院 1315影院 久久口交插萝莉影院 神父AⅤ动漫在线观看 wwwdd324con 亚洲风情 国内自拍 日韩 208午夜福利手机在线 欧美畜生伦理 wwwsavk18com 西西里高清模特艺术图 有声huangse小说 哥迅雷 女人操逼打炮 兰桂坊黄色电影 三邦车视网图片 小姨子的丝情袜意3p 妈妈跟狗搞 狂干黑丝足交美少妇 天天操欧美图片 日本黄片用避孕套 幼女小说集 日本乱伦狠狠插图 luxiaorenchaobi2008 樱井夕树无码 插得好爽在线小说 性爱女子会所小说 漂亮美眉床战色图 八匹狼娱乐社区成人 三级片神马影院 WWW_49979_COM 同性挤奶 亚洲人人体艺术大胆照片生殖器官 WWW_8090YYYY_COM 张篠雨人体艺术大胆照 女色幼rmvb 欧美老女人性爱电影 免费的皇瑟图片 幸富配电子书 赣榆淫妻 就去caobi 1314seqingwang 极品白富美爆操15p 亚洲成人影音先锋 很狠爽欧美 撸撸鸡巴射屄了 我要看明星淫伦的图片 自拍在线网 欧美av人体图片 看裸体漏阴道 飘花电影网乱伦小说 成人艺术色天空 撕开女友丝袜做爱 15岁少女撸撸色 西西人体粉色 japan sex woman 亿性家成人综合社区 少妇与老头黄色小说 誉田まみvideo 日本人体赛车大奖赛 骚女无毛逼 小b插的流水了 有哪些欧美同人成人版电影 骚妹影院删除 张瑞草书写法 性爱动态图片15p 姥姥撸一撸姥姥网 次原佳奈美图片 ooxx的日本动画片 父母性生活论坛 偷拍偷窥少妇内衣 裸体美女艺犬 奶妈肉穴 陈冠希功夫影音先锋视频 quanjialuanlun 欧美美女人体艺术动态 美女全裸图片百度 无码时间停止器 李宗瑞哪里又看 刺激抽插爱爱 色亲资源网 成人妹妹 视频 苍井空 时间停止 色老爹小说 小泉彩人体摄影 大骚哥 小色弟在线电影 女儿的嫩穴qvod 人体艺术图片topai 不要播放器鸡吧操进屄 张柏芝舒淇露大屄图 少女美鲍人体写真 av女优超市 淫荡的性爱图片 sex8ccpoweroriginalwestern 狠狠射操逼视频 rosi99 苹果手机迅雷云看片网站你懂的 日本美眉尻骚 16yeye 深圳合租挽妻 鸡巴插逼视频快播 穿越之淫乱小太监 强奸a片艳照 俄罗斯明星人体艺术 成人片a片区内 女人bb图片 五月天第一会所 日本超大胆人体艺术组图 18日本美女张开腿图 亚洲色图 偷拍自拍 我和小姨 20美女嫩穴 日本拳交迅雷 胖妹子人体艺术 真实做爱的快播伦理电影 蝌蚪窝一个释放 另类视频成人激情网址 lunxiaosou 狠狠插电影 苍井空拍过哪些电影 清水凉子summer 超大奶裸体人体图片 俄罗斯乱伦熟女 欧美鸡巴操阴道 吃了春药的女人会有什么反应图片 超大胆裸体黄色图片 日本快伦播电影 厕拍 博客 极度兽性未删减 先锋影院日本模特 美女的乳头人体艺术 陈静仪乳头很大吗 影音先锋韩国偷拍电影 乱伦故事狠狠碰 操妈妈屁眼快播下载 13岁美少女人体艺术图片 波多野结衣被射精图 激情偷拍自拍影音先锋 大鸡巴插入少妇小穴最性感 生命的力量全套照片 找个色阿姨 母子群交乱伦 第1集 幼乳图片 大色哥小色妹淫色网 搜狗裸体女人 夏娃露三点 张柏芝美屄 和美少女做爱 超大美乳妊妇 什么yiemeichuangyifudemeinvtupian chuangshangsheqing 小妹的屄好浪 我给小妞抠屄 淫荡骚姨 弟与妹性交弟阴筋长粗妹更舒服吧 我爱人妖色色 mm五月天影视 仓井空55伦理 男女明星亲吻做爱的电影有哪些 欧美大逼片 粉木耳 两穴 很黄很色好想撸 黄色小说乱伦姐姐 qvod校园偷拍 WWW_CHESSOURGAME_COM 激情狂干风骚高老师 被男老师拍照奸的漫画 欲妇小说 www46xxxcn 绘狗大奶子人体 毛毛片性爱做爱视频 WWW_AVXQL_COM 徐静波 魔兽世界335 十八和谐最新地址 姚双喜 孩子脾气暴躁怎么办 潘益兵新浪博客 阴毛摄影 激情爱爱色成人综合网站 妈妈的逼逼就是给儿子操的 丝足美腿性爱 欧美艺术性先锋影音 腿攥 女人的阴毛都是什么样子 女儿摸爸爸jj摸乳头 WWW_PSW_COM 黑人轮奸故事小说 WWW_258SAO_COM WWW_TSOHU_COMURLJS 日本深夜成人节目下载 崛北真希无码图 0099aaaa 三十七度二极品人体艺妓 天天花逼网 mp4xxoo 给我视频舔逼 夜夜撸美女色图亚洲色图 日本幼幼照片 日本艺术照 看3d动画a片的网站 mmm摄影图片东莞纪实 超级乱伦qvod 爆操少妇内逼网 bdcda061000018b3 操小姨骚穴图 裸体黄色性交片 baihumantoubicao 日本老师av华为网盘 益ど缜? 淫虫操动漫美女 乱伦伦理成人电影在线观看 黄蓉肉棒音影先锋 亚洲少妇门 大奶熟穴 WWW_KKAAA_NET 小说大奶老婆阿云 春药强奸大肉棒插骚穴 18avady 东京热一起撸图片 人体穴位高清大图 美女的丝袜小穴 张柏芝快播图片下载 美女被鬼搞穴 久操b网新闻 京子20歳sm身体改造肛门拳交 成认小说乱伦 狼客导航 我的可爱女友黄色 中国大大奶老太婆 欧美sese老肥熟 色kanav 一丝不挂美女做爱动太 骚姨妈成人网 成人图欧 偷情操逼图 人体艺体虎穴 ed2k艳照门陈冠希 乡村m女草逼小说 操少妇的屁眼 天天干狠狠干 乡下老夫妻扫墓坟前做爱高清偷拍 avhbocom yazhouwuwuma 万全影院在线观看1一 迅雪极品图洁 操欧美少女逼 中学屄吧 岳母乱伦电影 肥佬影音怎么看黄 92jiba 48岁人妻自拍 人与动物交网 欧美美女人体偷拍 小明看看主页永久播放 蜡笔小新1 花裙人体模特写真 强奸孕妇系列先锋播放 日韩美女黄色图片 人与动物xxxx 操逼电影种子 和波多野结衣一起演过口交的 江湖yin娘txt第二部分 男女办公室激战 自拍操六十老女人屁眼 少妇的裸体照片 爸爸插错洞吉吉 人与驴bt 五月色任 我我我xex8 幼女专区 wwshe3com 把鸡巴插入女生屁眼里的动态图片 鲁大妈黄色做爱网站 90后粉嫩馒头b 阴毛留长了好吗小说 萌芭下马 WWWPLXSWCN 操我干我种子 26uuu色酷色 所属分类日韩 幼女阴体 宾馆偷拍p 无码av电影影音下载 伦理片艺术片菅野亚梨沙 小牡蛎13部ed2k 丰乳嫩穴 成人人体色色图 女人阴口是屁股眼吗 无广告的人体艺术 女同成人狠狠插 色尼姑久久草视频 WWW53AVCOM 欧美快播性爱 少女被干影片 一夲道京东热全部电影 PRoN3oo 哥哥插我大鸡吧亚洲色图 土逼成人短视频人与狗激情 在线母女性交 会动的幼幼动漫爱爱图 骚穴内射骚逼 一色百毛片 五月慢菜种植 超大胆艺术摄影 一级全黄色片 少妇添阴自拍偷拍 韩国色人体艺网 成人毛片图 ddd42色妞妞基地 肏骚屄莲莲 yyrt5yy 日本性感美女阴部性交 bbse5在线观看 曰韩美女解禁大图 日本美女1234图片 WWW378PAPACOM 爆操大奶少妇 日本十二岁少女阴部裸体艺术图片 色吧图片快播你懂的 西川结衣百度影音 欧美性脚足交视频 夜夜撸小萝莉露逼高清图 插你妹影音先锋 www1122aqcom 淫色舅妈 亚洲欧美动漫日韩国产 艳照门无码高清照片 乱伦爱情看电影吧影音先锋 亚洲色图老女人13p图片 妹妹冈 色图操bb强奸 超成人免费视频在线 鲁大妈色播网色网 欧美人体巨乳大尺度艺术 艳鬼还魂被奸图片 日逼做爱干逼摸咪咪视频 aika黄图 亚洲学生妺大战西洋枪 赤裸羔羊接吻 群交肛交老婆屁眼故事 天天啪啪久久嫂子 干的护士嗷嗷叫50p15p 中国爱城bt 女尊男子白虎 被医生舔的好爽 bt撸撸色 啊不要舔那里不要吸有声小说 freevideocum 成人天堂av2017www9966acomnv325com 阴道检查H视频 白白色白白撸 成人在线超碰资源网 亚洲欧美丝袜自拍变态 567pp男人最爱上的网 兰州美女买阴qq号是多少 乱伦高潮大叫生殖器特大 操逼在线赌博视频 自拍偷伯乱伦小说 女淫欲网 直线与圆的方程试题 qyuletv青娱乐在线 caopotn尿尿 拷问凌辱潮吹 国内自拍mmagnet 西协美智子人体 百度热javhd 丝袜脚意淫 绿色无毒的av电影网址 激情综合网激情五月肉棒 ppt播放avi黑屏 韩国美女自拍偷拍做爱图片 群撸网magnet 欧美精品有声精品 额我也去撸苍井空 淫嫂乱伦 制服盒子 乱伦小说网址导航 明星宅男 百青青草 另类女同群交小说 色色激情开心无码影音 欧美美女图片网 美女乱伦wwwtb181com 浪妈妈电影院 动漫AV中文字幕迅雷下载链接 亚洲日日干哥哥日日妹妹 老婆和小伙干小说 超碰97人妻办公室 雪白的古典武侠 农村老头做爱视频自拍 校员春色搜狗 性暴力俱乐部 亚洲成人图片偷拍图片小说 欧美seut 情人偷拍第一页 老汉推车g8 猛插淫女骚穴 肥姥姥性交 粉嫩pao 免费大香蕉狼人干伊人久草AV网址 丝袜自拍露脸套图 狼客库 小男孩与塾女乱伦系列小说 色taotu qingjunlu3最新网 亚洲成人网站做爱小视频 成人网站狠狠撸 busx2晓晓 母子乱伦竞赛 骚女孩的禁照 公公大鸡巴太大了视频 撸撸鸡巴kk569com 南国成人网 偷拍裙底玉足 好大的奶好爽妇人 北京ktv抱起小姐狠狠操 青青草wwwxxb29com 绝色美人妖魅力百度 俄罗斯情侣系列 草草飞飞爆菊 久久女同小说 长发高中妹子宿舍自拍 荡妻快乐得公用洞 结婚偷拍10p 妞干母 成人激活网 女人力三级片 最大胆的美女生殖器人体艺术摄影 美国chengrenpian视频 激情网怡春园 a片长图搜一下 avtt一字马 WWW_K_6X9X_COM 电影一苍井空一 美岛玲子 人逼被狗插 潘号 色图偷拍白富美 yese321com 家庭乱伦之人妻 ccc36最新偷偷撸影院 嫂子在厨房 115礼包码变态秦兽交 伊人在线小泽玛利亚 WWW_KKBOSE_COM 图纸上井道是怎么表示的 五月天母子乱伦网 影音先锋最多人性交 � 我要操成人电影 色科蚪 一路向西欧美伦理电影 欧美a片家族乱伦下载 强奸岳母wwwwwww85com 爸爸在隔壁9 小白黄片 熟女多汁20p色中阁 霜姐 m625成人影院 龙腾视频网 波多野结衣裸体人体艺术 wwwshafoucom 亚洲综合图自拍欧美 黑人幼女肛交 写真视频网站免费 人狗红色录像一级带大片 有这骚逼长腿女友操了她 人体室 wwe51yycom 大帝av视频娜娜操总动员 阴布图片大全 xplay在线播放 绝美少女玩内射 wwwgegeganne 夫妻乱伦性爱 皮裤美女10p 色久久色琪琪第四色www978aaacom goo电影777 色狼窝wwwqqqq64com wwwpz599cpm 色小结 纵犬潜伏下载magnet 萌妹国产在线 艳遇传说 av成人在线视频在线超碰网 找黄色激情小说 wwwsihu184com xxootv 偷拍影音先锋电影网 老婆和小姨子们在广场上及野外肏屄 高中女生美鲍 免费大鸡巴猛插美女淫穴视频 艳照门女主角 美色www色mwin4000com 春色网激情区 www535ddcom 日本自慰游戏网 分享翘臀老婆贴吧 自拍在线视频第一页 淫妻色图网站 超碰国产偷拍视频 色妹子综合 常用的黄片 熟女炮友自拍在线视频 搜索www妈妈与儿子乱伦大杂烩 操少妇1024在线视频 动画妹影院 日本无码片百度 家庭黄色一级网 插死我吧啊啊啊好爽 淫色美女图 先锋在线成人片 国外网友偷拍自拍 婷婷中文字幕高清 www110com 被窝福利合集250集 哥哥干公公的奸淫 母子乱伦3d动画 WWW19MMCOM 类似达酷的网站 正在播放露脸熟女后入式最后直接给口爆第11370集偷拍盗摄在线视频五月色 工口成人 [欧美]国产情景剧风骚美女不穿内裤路遇色魔跟踪迷昏后捆绑 资源铯站mv950点cc 美腿丝袜32p 伦理图片亚洲 色狗电影 bbee9966com 怡红院免费视频 以前的66波波网址是 哥去射天天翘 插吧插吧视频在线播放 色和尚亚洲妹 开心鬼黄色片 大爷操影院色色影院撸撸影院宅男影院下载 动漫鬼作 媚药bl 蝌蚪窝AⅤ 亚洲乳头 成人淫荡图 图霸人体艺术模特 老师喜欢玻璃瓶做爱 第四色春色在线电影 亚洲撸撸magnet 大屁股岳母 全聚色 wwwxxoo2com 台湾AV日本 wwwssss47 家庭伦理伦乱 231avav 热片网乱伦小说 wwwnntt999com 影音先锋夜色资源网 激情小说 亚洲色图 欧美 裸体姿势艺术诱惑 脱光操井 东京天堂在线 撸一撸涩涩 44bbmm下载 八戒影院褐色影院成人电影影视 狠狠撸Av图片 极品美女深喉吞精视频观看 日韩av使劲撸撸出激情 白白色大香蕉狠狠插妹妹 成人古典乱伦小说 动漫av迅雷下载 成人摄影色图 日碰碰碰超 成人电影午夜A片 洛天依色图 下载免费的AV小电影 www99aahh 944rr 66美女人体 wwwpubb94com 护士操穴色图 A片39efcom 色一点的小说 母其弥雅小说 我狠狠操风骚丝袜嫂子 无极影院美腿丝袜 韩国电影vip 幼男幼女黄色视频网站 15p熟妇 wwwddd20com 乱伦落红视频 黄网国内 九九视频在线视频观看 cdcd22 色色的妹妹 成人动画理论片 表妹做爱大全 漂亮美眉被肛交 七夕夜在ktv把爆乳女神蝌蚪窝 撸撸管长篇连载 色爱区mp4 五色网 自拍熟女另类亚洲欧美 女将av 虐阴100种 肥逼大妈 影视软件论坛 东方AV在线狠狠撸亚州无码 AV影音先锋影院 老师花核流水 校园春色sex8小说 韩国少妇AV影院 成人小说ftp 色三八点com 高清妹妹先抠逼再让我干 国外黄色视频网址 色福利加油站 操可以播放的站街老鸡视频 我是眼镜控迷奸 wwwcao664comlist42html 超碰成人在线免费高清巨乳视频 av美女天堂下载 影视操逼的人生 乱伦电影一页 人妻熟女自慰文 黄色的乱伦 勾魂欧美av高清影院 身材不错的女友家中诱惑自拍 熟女群p网s 我在厨房插了老师不详 色你妹眯眯 www sqwuyt com 川岛和津实视频 seseav 自拍学生白虎13 X666xx人与兽 淫淫淫涩 欣赏她浑圆的屁股 色色女主播magnet 91porn三级 日本骚妇丝袜视频 搞了两个90后mm 曰逼视频播放器 汇集全球熟女12p 青青草资源啦 淫荡妹妹性奴 激情乱伦校园人妻小说 夫妻在线AV 性与爱图片 欲望丝袜妹妹 啊啊啊好舒服图片 第一社区会所文学地址 色色av一本道加勒比 wwwsek0ngge2c0m 鬼片电影全集国语高清 成人激情图片,电影mmmnn7777 风流媳妇和壮公公 青青草美女自慰视频免费观看 东方Av偷 kkxkkx 黄色淫荡书 车上干骚逼 www268hhcom 我的美腿丝袜女儿 帅哥和保姆啪啪啪wwwshuaijiaocomvideo wwwjjj85 av电影www5yycom 美女久纱野水萌MP4 幼男幼女性爱演戏漫画 淫色淫香照片 美女基情四月 青青草露脸在线视频 啪啪啪全球免费社区 wuyue天婷婷 妞干网2015版www003hhhcom susu30cm 国产另类第二视频 亚洲色图狠狠撸夜夜撸 骚色综合www68ixcom 影音在线久久草 男同在线观看手机免费 天海丽白色吊带 国产视频日韩人兽 欧美性交影院自拍偷拍情人旅馆开房视频 日你色色色色色色色 超碰国产少妇在线 酒瓶门视频在线观看 三级片黄色父女乱伦 深空部落在线观看 第4涩涩 神雕侠侣伦理片 哪个网站可以观看苍井空电影 嗯啊不要嗯不要舔作者不详 四虎影视二级 黑丝袜视频床上秀 WWWSHUANGTVNET 影音先锋偷看媳妇中文 92电影看看 成人电影xox同性 看黄色三级片哦 哒哒哒哒哒嗯嗯嗯嗯嗯嗯 蕾丝边制服诱惑mp4 色无极主页影院跳转 岛国熟女撸撸色 911vv a片无限成人卡通 www892con下载 澳门美女直播间 xf0av2info 超碰吉林 亚洲欧美偷拍制服国产 西西人体美女鲍图片 swww222dzcom 在线访问升级中 黄鳝门ftp y亚洲超碰 丁香五月激情五月狠狠干 激情小说第四页 撸丝电影一区 欧美母子乱论 bbb笫bbb笫四 亚洲制服丝袜BT 冬月枫 欧美幼teenmoⅴies兽交 姐夫我要你的大鸡巴啊嗯嗯嗯嗯啊 开心狠撸五月 鸡鸡爱逼逼av淘宝视频 在线播放成人网 强奸漂亮的人妻magnet ss111亚洲 250pp6wpin 成人A节爽片视频 色俺去 和妈妈一起乱伦九城社区 同志带颜色的漫画网址 WWWASIA4 人妻 韩国av qvod 狠撸15p qingse 肥佬影音 摸乃图片 我与母亲电影无删减版 重温阿娇艳照门无码 军事网 国模菲菲大胆人体艺术 mianfeichengrenshipin 苍井空全集云播 欧洲美女黑丝 ipad去哪网站看色图 绘狗美女主播 处女中出 广濑玲什么时候开始拍av 你有b吗大片网站 长沙天气苍井空口交 婷婷炸天鲁 偷拍明星做爱视屏 cluanlun 兽兽门色图 屄水湿屄毛 嫂子和我看毛片 ryidongwuxiengjiaoshipien 为什么人体艺术模特的阴部都是黑的 欧美金发骚女情趣内衣人体 可爱美女人体艺术 张婉婉做爱白浆都操出来了 90性交视频 日本人体合成艺术 自慰屄 视频色哥哥 新一本道qovd 插妈妈逼婷婷五月天黄色网站 色黄朝 人娇黄色小说 操b 13 p 色五月图库 911sssus主站 2007日本人妖视频 素云佳柔 日本骚女舞 和大姨子日逼之续 网抱妹av 色中色成人av社区 淫荡猫女 幼女激情做爱 wohewodefengsaoxiaoyima 影音乱轮 春暧花开性吧有你 亚洲有码 臀部上放酒瓶的女人是谁 xxx美女逼毛图 义母电影一区 拳交屄屄 第一人体艺术图 好国美女主播系列之苹果 内射护士10p 黑人操逼偷拍自拍 胖女人maopian 午夜色撸撸 ww 5252se 黑白大战15p百度 eluosiqingse 宝莲寺淫僧 人妻乱伦强奸图片 柳州艳照门12部 快播欧洲重口味 嫂子浪叫 成人无码图 动1动少妇 人本艺术图片p01040100 激情小说草裙未满18禁区 偷情主妇 苍井空美女太太 男女激情做爱的高清照片 韩国丝袜美女在家和男友大胆露穴美腿口活自拍视频 强奸人的动态图 吉吉11ff xanggangxiezigongdianyingang 丰满女人求职被我给操了 成熟女人裸体正面照片 男人可以操母狗吗 残酷美吉田月 台湾av色站 大胆西西露阴艺术 26uuu女主播朴妮唛 自拍熟女自慰 日本成人乱伦网站 国产操逼片 姐姐在家做爱自拍 筱田优无码 插入16岁美少女花径 韩国第一美女 影音先锋能用的码你懂的 WWW_SE65_COM 人体牲生活片 模特强奸电影 苍井空电影gif出处 陈佳丽大但照片 韩国情欲电影大全 美女爱爱日 哈起码萝莉幼女片 hhhhhhdpornfree 毕夏漏点 溜冰骚女 faya美女性交18p 色 逼 搔 射 最年轻漂亮苗条的大学女生骗了老板钱被老板吧小穴和人给折磨了的完整版图片 姐姐的阴蒂被我舔硬了 百度影音能打开的黄网 为什么男朋友做爱时喜欢把我插哭 哥哥干动漫图片 色姐姐姐影院 五月 性美女操 最人体大胆女艺术 人体艺术huahuagongzidaohangchengrenwang 干逼520 张筱雨做爱图片 a片合集迅雷合集 马六姐人体艺术 精品少妇被老外硬刺无码吞精 qvod 日本骚女诱惑裸体 妻子推油 草裙女大胆美女迅雷 缺金的男孩名字大全 明星织发 疾病查询 军魂 3322kk 河北省教师资格证网 毒战百度影音 黄粲扒皮 理疗有副作用吗 37tp人体艺术果果6655人体艺术开心色播色尼玛 厕所针孔偷拍屄屄尿尿 女人淫乱图 性交插b淫图 诱色天使是传销吗 www555focom 顶级电影 都有那些人体艺术网站 爱人体高清大胆裸体照 色救救综合网 av内射电影 俄罗斯色图16p 快播电影小孩操大人 汤芳2007后花园 骚屁股骚逼逼 欧美人妖射精视频搜狐视频 av免费图片免费视频 WWW388AACOM 福利搬运工6080青涩 av女美国奶子 大黑鸡巴操韩国美女 欧美女星艺术图片 东北熟女骚 性爱狠撸撸小说 www韩国骚妇 WWW991ASZYCOM 新盖影院 与姐乱伦 五月天我一晚上干了个 谷门吹 怡红院 怡春院美国分院 WWWSANFUCOM 大奶大鸡鸡的美女 婷婷大色窝深爱五月 忠义乾坤之爱子情深40 国产自拍图片区国产区小说区 亚洲色国47 黄色小说激情小说成人小说网 主人性爱竹 波多野结衣av作品图蜜桃网 杜箐箐大胆人体艺体图片 撸熟女骚 插的好狠好舒服 林柏欣性交片 插黑丝骚b 亚洲色网av天堂 性感写真视频下载 女子学校返回途中乱搞6p淫乱大派对02 9iisesese 爽歪歪电影宗合 qingchunmeinvpeike 六月天婷婷 可以用大肥佬看的色网站 操屁眼小说大全 在线视频录像 男人鸡巴艹 rentiluozhao 28揷屄 liuyan裸身图 丁香网站五一婷婷 幽人谷乱伦网 中山市色色婚纱摄影 性裸体舞蹈 美女大白奶子 光棍电影影院yy俄罗斯年青母亲 贵阳哪家药店可以买到万艾可 欧美性交片视频大全 阳具冰棒 小小淫女 干爸爸大鸡吧好棒 99smav 象数疗法 学妹开苞疼哭视频观看 杉田瞳i~淫若妻妊妇 苍井空百度影音人与动物 mp3性交故事在线播放 妇人呢屄图 成人免费m看片12 wwwav189com 美女小穴19p 很多男人都操过我的骚屄 ww爱色com 逼你干网 色东东电影网 永作由美作品下载 幼幼性爱美图 天海翼人体艺术图片 美脚ol穿上黑丝连裤袜从后面插入妃悠爱大槻 凌波芹天使注射快播 姐夫和小姨子激情视频 天天打飞机色色网 我奸淫了女同事 开心色播手机图片 手机yy哥歌网 舔舔美人足 草君社 看人体大白逼成人网 影音先锋姊姊 涩色涩香 风野舞子写真视频图 开心宝贝色播网 WWW82JGCOM 三级片玉女心经 回族女人毛阴15p 白嫩美女做爱全图片 有免费的操逼视频吗 五月色播博 快射电影 大奶淫秽图片 淫水诱惑26p 那夜插进妹妹的蜜穴 撸哥哥老女人逼 avdiguocom日本骑兵 陈冠希艳昭门图 图图bt资源库 自慰国语三级欧美 五月先锋媳妇 五月天淫荡图片 黄鳝自慰在线15p 久久久久日韩xxx 成人影片人人插人人搞 金发碧眼巨乳萝莉 吉泽明步绿色x站 有没有幼女系列 仲平一家的乱伦生活 wwwhuangsecome 陈冠希艳照门先锋下载 变态儿子强奸乱伦图 xiaogeshizonghe av手机av亚洲天堂妹妹网 大叔操幼女小说 刘嘉玲人体艺术大胆写真 亚洲援交 裸体做爱激情床戏 脱衣女奴 91pron自拍福利网 荒野嗯啊 校园色农夫 尤成人版电影下载 小女孩榨干 插姐姐奶 自拍bibi 日本另类a片 美女特工强奸小说 操妹妹天天操?1?7?1?7)天撸色妹妹 色惰快乐影院48gaocom 日本厕所偷拍总集 2929tvtvcom2929tvtvcom 骚逼色综合 假阳具扩肛自慰在线视频 千乃杏美先锋 花花公子人休艺术成人导航网 女人挨操流精图片 av黄鳝自慰小说 最新巨乳淫妻magnet miaomiav怎么进网站了 米奇影影 丰满白嫩的日本女优 阿姨的性爱漫画小说 老师2016中文在线观看wwwkan99net 性爱录像片 无敌综合色 成人动漫亚洲色图意淫强奸亚洲色图意淫强奸 做爱高潮叫床视频 黑鬼片 亚洲色图av亚洲美色图 中国处女宝鉴 后入菊花 欧美咪下载 台湾成人论坛网站 苏联群交 孙子操奶奶的小说 国内偷拍自拍调教女奴 国外黄网在线免费成人电影 波霸暴露 a片黄色片wwwavtallcom 暴肏大骚屄 逍遥社区欧美日韩 白灵人体马六人体 jzbuwsyapopcn 结婚淫荡图片 欧美缴情av影视mpppp19com a4y艳舞 www867bbconm 新标签页最大黄色网站 日本aV女优天天堂网 不用播放器的性爱网站 包射网哪里去了 徐娘露脸图 操逼性交被人操了小说 肌肉女做爱英文 自拍成人视频在线播放myiwancom 欧美老逼乱伦性爱图片 亚洲日韩黄色成人电影 81xacom韩国料理 性侵人妻小说 插了一个不该插的人 老婆的妹妹 成人有色小说 春色性吧 春色都市 春色满人间 春色书目 雪肌肤解禁樱井莉亚 樱井莉亚作品列表 樱井莉亚作品美誉 樱井莉亚床戏 樱井莉亚四部合集 小泽玛利亚09年 能用快播的h网 能搜索的h网 开心五月天 深爱 东京热色人 成人色天 酒色网 欧美黄色小说 黄色小说区 黄色小说图片电影 哪有黄色小说 桥本凉 あやみ旬果 花花电影 色姐导航 大色姐导航 搞处女电影 强奸幼稚园 日B成人网 艳门照全集 日本变态图吧 寻找一夜激情 淫荡小妹电影 做爱技巧视频 高速无需播放器 欲望之城成人社区 桃色 皇兄个个狠狂野 狠狠爽 我要干 京骚戏画 涩涩爱性 江苏卫视在线直播网 猫咪av大香蕉网 超碰978 暴乳790 韩国av先锋 人人私信 怡人网av东京热 超蓬免费上传国产视频 欧美三级大胸保姆 日韩AV大香蕉 哪里能找到4438x liusiji最新 ipz041 91福利社动 大香焦久草是易视 亚洲AV外卖 市来美保教师在线观看 男人爱爱天堂av 宫地蓝视频在线观看 醉地va 91dizhcOm xoxo欧洲 mp4 皇家Lu23 90社区福利视频 ggg373 神玛影院理伦片 后入pp 极品唯美女同视频 33333男人天堂 色播屋99 易通电影院 鸭子给富婆舔逼 舔的逼水直流清晰可见 青鱼视频自拍在线视频 人狗资源福利在线 小莹姐吃奶之汁口述全过程 邪恶gif老湿影院 全裸美女直播 - 百度 小孩日大人视频 mp4 日本乳汁私密视频 在线内射大奶小穴 在线 无码 国产自拍 丝袜 中文字幕 在线拍sss 右上角ffyybb是什么番号 日本人性交视频 91小哥佩奇在线观看 wsnmm 免费 在线 云播 欢爱 在线ab 雪本芽依 大香蕉强奸 视频偷拍自拍在线 ai福利电影 微熟女在线关看 国外性交网站 老司机网址导航 正在播放julia 香椎梨亚在线视频 国产酒店床上av 威廉王子av 2018潮喷喷水av直播视频 585看片 J\香五月 神纳花作品在线播放 bree xart 在线 haoav008 水嶋あずみ白丝 taosege 野狼aⅴ导航 骚女A片式看 在线偷怕人家 1亚欧成人小视频 哪里有不用下载的AV视频 抽插视频完整版 rhj223 中国理论电影强奸视频 l 高清美女视频欧美高 耽美粗大侵犯骑木马 狠狠干在线视频 日本少妇8p 公媳止痒 福利视频伊一 噢门国际赌场小视频 全裸美女秀磁力链接 lu7700com 福利网站懂的2018 下载大鸡巴视频资源在线播放 三级鲁鲁片 DOCP030C 亚洲女优无码影音 超熟素人在线 超碰视频123zzz b里香视频在线2白色爽 美巨乳女子校生懲姦孕汁江藤つかさ 基腐动漫性爱 女主播紫薇喷水 乳视频在线播放 永利国际福利在线 意大利啪啪啪视频 WDD-002 magnet xt urn btih cbinese home made video 有关致母亲的AV无码 白嫩36C巨乳情人扭腰摇摆 青青草做爱视频网站 动画片操逼小视频 福利视频弟150集黄可 aul player 先锋影音福利在线 波波视频性多多 成人操逼视频97 午夜高清偷拍 爱爱视频教程未 漂亮女友的胸做爱自拍 xxx日本免费在线视频 家庭乱论小说第66部分阅读 卵蛋网MIDE 国产自拍磁力合计 大相蕉伊本道 剧情版经典无码 赌博视频a 素人约啪系列在线观看 口交吃奶揉奶视频 好屌操三八 1wan8不正经的一群人在线视频做爱 李保田何晴激情视频 国产自拍性爱视频在线播放 麻生希-东京热 - 百度 sm啪啪啪视频在线观看 亚洲av做爰 污亚洲 萝莉自慰跳蛋故事 av川村真矢在线影片 先锋影视AV明步 亚洲VS天堂 好屌妞精品偷拍视频 av中文字幕在线看手机 364hu 天天骑天天干 av 在线手机电影天堂 av手机日韩在线 明日花绮罗男人装 caopren在线 美女妇科全面检查 CD1,内窥镜看子宫深处,假鸡鸡量阴道到底多深,牛逼啊 香澄遥美人教师在线播放 电影港福利 美国日本A片黄色视频 1茉莉metch 裸体avav 性爱啪啪影院 去拍摄视频在线观看 凸起乳头的诱惑 在线 狂肏空姐小说 55segui 唐朝av免费观看 760pao xfyy卡通动漫 免费h视频的app 草莓tv影院在线安装试爱 小清新影院变态seqin 乱理永家,庭大片 超碰caoporn任你操 色优优资源网 法国Av 中文字幕人妻出轨av番号 旺旺影院色 传统在线视频cao12 881vz 巨乳视频天狼影院 伦理片4438 下众之爱 ftp WWW色姐姐 万全伦理k2014 亚洲天啪 草民影院偷拍自拍无码 影音先锋371无码影院 老司机综合网大全 鲁鲁狠狠在线影院 1004色导航 东方 av 在线 XXⅩhd性亚洲 成人自拍视频福利 福利美女视频 东方亚洲av 大陆 自拍 偷拍 国产 动漫骚逼视频 大香蕉青青免费视频 赤井美月伦理电影 福利影院APP 大香蕉伊在线一本线d 戴眼罩口交猜阳具 大神夜店大山极品美女带回高级寓所阳台一直 二重生活无码 福利裸体黄色片 夫妻做爱一级录像片 性姿势高清视频 有賀遊空 国产阿姨在线自拍 美女把最大的跳蛋放进菊花里视频 午夜福利在线资源站 91prorn业余 谷露另类四虎影视 日本性爱美女 好看的华人自拍隔壁老王 萝莉学生操哭 f8国货自拍 淫色天王 东方成人正确网站 猫咪av大香蕉网站 日本娇喘 rctd 045 chloe vevrier怀孕 天堂info 平平草在线 av ,np 高h 18岁 禁止 五月色伊人综合色 vr在线播放免费人成 2018国产援交 magnet 老施影院视费x看 毛片其地 毛片播放 青楼社区黄色视频免费的不用洗内容 日本三级有码视频 91国产伦理片 自拍照片磁力 肉棒插进美女阴道资源 日本v很色视频 神马影院三级片 magnet 舔丝袜国产剧情视频在线播放 rq在线视频 yy4480wwwsss 自拍 偷拍 另类 变态 fetiahkorea md487 wwwf994 日本黄片10000部大蕉 性感美女全裸体视频 国产白领,迅雷 magnet 寂寞厂妹李伟 张倩倩 wwwbbb811ang 52我爱干免费看 1177韩漫免费官网 大积焦伊人视频135在线 5566df 4438x全国成长 日b视频过程狠狠色哥网站 琪琪韩国理论宅男电影 色偷偷资源共享 爱色影激情在线002 狠狠爱狠狠天天2017 pans福利 wm62con视频 手机激情影院 藏经阁成人 www502rr,com 内射刺激视频 免费在线观看aavv 26uuu 成人网站地址 国产自拍福利亚洲 福利深夜视频在线观看 金瓶梅视频链接 qaaahhhkk 伦理在线智源 日本小学女生光乳头视频 国产剧情精品小视频 xxxr日本 caoliu情侣自拍 2017日日爽天天干日日啪 激情成人免费视频 雷炳侠洗澡门完整版视频 日本AV操比视频 les网站h片 人人肉肉大战 凤凰av在线高清 丝袜激情在线 图片小说快播色色在线 汤姆AV影院在线 好吊妞视频人妻偷拍 白木优子番号 mp4 王者色 mp4 岛国爱情动作片卵蛋 青春网综合无码av 目本一本道波多野吉衣 jizzss av色天堂。五月 笑白小曼 magnet gav免费播放成人大片 你愿意让我操你吗 大胆二嫂和闺蜜3龙2凤5P大战真担心二嫂这单薄的身子骨受 久久青青草风吟鸟唱视频 nnuu22 bt欧美兹力连接 AV火山小黄人 情人自拍偷拍在线 黑鸡吧爆操白臼嫩嫩美女 先锋影音亚洲人妻制服乱伦资源 小视频啪啪来电话女的说他免费 新娘被艹黄色视频 小夫妻福利视频导航 小明同学和我妈妈后入 小清新影院午夜网站 性插成人理论 香i巷黄色片 性交福利91视频 迅雷eev 崩坏之人璃沙 芳露福利 高清无码视频大全 黄片在线韩国女主播福利直播视频 与0101电影网类似 日逼去在线视频 岛国少妇视频 狼窝成人视频 老溟影院 在线av短片 日本妞啪啪高清 古装福利电影院 k频道新网 美祢藤コウ在线 东方影库正确地址域名 美乳少妇动态视频 人人爱人人色 北川瞳 简介 做爱自拍偷拍27P 国产精品大片182cm车模女仆装娇艳欲滴粉木 av喝尿的片哪有 老师与学生三级视频 边打电话边给我口交,我抠她骚逼到潮 免费毛片tube sex cosplay不知火舞 吸奶子头操逼视频资源 WWW,57ppp,com 啪啪影院自拍偷拍 荡女报恩亚洲视频 神马电影自拍偷拍 天天碰视频免费视频老影院 乱伦小说专区 捆绑Sm magnet 日本人六九xxx视频 avXXX日本 ab俺去射 日韩美女网 在线刺激导航 久久影院-星魔网百度 abp561c 国产成人规频在线 2018欧美在线理论重口味 538PORCOm www,333zk 长泽雅美无码在线观看 1开心影院贝贝邪恶 色导航第四色 草莓午夜免费福利小电影 波多野结衣海边群交 草莓国产午夜视频色琪琪电影 韩国学生俊男靓女酒店骑马摇摆抽插 国内自拍直播网 被侵犯的母亲优优色影院 变态另类在线直播欧美 国产玩呦 操逼逼吃奶视频 苍井空A影线费观看百度 韩国AV 下载 强奸乱伦-第8页 色综合2 杉浦友集磁力 mp4 秘密搜查官qvod 苍老师 ftp 一本道 丝袜 天海翼 色悠悠久草 做爱性交视频福利 那种漫画小说你懂的 中文字幕rct-470在线 love大桥未久爱情电影 成人在线免m免费观看 se66 亚洲自拍 色综合 协和手机在线播放 成人aⅤ影视 成人动漫在线播放 QZ75 西瓜影音 sspd强奸系列 包臀 无码 成宫琉璃视频 ftp wuxiaorui rion视频区在线 成人福利网址 你懆操 番号onsk 高潮视频西瓜影音先锋 苍井空xun迅雷下载 20我想看脱光腚了看操逼操逼的女人 午夜福利插b剧场 8x8x视频福利 高清大尺度丝袜老师 www銆倆ih8 wwwaaa,678kblz 偷情丝袜 刘瑞琪空姐门 貂蝉肉棍棒小说 少妇抠逼图片24p下一页 深夜福利无码视频在线 女神 主播自慰 在线 黄-色性交免费视频播放 小牛棚视频导航 黄色做爱小影院 海贼王黄版视频在线观看 www,87bbee,com 大桥未久在线资源 rounailujibanannv 午夜人与兽性交福利在线7O 变态搞基网站 qiuxia手机影院同性恋 时间停止器在线观看吉吉影音 快播成人妻视频 网友自拍笫3页 台湾三级片视频 久草视频16 小早川怜子伦理 湿情影院 青青在线葡京视频 小骚娃 金瓶梅电影偷性全视频 和小女生车震自拍视频 破呙福利 国产丝袜高跟鞋无码下载 萝莉 无内 小视频 毕业生里番 艹爽啪啪啪视频 不知火舞和三个男儿公园全彩 藏花阁在线直播平台 厕所偷拍在线观看 不用下载就可以马上看超碰免费视频洗澡BB 国内自拍新世界的大门巨乳列传 国产自拍第四页 操大奶丁字裤美女做爱故事 国产自拍直播 被侵犯的女子校生不知世事的大小姐 裸体搞p视频 ttllcc 大鸡巴操b视频 少女哥哥我想看那个床震作文 大香蕉在线福利观看 超碰成人内射0视频 3agirls视频 外国乱乱网站 97超碰人妻在线视频 国产真实干妈影院 国产a片直播 赶尸艳谈在线播放 邪恶丝袜美女嗯嗯啊啊 亚洲日本大鸡巴视频 天天拍干天天射 闪电奇迹裸体 华裔女神电击视频在线观看 性交视频有哪些网站 成人快播伦理欧美图片 不一样的操淫逼视频 757h 自拍 最新 另类 nb544 1huang&#039;se动漫 正在播放爱泽花梨教室 好看的高清无码 宇都宫紫苑 红秀 青青草成人快播免费视频 大鸡巴逼逼逼片 欧美性爱大片黄 午夜影院码 保拉的诱感在线视频 好色妻降临视频在线 正在播放年轻的女邻居 蔡番号 烧熟女吧 sewujiyazhouyingyuan1 a4yy万利达首播影院官网 午夜福利视频自拍偷拍 日本强奸绑架 下载 华人自拍专区 上海罗城厕所种子 日本免费AV camporn国产自拍 激情邪恶大香蕉 印度三部曲百度网盘 jiqing伍月天小说 龙在少林国语高清优酷 美女被虐中出视频 乱伦交配视频 伦理片爆乳美女写真 鲁尔山在线你慬的大片 美国十次la视频导 青青草大猫咪 骑车的女人韩国 极品美女磁力链 强插幼洞视频 极品黑丝性感女友宾馆中慢慢调情玩弄 鸡巴用力插入小穴 精彩剧情演绎 情趣黑丝高跟美骚妇装看病勾引药店医师 病床上激烈ML爆操 无套 激情视频图片小说在线播放 吉本多香美三级 青青草熟妇视频 江疏影不雅 视频地址 Sq222 壮汉番号 日本三级喷奶视频 老板润滑嗯嗯啊 琪姐在线视频 亲亲视频在线首页 露奶子的黄色小视频 婷婷大香蕉伊人线 性激情影院 日本三级456重口味 换妻书 红楼影/院 国产自拍叫床 仔仔网今天怎么打不开 4438x全国最大成人网址 富二代大屌哥和学院女神预览视频 就快播 私人玩物玩具酱在线视频 waifu哔咔官网 正在播放 成都极品女神 汤姆影视在线视频观看 风吟鸟唱摄影师嫩模 亚州视频狠狠插大香蕉 女王俱乐部免费视频 好日日中文字幕 啪啪啪视频AV 黄色网络视频在线播放 嘿嘿lovo大香蕉在线视频 朋友胸大漂亮的E奶女友勾搭了一个多月终于在朋友出差时出租屋里操了她看她害 黄片下截连接 黑田万结花无码magnet 欧美女主播 狠狠日色格格影院 小姐和顾客链接 magnet 泰国伦理院在线观看 578sao 在线丝袜影视 日本高清无码视频自拍 偷拍商场女厕所全景磁力链接 magnet 户外免费毛片 每日更新在线观看偷拍 longteng xiaishuo 丝袜av福利 96av在线草莓免费视频 30路熟女快播在线播放 日本娇喘黄片 黄色色播站 秋霞一级特黄高清无码影院播放 ibw619 老师邪恶影院a 色妇影院 www,4438x7 14438x最新网站有哪些 sesihu 1电影天堂EEUSS 年轻小夫妻性爱视频 91大神国产自拍 KEDQUXxX 巨乳家政妇无码 magnet 莫西哥性爱 里番轮奸俱乐部 成人免费视频 A片 被玩弄的50岁熟妻 歴代豊滿巨乳大人気女優 东莞21,55实拍视频 乱情影视的兄弟网站 xxxvdynom 快播色色影院 国产在线主播 91小青蛙红杏出墙3p 男主叫佐藤女主叫千里的里番 秘杜mmsscom 南京熟妇做爱视频 韩国主播梦 波 福利 耐克真黄色录像一级片 免费视频一级AV 摸I奶乳头视频 国模白鹭 色伊人好看动漫色 白丝福利露裆部 免賛福利影院 福利在线神马51 国产无码偷拍小视频 国产出租屋偷拍链接 延禧宫电视剧全集西瓜 小视频黄网 丁香五月欧洲视频播放 正在播放国产熟女 莞式按摩服务伦理 干逼网址免费在线观看 撸网在线 亚洲野狼群AV 手机五月丁人网 a阿vvt天堂2014在线 东方影视 永久在线 东方四虎av伊人 三级纶理片 肛交乳交奶推视频 恋足足交视频92 四虎 小穴 韩日AV 好吊曰妞欧美 在线高清高速影院 日性感少妇 快播巨乳少女在线播放 李湘人体忆书照 亚洲视频夜必橹 美女伦理图片大全 欧美性交私处图 若兰神马影院 农村操逼网 黄色三级小说 影音先锋熟女淫乱 女明星无优人体 金发女郎爽射无码 就去干bb 欧美人体五月天 男人日女人下面的视频 欧洲下体艺术照 色中色色中色白毛 爆操少妇在线 www003secom 人体私拍海天翼 傅贞怡艺术照 超级淫荡的嫂子勾引我 继母裸体 巨乳shufu 美女强奸视频快播 佐佐木心音影音先锋 988性爱网 台湾色老中文网 快播电影性爱女人 办公室爱爱自拍视频 欧美兽交肛交群交口交双插 美女做僾动感图片 姐也要内射图片 91热色色色 色岛撸水妃 口暴10p 六月婷婷激情网 影音先锋亚洲尻屄 干40多岁的女人 明星合成人体艺术 操弄美女 三p美少妇3p 黄榕胆大人体艺术