: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 [schema_name.]class-name [{, [schema_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. * **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). .. note:: From version 10.0 of CUBRID, on the HA environment, **UPDATE STATISTICS** on the master node is replicated to the slave/replica node. .. note:: From version 11.3 of CUBRID, synonyms cannot be used when executing **UPDATE STATISTICS** statement. .. code-block:: sql /* CURRENT_USER: PUBLIC */ CREATE TABLE t (c int); CREATE SYNONYM s for t; UPDATE STATISTICS ON t; /* Execute OK. */ UPDATE STATISTICS ON s; /* ERROR: before ' ; ' * Class public.s does not exist. */ .. _info-stats: Checking Statistics Information =============================== You can check the statistics Information with the session command of the CSQL Interpreter. :: csql> ;info stats table_name * *schema_name*: Specifies the schema of the table. If omitted, the schema name of the current session is used. * *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: 1 => Total query time took 1ms. * 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 /*+ NO_MERGE */ * 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(m), 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 temp(m): hash list scan or not. depending on the amount of data, the IN-MEMORY(m), HYBRID(h), FILE(f) hash data structure is used. * 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_PUSH_PRED | NO_MERGE | NO_HASH_AGGREGATE | NO_HASH_LIST_SCAN | NO_LOGGING | RECOMPILE | QUERY_CACHE ::= [, , ... ] ::= [schema_name.]table_name | [schema_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_PUSH_PRED**: This is a hint not to use the PREDICATE-PUSH optimization. * **NO_MERGE**: This is a hint not to use the VIEW_MERGE 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 [schema_name.]table_name (col1, col2, ...) WHERE ; ALTER /*+ hints */ INDEX index_name [ ON [schema_name.]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 [schema_name.]table_name (function_name (argument_list)); ALTER /*+ hints */ INDEX index_name [ ON [schema_name.]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. "I can't think of it," replied Frank; "what is it?" Judy Abbott Still the tonga; uphill and down, over the hilly country, with a horizon of dull, low mountains, and the horses worse and worse, impossible to start but by a storm of blows. Towards evening a particularly vicious pair ended by overturning us into a ditch full of liquid mud. The sais alone was completely immersed, and appealed loudly to Rama with shrieks of terror. Abibulla on his part, after making sure that the sahibs and baggage were all safe and sound, took off his shoes, spread his dhoti on the ground, and made the introductory salaams of thanksgiving to the Prophet, while the coolie driver returned thanks to Rama. "Did the girl know her own story?" she asked. "Nonsense¡ªyou're coming wud me." "I'm afraid father forgets things. But come in, he's bound to be home to his dinner soon." HoMEÏã¸ÛÒ»¼¶¸ßÇåÂØÆ¬ ENTER NUMBET 0018caroom.com.cn
ar3dfoot.com.cn
www.zhujunqiang.com.cn
www.7lll.net.cn
lxvt.com.cn
www.bjuad.com.cn
pyhdzx.com.cn
xkgpss.com.cn
www.mdtpm.com.cn
icanlink.com.cn
黑人美女做爱下体艺术照片 搔妹妹黄站 大吊操丈母娘 安卓手机nomao软件下载 18yeseecom 韩国黄色片 欧美母子乱伦4 人体艺术网站张筱雨 av黄色性爱 圆圆的奶子影音先锋 社内情事巨乳olあずみ春 diy自动的性爱操逼器 神乐坂惠写真先锋 操逼电影直区 美女护士阴唇图片 WWW.KAN51.COM WWW.7SE7SE.COM WWW.AVVAV2016.COM WWW.FJDZH.COM WWW.76ZH.COM WWW.XXSPJC.COM WWW.66SDY.COM WWW.NNN89.COM WWW.BBB788.COM WWW.ZY-LED.COM WWW.97XFDY.COM WWW.JIYOUTV.COM WWW.KEAIMM.COM WWW.97JY.INFO WWW.77UJ.COM WWW.992AAA.COM WWW.SE105.COM WWW.999H.ME WWW.QFZQZ.COM WWW.46NK.COM WWW.168CAI.COM WWW.ZXW1.COM WWW.SX831.COM WWW.26ND.COM WWW.CCC800.COM WWW.CUPAPA.COM WWW.EE974.COM WWW.ANQU66.COM WWW.333XA.COM WWW.HXTLED.COM WWW.PUTCLUB.COM WWW.464U.COM WWW.MOKAOBA.COM WWW.QPFCH.COM WWW.DAEN88.COM WWW.ANQIMA.COM WWW.ISMDY.COM WWW.99FF5.COM WWW.AV5999.COM WWW.AILUDE.COM WWW.SOSO8383.COM WWW.WWW44HHH.COM WWW.282QQ.COM WWW.WQQKG.COM WWW.HAO5588.COM WWW.QDH100.COM WWW.HHH085.COM WWW.D442.COM WWW.AAA979.COM WWW.NIU21.COM WWW.FZXINQI.COM WWW.2732322.COM WWW.80WM.COM WWW.GGPAPA.COM WWW.998UIWD.COM WWW.20GG.COM WWW.TTKANTV.COM WWW.9GDY.COM WWW.XADDM.COM WWW.37XX8.COM WWW.CCC679.COM WWW.MAXCMS8.COM WWW.SSS03.COM KHALED.FARAH WWW.34EEE.CON WWW.777SU.COM WWW.HACKP.COM WWW.97PPP.COM 好色巨乳熟女人妻 啊啊插我自拍 GG004 亚洲av偷拍自拍 日本手机在线观看视频av 亚洲熟女人妻50路在线 www520520eme 三级片透视美女 www8aake 情欲艳谈百度云 狂抽插粉嫩美妇图片 黄色成人电影院 另类小说专区第1页 婷婷色丁香迅雷下载 少女手淫偷拍视频 风骚老板娘 激情影院床戏片 卡戴珊禁播图片图 欧美超碰先锋影院 性生活影片大厅免费 肉感系列 WW678图片 两性乱伦拳交 2B哥哥乱伦熟女 599AP 鲜嫩肉穴 狠狠爱夜夜橹在线hhh600com 奶大妞女 色狗成人小说 三个嫂嫂轮着玩一乱伦 巨乳妻子 www743333 sm调教美女妈妈 免费操逼啪啪啪免费视频 超碰依依 pp63 倩女销魂 三级片全部免费观看完整版 磁力链接捆绑女教师 6080三级片mp4 撸色撸 爽亚洲15p 干妹电影清晰度 奴志愿替夫还债 免费成人网那里 国产自拍极速在线 手机无码在线云播 天天啪久久wwwgeerlscom 淫妻绿帽另类图片 射她淫下载 免费黄片网站大全 成人直player成人直播 杏月美在线无播放器 女孩的阴蒂 免费成人电影网站排行榜 岛国色色在线视频 99热久久操干狠狠 wwwsaojjzzcom 在线撸图 丝袜护士成人 葵司三级片 日本女穴 内射色图 avav9898 欧美成人大鸡巴用力插 2017天天撸 狠狠的干2015 色驴影院AV 免费成人三级快播 迷奸第1页-插妹妹a片96网 撸儿所成人 凹凸在线破处门 爱微拍福利av 大奶奶日本系列 Av东方在线视频网站 射射撸av 成人动漫友人之母 色刚刚帝国 seqinyiji 欧洲一级性爱图片 曰麻比 哈尔滨狼友 木美子 丝袜亚洲av 武侠母女同 给个2017能看的网站 日本激情网 最大胆熟妇丁字裤艺术图片 lu198com 52bobo52 人与狗番号 丰满淫语啊妈视频 亚洲色图偷拍自拍乱伦小说 www77dsnettvb 西施三级在线 mmm9ckanzycom 873ee 口交av免费视频 WWW208UUCOM 人体艺术性爱照片 乱伦妈妈小说 青春草在线华人 yes44444 邪恶漫画之妈妈丝袜双飞 免费甜性色爱电影 人妻巨乳影院 AV成人播放器免费的 韩国r级限制电影手机在线观看 7f5gcomshipin33html 日本www网站下载 抽插淫荡少妇小清15p 2015超碰在线视频观看 51撸影院 chinesepornvideos--porn300 prouhubcom日本熟女 wwwhaoav 010性爱综合网 日本在线h小游戏 嫩妹妹av86cccccom ss成人 大帝Av视频在线免费观看 初中女生下面 丁香5月亚洲 色系x小说 嗨他网大色网聚色网 欢欢时空 丝袜足交熟女20p 花和尚综合 开心春色 韩国情侣做爱高清自拍看巨乳多多影音 自慰小说免费看 www725bb xxxx欧美制服 学生妹强奸网址日本 亚洲色图15pwwwjjjj14comcomwwwssss88com 好吊妞AV 小明看看99recOm 搜索姐姐妹妹看AV 6080激情影院 日本身内射精av atv444电影院 超碰在线看视频 a片人兽乱伦 美国美女大逼电影 亚洲熟妇色图 欧美性爱色域网 14伊人 古典武侠校园春色明星合成 娃 美女黄色一级片电影 性感小说姐姐梅 成人伊人开心网 自拍诱惑照 速看100影视 250色艺中心 被公公大夫插 xfplay丝袜制服 制度诱惑系列在线 爱裸睡的女儿丹丹 可以搜索演员的黄色网站 色欲淫香手机 狼人艹综合 uc成人浏览器 WWWavtb789com 亚洲日韩国产精品在线 1138x成人wang 7次郎在线视频 亚洲&apos;av 26uuu做爱 上海177姐妹花在线视频 女人淫荡的声音 h淫荡美熟母 强奸幼女av网站 乱伦o 嫖娼约炮色中色激情影院 扒开董卿湿漉 wwwpu690com 爷爷孙女爱爱 和阿姨疯狂啪啪3p 伦乱片236 wwwmumu98comwwwmumu98com 韩国mm影音 www_kuai97_com 美国豚鼠2在线观看 肉棍蜜汁p 亚洲肥奶奶性生活视频 哪里能看到免费的幼女 88街拍视频网 黄色网站最强 成年人电影色黄 强上老婆的妹妹小说 凌辱女友mcc色站 青青草AV在线视频观免wwwshe72com 邪恶漫画gaa 妻子成了公共汽车 性交实拍舔鸡巴1000部 国内最大成人在线免费视频 丁婷婷丁香五月 古典武侠迅雷专区 西瓜影音毛片网址 制服丝袜偷拍自拍在线视频 2365xxcom 制服丝袜m 成人瑜伽在线 草樱av免费视频l www523uuucom 欧美小女日 国产普通话叫床 女生在线自慰av91网 骚货偷拍 强奸乱伦先锋中文字幕 直播视频6页 黄色电影视频magnet 413121神马电影 给女护士爆菊的小说 黄色av做爱 566qq五月 大炕偷情自拍 国产大鸡巴操 冯仰妍16分钟在线视频 wwwav520compage1html 国产超级成人视频在线 被迫子宫内射 日本无码拳交番号汇总 nk290com 少妇被强上mp4 亚洲偷拍自拍www912yycom 宅男色影视色 乱伦熟女tu图片 日本熟妇色色视频 和老婆激情性爱记录 姐姐骚哥哥爱妹妹图片 刀剑三级毛片看一下www906yycom 小明看看首页最新通道 扒开小姨阴唇插进去 麻生希google 小优仓子云盘 母子qin 姐姐高潮出水10p 228df看不了 影音先锋成人动态图 5tav 穆桂英外传古典武侠 干哥哥插妹妹逼 淫人社区 淫香淫色色欲影视清纯唯美 男男性交mp4 久久爱视频在线观看视频ijijigecom nxhx人与动物 259LUXU139 小色狗成人娱乐网 类似巨乳淫奴的小说 山形健和早乙女 陈老师的肉色连连 夜涩猫6699 av天堂网先锋 大鸡巴插老婆magnet 欧美女人潮吹视频在线观看 日韩五月丁香 亚洲色欧美色在线 站着哕爽 亚洲视频老熟女 天海翼 亚洲 图片 丁香社区bt下载 重口味女人分娩图片 母乳幼交 xxx3333 偷拍 母子操逼怎样操的舒服 人妖打飞机翻译 鸡巴狂插少妇 国外幼少女电影 幼齿网址 有什么色电影不腾讯可看 刘亦菲阴道毛多吗 店长推荐成人动漫吉吉音影 国外人体意思 美女图片大奶逼 zooskool 人与动物huaididi 熟女bb无毛 兽皇女主角名字 微信毛片群 撸波波明星美图 影音先锋av在线视频 日女女逼 日本裸女人性交 幼女就爱被大人干快播 欧美奶奶图片 日本熟女av母亲型 社情导航 av movies 下载裸体美女图片 韩国女主播雪梨裸体 狗鸡巴插穴故事 掰开人体私处 花和尚播放器 日逼片百度影音 强奸系列小说下载 老农和几个大学色女生的淫荡生活 超大胆少女人体艺术 乱伦艳说 偷拍在拍在线论坛 户田惠梨香番号 淫贱女星卖逼图 日本毛a电影网站 44porn 韩国黄片影音先锋 激情性爱 乱伦 制服诱惑 快播电影 我的女友是黑木耳 小泽利哑裸照 弥生16岁 妈妈乱伦屄 思思色尼玛激情亚洲 欧美黄色网站视频第一页 色婷兽绝 快播春护士 儿子液侵母亲原照片 激情a毛色 影音先锋佐佐木希 av yeyewoyao 风骚熟妇合集 少女的屄阁 baidu美女人体 汤唯吃鸡巴艳照 人体掰b艺术图 11xingjiao 不需要下载播放器的裸体做爱 大胆巨乳美女一丝不挂图片 波多野结衣 黑丝快播 大肚少妇乱伦 meisedianyingxiazai 影音先锋 春宫心 人妻1953 女性生植噐照片 看看 人与曽肏屄播放 肏农村女人屄小说 影音先锋能用的码你懂的 先锋影音 伦理 肏小乔屄 阳痿狗鞭 阳痿的中药方子有吗 qiangjianluanlun s 张靓颖人体艺术视频 大奶奶人体 皇瑟片女搜搜能看视频 147人体艺术 羊羊 angl23com 鲁av影院 色女草榴区 ww我和老師做受jeiw020ccm网址 我老婆是骚逼 东北老女人性爱下载 you女孩太小插不进去 田中瞳梦工厂 港台本土影片 舔足h 最果神狐 梁婖婷被干 人兽坏弟弟 苍井空爱爱照 插入表姐身体 苍老师淫叫 欧美美鲍人体艺术网 实况足球8补丁 growing 无处安放 五十玫瑰在线观看 powdersnow nortondiskdoctor 重生之小保姆19楼 松原教育信息网 归化与异化 42楼的浪漫情事 最近黄金走势 杀美女吃人肉小说 欧洲亚美图色色小哥 李宗瑞电影在线试听 鸡巴插逼四脚兽 930影院手机版 我爱看片手机下载地址 免费品色堂论坛 尤女人大屄看看色色911 亚热之女先锋影音 男人做爱女人的小游戏 WWWSEXCCMILCOM 父亲操女儿台湾妹 最新人强奸与动物的案例 日50人体 高树玛丽亚bt种子下载 大胆性交视频 SE92KXZCOM 美国大胆女人人体艺术 女人色动态图 处女阴部裸体 WWWAVTTUUCOM 美丽女主播被强奸爆菊后擦电影 我和2个女同事做爱 成人激情黄色乱伦电影下载 少妇风流电影 xxx人兽性交视频 阴唇特写高清 操农村61岁老太太 快播免费成人禁片 粪礼迅雷下载 大色哥成人小说区 妹妹色色亚洲偷拍 9955d新地址 强奸艾儿 干干妈page 美女粉乳头10p jux381 激情少妇少女高潮 xb电影网奇米影视 黄色录像电影片段 李宗瑞torrnetthunder 欧美色图黄色的 淫妇av在线 小说日本换妻 男女性爱激情图 新女体洗澡 操你啦群p美女 哥哥干欧美人体 义母之吐息 幼女性照片作品 大屁股熟妇18p 偷拍自拍网友性爱视频 欧美专区在线 911ss主色911主站 漂亮面孔奶子圆高潮近叫不停 人体艺术747 性感男被搞射好几回精液 在线欧美激情电影 f05bbd3e00007510 撸色网百度 sese欧美成人 偷拍自拍12p 熟女视频自拍撸 WWW914XXCOM 华娱花花世界 关之林丝袜 欧美淫荡女人图片 自拍激情小说综合 日本黄色播放器下载 粉穴自拍偷拍 西西人体艺术张雨 俺去也伦理片免费 优艺裸体 肉铺团163wang xx社模特子顡 哪里有处女逼照 北原多香子艶尻ed2k 怡红院里什么名字好 女人做爱吧 巨乳人体艺术视频 606kxw色五 操嫩洋屄【0930】 WWWQINGYULEME 男同小说色图 妈妈大花屄 男人肏母兽完全手册 顶级黄色图片可看到阴道口 人妻熟女性交图片 东北火车道银镯子 快车成人电影网子 xingbiantaiwangzhan 张筱雨私穴 最激性亚洲顶级图片 极品性爱在线 体验区免费嘿嘿影院 处女色穴 大爷操影院可乐操 美国妹妹大咪咪 亚洲欧美图激情小说 WWWSESEOCOM 明星版h小说 五月色图】 voa在线视频 快播色青片大全电影网站 马六人体淫荡图片 音影先锋黄色网 苏格影院龙珠传奇 不用快播网页在线a片 操骚逼女老师 youjiaotongzhi1 俄罗斯妇女野外放尿 明星草 美熟女被按在床上操 女人被狗干是什么感觉 淫荡妇女优 国外人体私处局部摄影 欧美激情校园春色www34qfcom 萝莉爱色网c20sqwcom 非州兽皇 我们永久域名59cao放不了 在复仇者联盟里草女的黄色小说 都市校园淫妻 骚货寂寞自慰 操丰满大屁股人妻小说 菊花撸撸撸 美女被叉叉的免费网站 新亚洲第一页 为什么快播种子大全登不上 超碰带孩子自拍在 bta18con 尿尿大便操逼拳交视频 少妇与公驴交AV 菲菲综合 超碰勉费视 很去狠撸吧草吧 蕾丝袜美女嫩穴小说 男人影视duppid1 露脸绝对领域 兽入交 学生妹90后淫 揉胸吸奶150 日本美女特大胆裸体露逼 拍妹妹拍哥哥射 在新疆卖GAY影片 家庭淫乱小说之强奸处女 东北小女孩原版 成人网站dizhi1 三个黑鬼与日本少女性交 大鸡巴操骚遥 姐姐美妙的裸体 非卅人休裸 成人片丝袜的诱惑 老人介护士合集 坛蜜恋足 手机看片宅男伦理电影 大姨姐与妹夫乱伦偷情 张柏芝艳门全图 老衲爱百度 亚洲图片区偷拍自拍图片欧美图片小说校园春色 先锋影音av撸色 哥哥综合影院www791hhcom 少妻艳欲下载ed2k 13岁人休艺术图片 色色动漫连载 按摩女人私处 亚洲萝莉射av 美国女人和美国男人一流黄色三级片 丰满嫩逼 做爱狠狠图片 欧美丝袜足交电影快播 18岁人妻少妇口爆吞精 网友夫妻上传免费公开视频另类视频 天天射色女朗 快乐小猪幼儿舞蹈视频 淫荡姐妹小说图片 日本美女干死B 欧美成人女同性恋大片 亚洲色图av亚洲美色图 原色网 幼交片网址 偷情综合网 书包网乱轮小说下载 附近老女人做爱视频 偷拍自拍美罗城 youyoudebi 国语操逼magnet 伦理片直播写真 1024最新人妻观看基地 久草在线美女主播自慰 欧美色图片婷婷基地 日韩美少女射精视频 李宗瑞快播电影网 小仓优子duppid1 免费外国性爱电影 首页中文字幕偷窥自拍人妻熟女 wwwjizzjizzjizznet 都市激情亚洲美图 偷拍卡通动漫另类口味 光酷影院 爱AV软件是什么 妻子和别人的淫乱完作者不详 公共汽车上插小穴 亚洲sewangoumeizipai av网插女 岛国裸女mp4 av淘之类的网站 大香蕉久草aV Av电影代伦理电影的视频 快播制服丝袜强奸网 成人电影上厕所中国 超碰人妻人人碰5533tcom 美丽母亲儿子乱伦 苍井空种子视频网站 无毛美女姓交 人体艺术艺术激情 加藤ツキ超短裙义母的美穴在线观看 日本电影私处下载 有声小说沙漏 qq电台有声小说 春色医 樱井莉亚thrund 小泽玛利亚练功房 小泽玛利亚最多 小泽玛利亚三十部 小泽玛利亚无限 求可以看的h网 给h网 www完美制度com www黄色123.com se开心五月天 开心五月天地址 开心尽情五月天 东京热06 东京热300 酒色网电影网小说 古典武侠酒色网 酒色网卡通动漫 怎么在快播里看黄片 黄色小说集 求一本黄色小说 黄色小说黄色小说 美人电影 偷拍UU 98桃色网 爱窝窝在线 国产小电影 老色鬼影院 骚女窝影片 色妹妹A片网 942xb电影 操你妹高清AV zoosex兽交 18to19emo 桃花色 一色春 鲁鲁射 偏执型人格障碍 马上色 狠很橹图片 白 国产大保健 迅雷 人人操人人摸人妻 最新sq网站 www18AV 色夜院影 缘来影院 abp 淫女动漫在线 写真视频福利app下载 国产性虐在线淫女动漫在线 日本足疗视频 天天828vv 人休艺术视频在线观看 251eee 京香julia 短片 猫咪大香蕉情人综合av 日本在线加勒比一本道SM 医院护士内痕 小池里奈avBB图 做出综合网 av文档一月合集 人工智能ai让女神下海不是梦 13色图 CREAM PIE漫画 女同天天啪 大香蕉青苹果 小明免賛在线电影 女学生 清纯 在线观看 家庭乱纶系少说 97秋霞福利 日本人妻无码播放 萝莉黄色福利 极品美女在线视频 不收费午夜影院污 ktfuli mhdm。xyz 老年人汽车番号 扩阴啪啪 特级大尺度毛片 XxXx69日本 索菲亚无圣光 情人啪啪啪影院 人妻之妻电视免费看 强奸乱伦动态图 人碰欧美在线清 清风阁视频日本免费 - 百度 秋霞在线观看秋霞伦理电影 小美女被强奸的视频丝袜美女 小莹姐吃奶之汁口述全过程 青青草白虎无毛视频免费观看 青青鱼在线视频免费视频 人妻熟女视频 青青草免费无码高清视频在线播放 性爱视频高清无码 迅雷链接 性感女神ppp视频 协和lunl 全国华人偷拍自拍视总集频 秋霞在线手机观看版 邪恶dt图片第145大全 在线福利导航 日韩在线视频国产 曰本大尺度抽扦bb视频大全 日本一本道视频在线播放 有黄视频的月光影院 日韩av手机视频在线播放 日本童交视频播放器 日本在线hh视频 伊人久久精品视频在线 美女自拍福利视频 褐色影院 直播上床 美国女孩成人免费视频 操逼福利动态影院 我爱干比b在线观看 日本夫妻生活片 avhome seji色戒视频 青青艹高青视频 农村色,情视频在线观看 一本道色综合mp4 唐朝av影视高清 大尺度av在线 125电影影视 小池里奈线观看 色喇叭国产自拍 调教性奴鞠婧祎 live 图 无码 51成人电影 亚洲色噜噜 日本少妇5p 吉泽明步7SOE-539 国产91情侣拍在线 自拍偷拍 亚洲 影院 潘号导航 xxx黄色动画片 jjzz啪啪啪 8090碰新公开视频 福利网站懂的2018 人妖欧美操逼视频 国模私拍露点视频 操逼视频碰碰在线看 女人的屄毛形状视频在线观看 女优种子资源 b里香视频在线2白色爽 强奸乱伦 制服丝袜 成人操逼视频在线 佐山爱bt蚂蚁 爱看午夜福利电影院 岛国艺术写真视频在线 兄妹激情 撸撸樂 久久爱视频福利视频自拍 心理追凶磁力链下载 浪阿姨 少女给猫哺乳 美国性爱一级黄片 桐谷奈绪百度网盘 抽插少妇视频欧美 五月香在线 2017最新理论琪琪影院 四虎高清亚洲 夜色福利导航-宅男福利网址大全 热の中文 热の国产av 草坡在线视频免费视频 成人小视频免费试看 91日本 特级毛片影谍 小公主影院av 自拍在线-自拍偷拍-自拍视频-网友自拍-91自拍-自拍在线 偷汉子磁力 免费福利87微拍在线 天天看片视频免费观看 八戒影院av被窝电影网av 武林皇后在线播放台湾 女同性爱视频网站 午夜福利视频1003 淫空姐 12岁啪啪啪 avi 磁力 跨越海峡的一对情侣影音先锋 兰兰性爱视频自爆 kinpatu86 在线 训雷种子 龙头蛇尾 童颜巨乳 久久成人电影免费 何奕恋土耳其在线视频观看 8k福利在线电影视频 美女被操免费观看 WWW373C0操 52avava播放器 色婷婷亚洲婷婷7月波多野结衣 色系里番播放器 桃乃木香奈作品汇总 坏木坏木木集百万潮流小说 厕所偷窥视频 av中文字幕在线看手机 4438x全国大五月花 2017ady映像画官网 森川安娜在线播放 678影院 伦理片黑丝名字 怡红院人人爱免费视频 乐愚驴good电影网 zvtt在线 拍拍776 国产自拍,三级 波多野结衣午夜影院 橹橹橹橹橹中文网 欧美制服在线啪啪 韩国主播金莎朗 在线成人内涵漫画 淫妻妻图片 hnds在线 caoporn91视频在线 AV视频中文字幕 中出外国留学生 国内外激情在线视频网给 私色房天天色 成人caohub 类似cum4K的网站 美足av最新 神秘av 仙桃影 鲁鲁狠狠在线影院 mini按摩黄色一级片 欲望Aⅴ 东方影库在线av东方 处女肏屄视频 福利直播在线观看无需下载 福利一区飘花影院 动漫vip成人视频在线观看 大爱福利导航 大香蕉新人人现 第九影院神马网58Aⅴ 大黑屌免费视频 东方在线aav视频 大香蕉s视频 第九影院午夜重口味 激情乱伦强奸 巨乳亚洲欧美另类在线 国产自拍26页 国产站街女偷拍视频 普通话国产自拍在线 天天摸日日碰人人看最新777 福利伦理无需播放器 nannuzuoaihuangsedaqquan 女主播户外野战合集磁力链接 dodort 在线毛片自拍直播 大香蕉一道本视频 义母吐息在线1mm 国产原味小辣椒在线播放 恋足系列里番 在线播放 自拍偷拍 微信小视频 鸟站出品国模 ccc36em 神纳花电影在线观看 色色久草 eeuss快播影院手机在线观看 爱福利伦理片 91色老板福利电影 91hdav101高清女优在线 泽井芽衣的女教师视频 一本道 moo在线视频播放 福利中文字幕在线看 被人定住的迷奸视频 ftp 免费的小视频在线观看 菠萝湾视频 孤微视频日本高清 国产自拍电源 男人大鸡吧视频 国产自拍 水滴 奸云群 ckplayer 在线观看 偷 哥哥搞在线播放 日本无码视频在线免费观看 亚洲东方成av人片在线观看 任你玩绿色网站 avavavcn idgif卵蛋图解 0077cao改成什么了 时间停止器校园m 91gaogao漫画 国宝影院综合网 理伦片毛毛 av欧盟 人人操人人热 福利bar亚 aV零影院 成人网子你 懂得 肉片动画在线观看视频 射丝袜足 在线影院 6080星奈爱在线播放 女仆娇喘 法国雏女交 接摩人妻 91萝莉转区 网红少女免费福利网站 【35052】在线视频色和尚导航 张筱雨大尺度写真迅雷链接下载 欧美美女无内图 欧美成人野狗免费视频 娜娜sweet磁力链接 宅男吧 大香蕉视频在线频影院 趣爱福利m3u8 名媛人妻温泉旅行黑心精油马杀鸡 日本女人l对性的阴道 日本女人4050 欧美女同性恋互舔视频播放 新新电影倾城雪第1页 成人教育 西瓜影音 插撸吧在线 秋霞 国内自拍 极品口暴深喉先锋 韩国电影床戏女兵 超级av搜索系统 西条琉璃在线bd种子 日韩'AV 99成电人影中文版 天堂鸟ttnbbs 步兵 明日花 影音先锋 青青草人人艹 mide215剧情解析 wwwxiangjiao58 gav成人网无播器 棚户区卖暗视频 播放 18teenjapangirls 大主播网视频站 avnight官方 色婷婷综合网 重口AV名 阿夷令人垂涎的身体漫画 pr网红私人定制在线观看 澳门皇冠永久视频 extreme sm tube AW影院 大西瓜m3u8 AV火山小黄人 电梯里被陌生人干高潮 不知火舞h动漫 小姨夫影院幼女 先锋资源人体 小寨厕所偷窥 香港经典三级免费在线观看 校服白丝污视频 乡村巨根香蕉 JAVHIHIHI视频 renqitouqing 骑姐姐免播放 淫网福利导航 古川伊织star-621在线 欧美A V天堂 禁忌之爱弄自己儿媳妇 堇花团队百度云资源 2018怡春院av影院 哈尔滨A片 午夜剧场福利视频0855 avaoao yy夏同学6080福利片 校园春色欧美视频 极速AV在线 被男友强吻和揉胸自述 999Segui 超清免费伦视视频在线观看 梁婖婷磁力链接 私雅网站 动漫女生和男生啪啪啪视频 日本图书馆暴力强奸在线免费 人人妻人人操免费视频 午夜影院瓯美裸体 A级毛片高潮四虎影院 日本在线高清m949dtv 亚洲影院中出诊所 韩国伦a片 国产自拍D奶 sex做爱舔B jz轮奸一名日本人妻 按摩系列 av 岛国中文无码无卡在线 色吧5色婷婷 sm乐园 868 国产成人规频在线 Vip男人天堂 nhdt-在线观看 乌吗av免播放器你懂的不卡电影 影音先锋资源站xfpllay AV男按摩师系列 magnet 黑人成人网站 肉蒲团 漫画 北京模特刘倩宾馆 操美女小穴 苍木空裸体照 操B插B靠B 草裙影视草裙社区主论坛福利社区午夜福利福利视频微拍福利福利电影福利导 不要会员的干丁香视频 材料rti值 操婊567 xxxww日本 wwwxxxw6 日韩av无码迅雷 magnet 麻仓美奈 网红女主播户外女王剧情演绎性感女白领叫外卖勾引美团外卖哥 轮奸 夹紧骚货 www4438x10 户外女主播迅雷磁力链接 乱欲全家130 武侠古典在线成人 最酷AV,av天堂,醉地av,醉地视频,醉地导航,醉地,av导航av在线,av电影,av视频,a 岛国AV神作磁力 淫淫色播 大香人伊网在线官网动漫 欧美性色黄视频在线s+o 小新成人影视 中文字幕在线星野遥 卵蛋网葵司 aaa999xyz 女主播门把手自卫秒拍 啵啵xo影库 操逼的小视频黄点。 成人极速性生活视频 WANQUEYINGYUAN saozixaoshuo TGGP78在线观看 苍井忧无码磁力 mp4 成八动漫AV在线 超级国产av自拍在线 爆操小骚货骚逼视频 免费的视频美女图片亚洲小 丝袜美臀在线视频 国产自拍车震 内射妹子免费视频 五五热在线视频 叼嘿视频小清晰影院 深川铃 磁力下载 一楼一凤影院首页vr 日旧夜夜精品免费日日夜夜视频在线奥门金沙乐场 heyav tv日本在线 迹珠美av在线 www99ddocm avgu 一道本东无码免费 香港4438 日本avtt 自拍 快播 色五月天 色婷婷 色老大 色米奇 国内一极刺激自拍片 乱伦骚爽视频、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 六月婷婷网址 跳跳蛋塞美女下面视频 黄片大战 湿舔视频 啪啪在线自拍视频 美谷朱里 男女做爱小视频黄片 vod60视频 午夜福利十二点日本一本道 猪猪爱爱剧场 老湿机影院免费观看十分钟t 乱伦视频影院 速播影院在线观看 最新2019极品爆乳女神私人玩物VIP版 后λ视频 倫理在線視頻 哥干美女l2b feexx BT亚洲熟女在线播放 4455第四色 456电影在钱 97色色来在线观看视频 国产系医生护士搞在线 国产自操 含羞草成人短片在线观看 不用VIP的午夜 爆乳寡妇替欠债亡夫用身体肉偿 本道久在线综合8b网 彩乃奈奈中文字幕在线 被偷拍的女主播中文 国产手机福利人人干 上海性战3 在线啪啪拍视频 美利坚自拍偷拍 人与狗福利视频 磁力搜索~老狼 3D动漫番号 色妻视频观看 干老太体内射精視频 乱伦 激情 pp6s视频 天堂网_avmp4 苍木玛娜教师伦理电影 自拍白虎 东京热一本道av无码百度云 伦理片逍遥谷 小玉私拍视频在线播放 操女友视频在线 97国产早早 XO影院在线直播 44480影院 亚洲成人手机网站 江疏影流出视频种子 快播视视频在线观看 琪琪影院在线视频 play sss欧美完整版 佐伯雪莱 福利视频在线 [无码中文]有m感的苗条美人~做 成人街射你视频 更好看的黄色毛片 楼梯小姐在线观看 佐伯奈奈合集磁力 色妞ppp 裸舞在线网站 伦理片天堂eeuss电影 美国人与兽性生活手机版 论理小视频线观看 毛片黄色午夜啪啪啪 伦理电影自拍福利 少妇的福利 乱交在线视频 毛毛比较多身材不错肤白美乳 卵蛋guf 色喇叭色大香蕉 色姑娘棕色姑娘综合站 毛片免费强奸 极品魔鬼身材女神被满身毛 青山菜菜iv 极品色婷婷影院 激情五月丁香婷婷人人 网络色色Av新片 福利视频午夜小说自拍 偷拍,自拍在线 舒服抚摸揉捏蓓蕾舔阴蒂图片 小岛南ZAIXIAN 五月天婷图片大全 美国伦理电影哥迅雷下载 下载 雷颖菲qq空间 日本捆绑调教 强奸乱伦影音先锋影片 暗怕棚户区小姐卖b视频 暴奸秘书电影 明日花绮罗cos嘉米 连体袜系列番号 我要打飞 机com2019 日本语性别视频 PornhubGav 导航地址发布 lunli 91苏州模特 人妻生活前篇 sigua555 91蛋叔奔驰第二部 日本成人av电影 黄图男人丁丁一进一出真人视频 欧美曰韩A视频 黄片无码网止 欧美H资源 黑丝袜美女和帅哥啪啪啪视频 朋友推荐县城保健会所新来的小媚技术不错要提前几天才能预约到720p高清 皇网无码 棚户区站街女暗拍洗脚准备开草门被踹开隔壁一对完事的要过来观摩妹子被吓坏了 黑人大鸡吧插逼啪啪啪视频 欧洲无码中字bt 猪肉佬小树林战野鸡视频 韩国1024手机在线播放 肛交视频免费性交 母孑性交 在线观看伦理国产自拍 内外双射激情片段合集 176大长腿野模空乘制服各种性感丝袜情趣大胆私拍2V视频 射影师糟蹋模特BB用扒皮的 韩国三级黄色伦理视频在线免费观看 蜜av 色播五月亚洲综合网站 - 百度 SIRO-3203 thunder AV在线论坛 有哪些口味比较轻的av 娇喘视频激情影院 玉洁全身推油视频 日本岛国中文字幕网站 小美女美乳跳绳 H番动漫在线观看粉鲍鱼 汉庭酒店叫骚 星野明 magnet 春药 国产 magnet 韩国车震视频大全爱奇艺 欧美尻屄视频 菜菜爱电影院 老头操逼免费视频 男人插88嫂骚视频女人9 木村夏菜子无码视频在线观看 国产叶美视频 国模无圣光写真线视频 国产主播自拍磁力链接bt种子下载 内裤哥郭静在线 新视觉影l院p7 二级黄片在线观看 神马你懂的的视频 迷奸超级美女视频迅雷磁力链接 神马影院福利视频88 YY4480阿婴免费观看 chunsetangchao 91boss宝马肉丝 在线 探路者 秘婷婷 欧美激情另类重口 yyyfuli 3Pvideo 桔子影院jm2222午夜 熊猫娜娜龙虾视频下载 wwweeeem AV怡红院 色蒲团 广州柳州莫青视频在线 色妞香蕉 www路52dvd路com aaaa555 在线Av800 在线观看亚洲偷拍视频 10 风吟鸟唱在线 域名升级 ffrrr 欣赏女人阴户图像视频 免费黄视频在线观看 凹凸视频线观看免费 肇庆白沙公园野战视频 chuangshangpapashiping 老头干处女体内射精视频 禁止的爱小第九影院 操狗bi 少女狠狠扣p撸 两性做爱高清写真 19p 优佳人体艺术摄影 蓝光wuma 色詀 优酷里面的丝袜诱惑花心男叫什么名字 澳圳性爱 经典三级1页电影 沦理片在线网 苍井空人人体 中国性交比赛图片 欧美午夜大胆人体艺术 操逼五月天欧美妈妈8888 那里有女人阴道艺术图片 日本人体艺术小穴图片 1级爿快播 轻舔丝袜 日本成人黄色动漫 干妈妈色区 超淫荡粗口脏话自拍在线播放 父女做爱电影快播 大奶子黑丝qovd 日本插逼激情 小说成人母子 喜欢给男人撸鸡鸡的女人qq号码 91四房播播 老熟女家庭乱伦a片 求在线直播黄色网址 很很 se 干90后丝袜女 舔骚逼网 成人视频包射网 人体艺术epub www66riricom 藤冲有关的电视剧 回家被哥哥强奸 最新黄色游戏 日本人体艺术手机图 zuoaitupianquanlou 日本女孩小嫩穴摄影 三八人体图片基地 狗狗巨乳美女裸体人体艺术 马六大胆美鲍人体 免费av女同姓恋视频 用影音先锋看的香港台湾成人网站 mama231 求一个可以用吉吉播放器看的网站 qingsexiaos 幼女艺术体操 每晚小姨骗我上床 日韩成人学生妹无码电影吉吉影音 宫藤新一的性福生活 黑人大吊快播av 天然大奶美女被操 dy东京热 幼群交快播 美女拨开小穴大胆照 我把岳母操的狂叫 亚洲图片小说网 关于鸡巴的故事 熟逼图片 密桃子成熟33gp 亚洲色图小肉穴 野战春色视频 拳宗不知火舞公园夜战 pingse论坛 涩情网站网中文字幕 五月天 va999资源网 美女美臀美穴艺术 女人粉嫩屄全图 欧美视频色七七影院 恋之欲室 百度云 泰国美女美穴图 wwwre999com 幼女海滩性爱 影音先锋 日本人体艺术绿色 最新日本无码av在线观看 连裤袜慧姐小说 女同性爱技巧淫淫网 大鸡吧肏屄里了 kk色色网 孕妇乱伦影视 nnn91色欲影视 看明星裸体 少女激情性爱图片 欧美裸体美女肏屄图 三级伦理艺术片 情电影52521 视频 WWW_850QQ_COM 屄【p】 2012rrcom 波多野结衣被射精图 WWW_778AAA_COM 欧美乱伦老肥胖女人df 美女列车伦理电影 李宗瑞那部好看 西西力人体艺术 干漂亮小媳妇 成人亚洲快播 奇米re666 最新先锋强奸乱伦 捆绑阴茎虐待刑法 干黑袜丝女乳交 日本男人干欧美女孩 国模巴拉拉大胆人体艺术图片 后庭教程 我和嫂子的做爱故事 波霸电影 日本杨幂种子 插淫逼图片 淫女色文 家庭乱伦网址 乱伦强奸偷么看 乱伦性爱无码中文字幕 亚洲sse色图 WWW_LUO999_COM 08人体艺术网 骚妇掰屁股p 影音先锋梁祝艳谈网站 WWW_VIPKUAIBO_COM 欧美逼毛 骚屄浪奶 要干a片网 黑人操妇女 沈阳淘乐新天地影城 3ipad 魅影小说 玄关狭长 山海传说 脱肛吃什么药 激情另类套图 超极度性感日本靓女人体 13日本大胆人体艺术 迅雷下载a片的网站 看人与狗性交的网站 nvyinshengzhiqi 张筱雨魅惑爱人体 chengrendianyingguankan 粉嫩小骚屄屄 继母爱图片 女人爱操逼怎么办 狠狠影院下载 爱爱jj发综合网 骚妇被操出白浆 蛇妖美女人体艺术 茜木铃 女人为出名用一层纱来遮挡身体 99bt核工厂成人 小说享受泰国浴 绝色骚货浴室自拍 为岳母舔阴 大月日本美少妇人体艺术 激情撸色天天草 35人体艺术图片 搡大白逼 林心如脱光衣服做爱视频 操操淫乱穴 色狼和丝袜妈妈 日本男幼影片种子 WWW_AAA_COML 性爱白色丝袜 及度强奸 蝴蝶色播 色哥撸成人xiazai 人体艺体术网 美国大尺度阴道摄影 兽交高清下载 色网站怎么都上不去了 漂亮女大学生在学校里被黑人学生干了的性爱文章 人体艺术草 乡村淫汉 我日了教师图片 挠脚心的小说 刘涛三级影音先锋 水树玉高清图 欧美丝袜svs视频 亚洲色图入江纱绫 成人性教育漫画图片 草小学妹 寂寞少妇极品美鲍人体艺术图片 人体艺术qvodthunderftp 色b姐 丝袜熟女人妻电影 WWW_12SE_COM 最新情路扣扣对话 俄罗斯大吊qvod 尻妣视频 王陆晴西西人体艺术图 菌の黑汁 乡下老夫妻扫墓坟前做爱高清偷拍 大便chaodongtaitupian 阴茎插入女人阴道文章 各大影院网站 rtys照片 WWWAA66ZZCOM 岳阳县荣家湾东风路的妓院打炮要好多钱 贺媳英 中学屄吧 dabimn 最新激情黄色图片小说网站 好色女成人网在线视频 偷拍熟女露鲍 国外天体海滩视频 鸡吧上起个火结子 av幼女种子 中国熟妇性交 日本哪个是白虎女优 熟女视频在线视频 自拍偷拍女女 和黑丝女老师做爱中文字幕 嫁去国外的淫荡少妇被阿根廷老外操高潮 人体艺术图片之舔阴艺术 骚妹妹蝴蝶色色成人网 jioingwuyue 日本美臀片 丝袜乖乖美女 70路熟女交尾 狗和人做爱的卡通 清纯唯美789 视频偷拍逼 美国性爱俱乐部 看老婆和别人做爱 陵辱2穴人生初中出快播 最大胆的摄影艺术 大自由门 深液操大逼 美女的色穴18p WWW78WWW38BOBOCOM 红苹果56女生视频90后 吕婉柔李宗瑞 天天干夜撸 影音先锋高清五十路 欧美成人色图片 肉色丝袜脚超清 狼国色人体 西西大胆激情视频艺术 h级爿 阴就插入小穴 无吗bt种子 三奷乱里五月 巩国兰穿花衣图片 性感女妺妹 强奸性感教师图片 淫色姐姐激情电影 caoporn用什么视频播放器 我用黄瓜套套插自己 性吧sex自拍偷拍 少女少妇幼女性爱 幼女强势进入 欧洲女人体局部高清 老农夫不准打灰机电影 美女图片b照 第一色房 宝玉冒雨回到怡红院 操穴骚穴骚屄插入 丰乳先锋影音 欧美裸体熟妇 五月天大胆美女人体 十次啦亚洲av 五月母子乱论小说 性感白屄人体 欧美孕妇裸体写真 骚穴内射骚逼 山田麻衣子电影么名字 新婚处女儿媳柔佳雅君 妹妹的小穴p 朴妮唛做爱动态图 杠交美女被干 加勒比女海盗torrent 丝袜美女被插插视频 五月天激情网迅雷下载 有动漫色图的网页 l浪起来色色综合 可以直接看黄色电影的网站 爱人体静雨 av网站求给地址李毅 银河护卫队2天天影院 妹妹的da骚逼 黄色8090视频 狠狠射专区 狠狠搜美女 裸女巨乳骚穴大图 人妻凌辱图 强奸熟母 色淫网撸撸 人与人性行为大全搜狗影视 WWW12GAOCOM 欧美大屁股黑珍珠 妹妹骑日 女马交配 色姐操逼网 东南亚少女10p muziluanlei 美丽人妻熟女爱爱图 能看见美女黑洞图片逼 撙士15p 人与狗熊交配 与外国男人激情性爱 台湾大禾丽 成人世界李宗瑞 少妇乱交30p WWW32ZTCOM 快播无码亚洲电影网 小泽玛利亚裸阴 footjobjanpenese足 内容有学生的av网站 风骚美女穿脱丝袜全过程 亚洲色图校园春色激情小说五月婷婷 干死日日b 2015最新操 激情淫乱色网站 清蒸花凤琴系列 亚洲色狼网友 av亚洲天堂网20l7 色喜大胆人体 都市武侠古典校园 亚洲请色音影先锋 成人网站有声 同性伦理聚合 swww99aaww 全国最大的日b网站 久热巨乳裸女 超碰少妇的诱惑 北京人体艺术网 北川瞳人体 东京地下女子影音先锋 熟女人妻变态另类手机在线 三个妻子的污漫画 小骚妻肉便器 步兵爱情电影院 春暖花开大香焦av在线 淫荡骚岳母色图 欧美色图男女乱伦 哪个网站能看到大阴茎 快播日韩av插件 成人欧美第一页在线伦理 浪b网 电驴插嫩逼逼 kkyyzssmagnet 快播骚岳母 印度av无弹影院 毒蛇av影院青 2017成人电影云播放 gay黄网 色波小说 萝莉社区luoli85 儿童爱爱网站 私爱阁AV747com 厕拍在哪搜 乱伦强奸小说吸奶 口交网撸很很撸很干www78p78info 狠撸欧美嫩逼 性吧电台网址 930影城色色影城 肉叉烧包洪金宝 日日干夜夜射天天啪365ahnet 猎男别动队在线 婷色艺术 sese97快播成人电影片 撸淫乱a9av7comwww1kkkkkcomwwwaaa366com 日本做爱大胆人体艺术 16p人与狗 淫乱绝世唐门 老公操死我嗷嗷叫 国产老人做爱在线播放 wwwzz姐姐 大学生做爱偷拍自拍在线小视频 三季带片 近亲分类影片 动漫AV中文字幕迅雷下载链接 狗日女人的真爽好大好舒服小说 刘安琪三级无码 苍井空潦草av片 美女乱轮小说 偷拍自拍欧美色图另类图片萝莉幼女 扩阴器多少钱一个 涩情成人免费播放器 美女人大胆性交猛图 深爱激情四房播 日本片偷拍两儿子和继母一起洗澡 23p啊啊哦哦用力快点 国产调教师 幼爱uu插图 狐狸成人电影 超碰视频con操逼www310zycom 林由奈电影在线手机 b13区2百度影音 超碰链接 桃源AV 射逼逼网 激情五淫激情ssj0comwww2wwwwwcom 校园春色淫荡人妻幼交 快插玩 成人动man 快播初美理音 小学生偷拍妈妈洗澡 xn漫画 宅男福利影院改叫什么了 操死女人逼 无毒成人网址中文字幕 超碰在线巨乳专区 欧美重口味人兽性交 邻家阿姨叫我添她下面 gav无播放器成人网 日日撸百度 婷婷成人网成人网站 中年妇女性爱激情图片 美白丈母娘乱伦 狂操公主嫩穴 欧美非主流性交 亚洲美女色诱图 澳门威尼斯人去去妹 性爱自拍色图片 父亲替女儿解决性 大鸡吧插嫩逼小说 色欲色撸 哪里看欧美乱伦 舔大学美脚微博 久久日在线观看免费923yycom 工口h漫画虐杀桃花岛 羌女阴部大全美16P性爱图片 妻孑的深喉感觉 五月少女艳情大奶妹 果敢成人激情网多多影音 狂插护士的大鸡巴 mCC色色白虎逼图片 www992ZyZC0m资源 超级明星大淫乱 共妻小洁哥去射 抠逼叫床 超蹦公开在线直播 在线视频偷拍自拍情侣丝袜欧美色图 哥哥色受美利坚合众国 东方4V伊甸园 guomoHD 狠狠啕蝶谷 三级黄色添下体 操射有声小说 wwwxxx人妖谢精 中文字幕风间儿子 zhaixiankanhuangpian www03meicon 高个三级片看看 六哥影视登陆 五月婷婷狼 louxuetu 一本道有码a片 性色图在线视频 大鸡巴操小屁眼 第一成人基地 丰满嫂子五月天 cengrenjiqingxingai 明星裸艺术 欧美色惰图片 wwwsusu62som 成人激情无限综合网 色哥看AⅤ 亚洲偷拍肉丝美女 99久久免费热在线精品动漫 哈起吗伦理 狂插空姐淫穴 靠比真人版 狠狠搞视频在线 5355ddcou 大香蕉亚州色图 亚洲图片自拍偷拍日韩伦理 狠狠插影院 亚洲标清成人在线动漫电影 av毛片无码片 韩国成人在线视频观看 无毛人体艺术照片 偷拍窥拍888 童话村av 美女性交欧美在线视频 国内成人偷拍电影院 sA片 艳舞性爱片 免费的黄色网站0 黄san 另类小说52AVav 超碰厕所偷拍在线 哥哥撸妈妈 牛牛碰免费啪啪视频 黄色资源最新地址 【vaaainfo】 骚穴看看 激情网址五月天 狠狠cao在线视频观看 大嫂撸 黄色图片观看 宅男色影视gggg69 先锋资源玖玖爱草第一页 夕草在绕资源站 汽车之家 处女一级做爱片 能看调教图片的网站 瑶瑶美鲍 中国美女外阴裸露 成人影院操P 国产av高清自拍 国产小妖精自慰视频 偷拍自拍区台妹 884aacn 哥哥撸xxx 漫画人体小穴 翁媳操逼乱伦 色哥我日女儿 巨乳丝袜操逼 3七tp人体摄影艺术网 五月天四房间播播电影 露b色图 撸撸射操逼电影 男女交配高清视频直l播频直播 A片套图 暴力虐待亚洲色图 234XXXX 卡通图片美腿丝袜亚洲色图 淫淫插插插玩穴 中文字幕黄色电影网谁知道 爱液操大鸡巴 wwwpp398comVR 儿子日妈妈阴道 动漫鬼作 WWW77baocom 3366mp3com 丝袜骚妇影音先锋 huangsecaoxue mmm9ckanzycom 天天射综合网偷拍自拍 第四色婷婷奇米影视 a片资源免费吧 大爷操作影院388sesecom 亚州欧美另类专 欧美双飞在线视频 亚洲处女网 草榴掰阴偷拍自拍 手机看片亚洲第一色 激情性爱小说网亚洲色图 曹颖三级照片快播 超频视频第一页 欧美久草色 成人套图黄 黄片日本magnet 美国十次博客 激情骚妇15p 优果网电影在线观看 大鸡巴操逼真人版的使劲操色色影院 japanfreevideoshome国产 欧美偷拍自拍偷窥 成年人五月天b网 美乳少妇尽情享受抽插的快感 幼女蜜穴女儿 学生妹被强奸免费在线看 一部女生被插jj的完整黄片 女儿浪叫 澉情五月网vv99vvcom 嗯啊不要 操逼声音 wwwpu311commbdbaiducomfifjpzeoycn 淫荡少妇被轮奸 卡通动漫淫 0088aaa上女朋友的闺蜜 x77135com 无极影院美腿丝袜 法国极品在线看 欧美色图lav 趁着儿子不在家让媳妇为自己服务下7M视频网网罗成人在线视频精品资源 人妻丝袜中出 www980 caobiwangseqiqi 骚老湿av 巨乳美女的奶水 光腚女人 迪丽热巴小穴 精品套图奇米影视 850黄色网站人与兽交配视频 移动成人你射精 成人看片自慰免费视频在线观看视频 伊人网伊人影院在线 后入女优P 午夜免费频道最新最热 www色comwww821kxwcom 霸上留守村妇 青青草有声 夫妻调教女奴 wwwfuliqq wwwliwu077com 免费的黄色电影 云插 慰安妇真实无码图片 日本妈妈的淫荡图 黄色乱伦电影av 澳门金沙动漫成人av 手机看片1024国内甚地 熟人妻网 大色网站av www944ffcomcn 我爱撸撸网 WWWavtb789com 我爱人体艺术图wwwwoairenticom 美腿丝袜迅雷下载 亚洲欧洲校园另类心灵捕手 rbd565在线HD www969ppcom百度 91自拍za 好色上美ol 热带夜手机在线播放 色色在线综合网站 第章熟女双飞 怡红院首页4000hhcom 香瓜妹最新地址 岛国A片免费 成人电影插插插 日本美女色穴图片 家庭乱世小说txt图片 日本色虎网 美子与公猪杂交产子 母子乱伦强奸小姨子 丁香五月小说网 欧州亚州偷拍图片 欲淫强奸亚洲激情 亚洲白虎B图集 俺去射成人网 大黑驴冰冰小说 使劲操骚逼 haole56789 大秀天堂下载 天天影视手机版 美女拷臂动态图 freehmovie动漫 熟女露脸激情自拍 成人激情图片,电影mmmnn7777 换母俱乐部 野人性交电影 geyesecn 失踪的小美幼完全版小说 japanyellowmovie 亚洲最大的成人网站wwwahhqgovcn 欧美吧夫妻 88coco最新网址 93年身材纤细妹妹抱着操才爽 情sei小说 柳岩操逼视频 教师夫妻的交换 美女光定高清图片 htppdddke9pw 内射翘臀少妇视频 韩国操逼怎么叫 推女郎青青草 成人A片小说 搜索女同人体 亚洲人体100 日本少女性交射精视频 葡京热任我鲁免费视频www25popocom 图片区我x要x你xx 韩国黄色的三级片 午夜成人性交生活 越南妹子多少钱玩一次 日本少女激情电影兽欲 最新乱伦比较黄的肉文 av调教视频在线观看 都市激情8899 caopron在线大香蕉 淫乐公馆 泷泽萝拉超碰在线 淫男乱女小说 日女人B洞小说 www点sesev点 3344VB 天堂avtt2017手机 黄色成人快播器 不用播放器观看成人电影网站 潢色片电彰 色7xavcom 你懂的zoos 美女撸撸视频插逼 请君撸angelababy 千人斩萝莉 韩国女主播黑丝叉叉 在线免费观看优色 在线巨乳美女视频网站 丝袜美腿居家熟妇 偷偷盗拍 泰国色哥 cheng成人动画 制服女人的性器官 色色偷动漫 强奸乱伦影音先锋第12页 自慰喷潮在线播放 先锋资源www7xfzy 在线有码1页 亚洲伦理在线无码电影 色色网老年裸体 在电影院偷情舔逼 小明看看黄色色 坏孩子A片番号 幼女的世界 开心四房快播 色厕所偷拍p 鼓楼色你懂得 欧美性交视频AV在线 最好看十大无码AV 一本道协和电影 成人激情12P 童交hentai 激情山村 肉感爆乳妈妈 偷拍自拍实拍 看图秘密app 影音先锋制服丝袜偷拍 东京热图片站 免费的av小电影网站 www路tu550 xxx苍井空黄片 老师插俱乐部 v色成人影院热热色 类似ked9的网站 猛操侄女的骚逼 之美丽人妖空姐黄色另类性乐趣 肉欲女医生 男人资源高清无码 WWW_WWUUSSS_COM 哪里看av影片 色妹妹25 偷拍学生妹自拍走光露穴毛 李宗瑞种子下载谁有 欧美性在线人3 外国人大屄大奶 地下歌舞团黑酒吧演出 猛男以超快速度不间断最后干的女友高潮长叫一声 操逼对人体有哪些好处 日韩爱情电影快播 色亚洲吉吉 做爱好图片 大胆时装秀千千影院 都市激情 综合网站 爷爷孙女性爱乱伦 美女动态图片都不穿 月亮女孩人体 抗日红杏夜色贵族 写真个人 张婉婉做爱白浆都操出来了 亚洲爽图馒头b 西西人体给力人体网 知性 激情五月成人 操逼图片 美女图片 国产三级伦理电影 美女老师操逼 淫妻小说日本做爱 99大胆人艺体图片 骚骚妈妈萧楠小说 欧美熟女乱伦15p 男友是黑人阴茎太大 女性人体艺术成人用品 色五网迅雷下载 哪里能看撸片 肏屄露屄图 色擦擦色图 成人 南宁极品美女 欧美成人在线视频无需播放器 蜜桃成熟 骚货 在百度种输那几个英文字母可以看裸照 异地恋对象各种勾搭怎么办 熟成人电影 韩国美女护士人体艺术 最新乱伦强奸迷奸小说网 小泉真希 美鲍 人体艺术图片搞鸡 www骚碰 女主播琴雨全集 11岁美女巨乳图片 幼女的资源第1页 古田美穗亚洲电影 好色妻降临 快播 欧美动物av sm性图片 穿着网袜人体艺术 淫荡老姨妈和我乱伦 外国的性交视频a 人妖乱伦强奸电影 同色电影网 自拍屄特写 日本美女兽交 第一会所骚穴 美美奶子裸体照 强奸理乱伦 毛片短视频 骚货护士图片 和妈妈玩脱衣游戏 乱伦小说 屄1图片 人妻1953 国产操逼片 人与曽肏屄播放 操自己女儿的逼小说 人体艺术a4u套图 偷拍工公园男女激情图 caodapigu 操大屁股女人 女生宿舍偷拍性爱 暴风影音偷拍自拍36ccc 对操图片 成人小说视影 欧美女王另类调教视频 性交生殖器动感观 qvod 女儿的奶水 亚洲色女露逼全裸图片 美女裸照种子 国模人体艺术大全 屄逼肉 高清视频成人写真 吉吉影音幼女片地址 八少女大胆裸体照片 女厕 露脸 成人捣逼 拳交 兽交 重口 日本少妇私处图 h狠狠搜 女人白虎屄 人和鬼做爱 父女做爱的自述 94蜜桃色图片小说 自拍偷拍激情艳照 偷拍自拍撸撸色明星陈慧琳 成人动漫电影小说 亚洲激色图 越狱第二季高清下载 太原回收冬虫夏草 心理学与生活下载 禧阁古装 感知农场 北京公交车线路 艾灸视频 WWWWWJOUJIZZCOM WWWWXRBCOM 爸爸鸡巴插我屄里教我做 日本性虐待漫画 透明裤衩美女看见屄开口丝袜 岛国肉片在线看 美女裸模劈腿露阴毛照 色色公公与好儿媳 美国人家庭性爱乱伦春暖花开 黑人体艺 www亚洲色图com 童话村徐锦江 池田小可ed2k 美女操干 这老外在泰国专干孕妇 插你妹仓木麻衣 金发空姐性交 色老头色图 黄色乱伦性奴小说 国产群交视频 7788sesewang 为什么男人都色总摸我 朴妮唛没马图片 臭逼成人网 大屁股淫妇也疯狂 WWWQL028COM 空中剧场相中xian 长相超赞的欧美白发天使女郎床上大胆人体 我和小姐乱伦 567pm 兽交影片先锋 美女毛片a 日本熟女人妻黄色网站 3级激情小说 在线美女成人电影 大肉棒插新娘小穴免费小说 四房播播成人网 WWWMEIZYWCOM 毛毛逼网 形形色色六月天 亚洲淑女老妈视频 小说激情的少妇和狗 亚洲av人与兽 成人电泓网 淫淫网色吧26uuu 日屄找谁 苍井空绿色大战 正在播放幼岁交快播 wuyuetdvd 由赖心美 小任的调教 乱伦大鸡吧操逼故事 欧美专区在线 和女仆干真爽电影 裸体体艺术 脚插入美女的小穴 肏赤峰情人屄 人体写真阴道i 内射妈妈乱伦电影 风暴成人网站 f05bbd3e00007510 口述女人操逼 影音色中色成人人影院 成年骚女人 孕妇阴外艺术 快播强奸少女小说 操闺女逼小说 422sss 人体艺术夏冰百度 小早川玲子诱惑美腿教师影音先锋 春暖花开性吧有你亚洲无码视频 成人在线专区 wagasetu 禁片人与动物 寻找日本乱伦家庭黄色小说 屌配屄毛 偷拍自拍东方色图 美女做热爱性交口交 qisedaohangchengrenwang 柯南zonghewang 明星美图视频 小说骚女骆白 av音影先锋 黑人空姐种子 内射中出肏屄 口交口爆性爱 rentiyshu 嫩逼会所 哪里有欧美高清性感图啊 人体图艺术片大全 人体淫秽性交色图 加山なつこ无码流出 李宗瑞性侵视频全集久久 三级色黄色片图片 菲律宾三级片 日韩女同色图 四房快播狂插美女 av男人电影天堂dg286com 哪里有阿娇种子 有免费的操逼视频吗 美女写真内射 西瓜影院图片图库 快播少女裸体艺术表演 如月教师快播 操屄小说视频 蒙古女人的性欲故事 本地偷拍自拍 女人黑木耳wwwgzjnetcom 欧美av美图天堂网 少女小骚逼照片 农夫新导航不准打灰机 苍井空AV全集在线播放一本道东京热 24报偷拍自拍 换妻母子 美国一级毛带基地d 樱花族luntan 空姐干爹 解梦淫妻网 妹妹爱液横流 色婷色婷婷五月丁香 曰本少女曰夜射 熟女乱入10p 欧美图片日韩自拍偷拍 亚洲性l大爷视频av 美国大片操 妹妹主播 淫乱熟女艺术 cctuo wwwAVKUTV 干少女肥屁股小说 古装电影日逼 白虎美女色区 幼幼片微信群 家庭乱伦综合 无码免费中文字幕wwwhhxxoo1com 哪里能看最新东京热 抽插揉捏少妇小梅 欧美阿v女星播放 18岁以下禁止视频myoukucom 伦理片和姐姐野战 2017港台三级最新网站 快播成人中文字幕 插姐姐奶 18禁图片干比 www撸撸射亚洲人 操插瘤护e?1?7?1?7流水 wwwbaiducomwwwbbb077com 公公公公操操媳妇嫩b 桃花宝典极夜著豆瓜网 厕所里的肉肉 激烈抽插漂亮大奶妹 先锋影音av撸色 疯airav安卓 黑鲍老女人 13岁人休艺术图片 chengrenxingjiaoba 韩国玫瑰主播 邪恶帝国肉番全彩变态 插了进去妈妈a片 处女人体艺术阴部下体 在线点播长电影 wwwcaoppp9com 群p门 撸一撸幼女性交视频 少妇的qq或微信 外国姨蕾丝水 老阿姨包吹www91qq1com 美乳诱惑美女 撸一撸强奸乱伦电影 日本大奶大屁股电影 成人小说sis 舔阴猛人网站 色尼姑全亚洲 好屌干qk青娱乐 下载邪恶姐弟小说 谁知道色五月网址 美国黄色pnt miaomixia 青草快播全集 大咪咪色图网 龙骧亚洲色图美腿丝 男人插美女护士私处视频 男主播飞机自拍 pengchao 黄色一本道a片 大奶子干妈给撸着鸡巴 网页搜索午夜大片 坠落女友九九 wwwhaorenshuoc 台湾明星teresa 女厕所系列网站 极品美足猫色网19 插妈妹妹综合 h人妻女友短篇小说 农村少妇裸体写真艺术图 色播五月天 开心网 有声小说叫床 有声小说神医 最春色小说 大陆春色 樱井莉亚dvd 小泽玛利亚紫色 波多野结衣图片 求火影h网 无毒无弹窗h网 开心播播网日韩五月天 东京热天使 东京热0108 东京热jpgfs2you 快播酒色成人网 安也去也酒色网 9492酒色网 波野结衣av影音先锋 悦来客栈 采色区谁有E 插骚逼电影 屋屋色影视 小骚女影视 AV色站导航 开心激情影视 你淫我射电影 人间风月影院 人来色成人网 色JJ电影网 性乐汇色高清 淫荡AV美女 高清无缓冲影院 赤裸宫殿谁有E谁有G 美妇骚穴成人电影 法证先锋2 日日夜夜 葡萄干 公开caoporn 新农夫 色之综合 免费无码不卡动漫 音影先锋 2019 色色资源 唐人电影1号站 偷拍影院东京热日本 无码中字 人妻中字 强奸中字 闷骚欧美在线影院 谷露影院日韩 蜜Av 性漫画在线免费观看 magnet 蓝色导航地址雅虎 美女ppp小黄视频大全 76,kkkk,com 色五月综合缴猜 4438x打不开换什么 古墓丽影香奈儿在线观看下载链接 天天一鲁 gay pornhub video chitu 日本大尺度黄片视频网址 中出视频456 四虎在线影院 magnet 秋山雫视频写真 性生活抽插视频播放 拳交的美女裸体视频 晓晓影视av 秋霞伦理电影网中文板 犬交福利 邪恶e漫画口供无遮挡了3d 日人人555 日本三级高清视频 影音先锋在线视频 与洋妞大羊女做爰的免费视频 日日啪夜夜爽天天干2017 樱井步 骑乘 玉桃园毛片 日本午夜成人一本道 日本性虐电影百度云 656影视 美女的下面怎么长黑 天昊影院理论片 在线的午夜成人av影院 フェラハメりっぷす-01分 美女主播菲菲福利视频 小蛮腰xxmmyy 视频全集 avhome 黄瓜视频福利地址 狼人在线播放视频中文 韩国vip福利在线播放 大型AV 日韩高清av在线 亚洲 小明看看 神马电影dy888午夜4k4k 欧美色女郎 4438怎么播放不了 老鸭窝移动网站 天海翼秘密女捜査官协和影视 心心影院 福利 京香人妻动漫 驾照家教轮流操爆20女学生 av2017手机版天堂网在线观看 国产主播热舞4000部在线视频 强奸少妇 magnet xxx|4性交视频 秀美白脚趾视频 大香 蕉伊人免费视频 西西国模吧 波多野结衣d∨d在线中文亚洲无码无码视频 乡下小学女生的性生活视频 模特被扒光 在线视频 啪啪免费国产视频 男奴舔美女高跟鞋视频 走光偷拍青青草免费视频 77777电影院院 少妇白洁有声小说 大牛电影福利电影 高清无码偷拍磁力链接 下载 色一色午夜夫妻影院 兄妹激情 曰本阿V无码 2fc夜色猫视频在线观看 ee亲 a片mp4午夜影院 灰丝少妇zaixian 邪恶少漫画大全4399漫画集 日本综艺节目在线78看 无码潮吹电影影音先锋 在线影音 素人搭讪开房!性交偷拍流出影像 1能不能看一看A片 成人小视频免费试看 青娱乐视频极品视觉盛宴 英国色色 卵蛋网MIDE 国产3龙2凤群p直播视频 395UaGG 亚洲不卡视频大全 青青草欧美做爱视频 白丝袜萝莉足交 四虎影院aV在线20l8 jj无码激情视频播放 免费做爱云户作小视频 国产社区在线自拍视频 偷亚洲在线视频观看 淫妻艳姨 玩弄吃乳头视频 午夜月光影院黄片 中文字慕大香蕉免费视频 A4U官网 冲田杏梨影手机在线 javbbus 老司机成人网站4388 福利女同视频在线 美里有纱影音先锋漂亮女教师 男恩妃南非黑人同志在一起做爱的片子 黑木耳福利 富二代在线福利視频 拔插在线公开 午夜影院av神马影院 费的韩国伦理片 超碰青娱乐导航在线 AV天堂5018 km302c0m www++t828++win 偷拍走光成人 图片 好国产自拍 色色色天堂 午夜电影伦理人与动物 朝鲜高清在线色视频 足控电影有哪些 aikoiijima caoporn原纱央莉 岛国三级磁力链接 magnet 西野翔 夫目前犯 正在播放 白石茉莉奈免费观看 猫味网站 极品呦呦集合 jjzzz欧美 铃原爱蜜莉电影下载 ftp 上原亚衣av片 26uuu亚洲电影最新电影网站 小明看看正版 caopron\ 长梓泽免费视频 等一次玩这么会喷潮的女人视频 金荷娜丝袜视频 gav成人不用下载 六点成人 www3131dd 静香的欲望漫画 香港成人夜色影 ai宅男影院 色爱热 鲁鲁狠狠在线影院 saoyi8 国产自拍视频崛起 电车痴汉 立花瑠莉 福利视频偷拍 大啪噜 大肥女视频@StopFuck 东方va免费进入免费观看视频 粉嫩欧妹 大波妹 福利 国模 视频 在线 大香蕉在緌人妻 xsm 影音先锋 大香蕉草逼视频 动漫伦理 璃莎 yuoijzz日本在线播放 日本高清hav 日本嫩泬插ji 韩国少妇丰乳翘臀视频 女主播魔仙迅雷 超爽影园 桃花园宅男视频 九哥操逼以 邪恶影院黄色 日本交尾无码 磁力链 下载 久久自拍视频在线观看 欧美骚逼视频 我和阿姨乱伦视频 四虎0202 在线aⅴ福利网 av小学生黄片 雅情会首页在线 4438x全国最大成年 本库子 正在播放喉奥 女捜査官波多野结衣mp4 东方成人正确网站 五月樱桃唇bd 自拍透拍五月 闫凤娇全套无码magnet eeuss快播影院手机在线观看 欧美成人凹凸视频播放 小仓优子露私处视频 有色视频 大学情侣自拍视频在线 xlyy100 厕所自拍偷拍超碰 国产自拍精品黑丝 男女日bb的视频播放器 影音先锋主播勾引 神马影院欧美无码 青青草免费导航在线视频 看着我的女友变淫荡 mp4 狂欲a片 一本道色戒 wpvr-108 先锋影音 国产白领,迅雷 magnet 【国产】漂亮華裔小美眉白老外大長屌插嘴十幾分鐘 射的滿臉都是点击播放【巨乳,重 九尾狐狸m视频在线种子 56popoc0m 莉莉影院在线啪啪视频 桃大桥未久在线 中学生嗳嗳网站 我女朋友视频最新地址 欧美俱乐部的视频 人人曹b 大尺度av vvvv999 无码高清av 996re在线中国偷拍视频 久热 操逼人兽com 中文字幕女优磁性连接 www502rr,com 国产高清情吕视屏网 波野多结衣护士是什么名字 米奇影视777在线视频 国产骚妇卡戴珊视频在线 石榴社区先锋在线视频 国产98G奶 制服下的名器丁雪倩 无码轮奸BT magnet 磁力扒 涩涩的网址 sssXXX欧美 天天曹天天插天天摸 日本好色妻 强奸乱伦zaixianguankan 番号水杯里面下药 饭冈加纳子在线播放 赵得三日张爱玲 免費高清視頻一色佬 午夜呃福利 妹子bb超粉嫩,绝对是个极品逼 灌肠欧美在线观看 在线Av,41saO,COm Tom天堂 四房播播婷婷电影网 舔着空姐的小穴 嗯嗯香港毛片 大贯杏里AV资源 WWW,XXBBmon 美国艳星taya 在线视频 欧美电影 xart 啪啪啪电影漫画 ssni141在线 思妍白衣小仙女被邻居强上 用什么搜索草榴 大香蕉亚洲人妻小说 莉哥不雅视频 好屏日视频53sao com 尼可基德曼三级 弱气乙女网盘文件 av淘宝2o19淘你喜欢 布兰迪爱 美女主播和炮友啪啪直播对白清晰 线国产幼偷拍视频100 小早川怜子和江波亮在线观看 小萝莉影院福利 先锋视频玖资源站 性爱直播磁力链接 小明成人在线漫画观看 性感空姐啪啪啪 香i巷黄色片 香奈儿·普雷斯顿级网站 性交ⅩxⅩ视频 b站可可味成人在线视频 国产在线fenbaoyu 女人乳环阴蒂环强奸 月夜影院av 一级黄色大香蕉片 制服四虎 汤不热流出极品白肤美粉嫩逼逼小 三级片免播放器 gav 欧美日一本道 - 百度 - 百度 - 百度 - 百度 3344fmcom欧美电影 超碰任你干免费在线 老司机色播影院普通用户 汤姆影院tam四虎影库 魔鬼身材七尺爆乳又大又白 亚洲 偷拍99ses 小明首发看看 正在播放真实强奸 完整 毛片捆绑束缚视频 宫交h灌满浓精 juy707 magnet 日月影视啪啪啪 二级黄片在线播放 香港按摩高清手机视频直播 pandra迅雷 免费下载A片的链接 女优做爱动态 日韩A片高清视频 AK第一精品福利资源导航 美人女教师的诱惑授业魅惑性技-里美 黄页连接免费福利视频 无尽另类在线视频 国产啪啪爱爱在线小视频 乡村寻艳王upu av搜搜福利 激情综合 西瓜影音 6688新视觉影院 狼窝窝影院高清视频 立花美凉资源在线播放 擼擼色綜合 土库影院 日本三级av论里2017 爆米花网性交 草草青视频在线中文字幕 app 仓井空系列种子磁力链接 被鸡巴干到出水的视频 草裙影视草裙社区主论坛福利社区午夜福利福利视频微拍福利福利电影福利导 国外XXX免费直播 猜人游戏在线播放影院 国外服务器手机看大片58天 啵啵视院 videoboy按摩 luobiyouyou 色色发宗合香蕉网 黄色日本三级片播放 av午夜网站 陈冠希钟欣桐视频磁力 国产成人综合4438 susu85网站改成什么了 宇都宫紫苑 在线电影 大贯杏里KDG一020 程x大人 死侍2在线观看莉莉影院 羔羊医生 magnet AV番号电影网 欧美番号 欲望保姆 AV新加坡资源 红涛阁av影院 蝌蚪窝在线视频观看午夜剧场 蝌蚪窝被封 2乱色 人工智能ai迪丽热巴在线播放 vedios SOD时间禁止器 爆乳无码出中出 magnet va中文字幕高清无码 成人aⅤ影视 v2ba萌白酱 苍井空在线精品视频 wwse560info 成人黄色自拍啪啪网 超级对碰视频在线观看 插下面的在线视频 成年亚洲免费手机视频 v ip eeusssvv 69saocom 嗯嗯轻点视频 美女自卫在线视频手机视频 国模黎萍超大尺度私拍 飘香影阁 女人视频av 亲娱乐 男人裸体黄色一级 身材很棒的大奶主播漏奶漏逼自慰开车 熟女福利电影 日本无码成人电影一本道 qkonzr87936 日本女人,淫荡视频 张紫妍磁力 美女训恋足奴会所 颜射大奶在线播放 先锋影音北条麻妃 亚洲偷拍91风月 日本东方aⅴ 天天影视色最新一色 李毅啪啪啪视频 戏精刘婷 在线 九哥操逼丨ㄥ 绿茶福利视频导航在线观看 54jb 在线小女破处性视频 www19rt 女教师 仙桃tv 天堂鸟影院av动漫 午夜成人在线直播 magnet 网红啪啪啪视频大全 韩国激情主播 AV美女女优性感宝贝视频 强奸洛天依视频 18r在线影院 最懂男人影院啪啪 丝袜少妇3p在线视频 av黄片免费网站 一本到道视频 卖来的女人迅雷下载 mp4 高老庄影院在线视频 在线视频直播 中文无码色视频 操空姐网站在线 韩国美女主播杰西卡视频 用嘴就能让你爽 被窝电影网酒店偷拍 肏我在线播放 波多野结衣丝袜福利视频 国产自拍女上位 苍井宫无码电影 韩国极品情侣家中 操逼爱奇艺 百度男人综合vA 色宗一本道 aotushipinzaixianguankan 狠狠胔大香蕉视频 午夜快成播 依依在线Aⅴ 情龟电影 闪电奇迹裸体 先锋国内口爆 范群侦上司 sex love ooxx 免费成人斤 九州AV免费成人 UUZIYUANWANG 播色屋a v久久 国语黄片a片 wwwchc2017av 牛牛免费视7755com 【开心五月】,深爱五月,大色窝,丁香五月,五月婷婷 立足于美利坚合众国鲁 外国兽交视频 董美香无码链接 magnet jiuboyinyuan 董美香在线中文字幕 日韩福利盒子拍拍拍 做爱无码磁力链接 mp4 无码区成人在线视频 啪啪秀自拍 A片 午夜影院 696人体 日韩新葡萄金无码视频 把96年白嫩美臀小情人带到宾馆肆意蹂躏穿衣服照样操 日本毛片一本道 视频 日本黄色群 激情邪恶大香蕉 伊人久久五十路 大桥未久 耻辱中出授业 三级香片 网红原味小辣椒VIP视频 www774jj 美脚をしゃぶり尽くす~ 梨花在线播放 色狼窝视频 色巨乳国产在线 强奸内射 在线观看 秋霞在线新纶 鸡鸡插bb的视频 极品网红女喝高了和粉丝啪啪 极品外围女模特拍摄时被2个摄影师勾引疯狂操 井上瞳在线播放 强吻小视频软件不用下载在线观看 三百元的性交动画 无码在线偷拍 四虎视频在线澳门皇冠 日本一级A片做爱片 足交鸣人漫画 3d里番动漫链接 小岛南ZAIXIAN 主播裸聊迅雷无码种子 8k 厄运小姐 免免福利视频 思思操干 神马影院1000合集 国产SM精品白富美富姐浴室玩弄漂亮女奴 伦奸学园磁力链接迅雷下载 magnet 绿巨人》AV版 正在草她老公打电话来一边草一边打 51pao 男人日女逼只流水 抠逼萝莉 欧美肥胖学生性交视频 好了Av成人免费视频 花果山福利视频区 碰碰播放器 女人屋福利视频免 花花公子在线视频 黄片国产免费的完整 黄色老人强奸美女抽插美女 欧美?iαeosαsexo孕妇 朋友推荐县城保健会所新来的小媚技术不错要提前几天才能预约到720p高清 梓由衣在线观看, 9200dy 日本最骚的波多野结衣 网友最新自拍在线狗添水 视频 日本一本道日韩欧 www92kkdycon 日本第一福利影院 曰本A片 日本福利影院500 先是激烈后是呆萌 迷恋为所欲为,看点很多。 非洲成年a片 俺去啦视频最新官网 酒井千波肛交 heshenshenzuoai 漏点福利视频 中川美铃在线伦理 孕妇番号 ftp 婷婷深爱五月视频在线观看 vk视频 骑女马 真崎航番号 色色免费在线综合视频 亚洲禽流氓冒险与绫 人人澡夜夜澡 AV高清AV天堂 今日新鲜事片毛片 长泽梓吃粪 完熟 av 卵蛋芽森滴 gvg 326在线观看 星球大战h剧场 麻仓优在线观看奇特影院 怡红院一大香蕉猫视频 红怡阁h jjzzkk 欲火难耐电影琪琪影院手机在线观看 日本av韩国av 种子A片 mvsd291樱木优希音在线 euss电影天堂2012 4438咱们看不了 9988xxav 白白色小明看看成人 情趣制服无码 mp4 偷拍视频毛片 无码插逼视频 色屌丝 欧美 视频 天天曰天天看操逼 熟妇乱伦在线播放 外交部长的娇妻的电影 soe878 亚洲一本道免费观看看 一本道第1页 在线人人妻福利免费视频播放 好看的亚洲无码。 伦理片福利国产短片 动漫啪啪网 国产自拍17啪啪啪 韩国盗窃撮全集视频 尼姑吧福利影视 尼玛影院伦理我不卡 男人桶女人阴口视频 国模王芳人体艺术套图 男女勃起抽插拔射视频 国内美女直播福利 国外无码ay免费视频 k8伦理剧情 男主拿鱼打女主,高宝宝 gvg448中文字幕 草榴影院 西瓜影音 澳门自拍偷拍视频 模特大尺度高清视频 香港伦理片抓色狼 not far 宅男免费福利视屏网址 另类综合性 日本性爱BBB视频 超碰人妻做爱视频 欧美激情另类重口 国产情侣激情视频自拍 丝袜美脚影视影院 84porn在线 黄图视屏高清免费观看网址 宫部凉花 福利 日本一本道在线无行v 成年区在线电影 wwwxo8xo8 初川南个人资源 自拍网5x社会最新 手机五月丁人网 a阿vvt天堂2014在线 tubicao 蓝尺润在线 妹纸你拍就拍被搞得跟贞子一样吓人 一本道久久日本视频v 动漫无码伦理片在线观看 四虎 小穴 日日批视频免费播放器收看 自拍视频内射 女明星漏三点视频磁力 性爱 在线视频 西西里高清模特艺术图 l撸就色 狂操护士15p 把鸡巴插入妈妈的阴道 草漂亮熟女 丁香五月色洛洛中文网 苏琪的人体写真 自拍老妇女操逼视频性爱 刘可颖被老外干快播截图 性感裸体美女性交图 撸撸色涩 苍井空湖南 插死骚屄妈妈 肏婶骚屄 迅雷在线草裙 短片无码mp4 黄色三级小说 人体艺术韩国高中女生 韩国比较色的剧 人妻色插 五月天电影人与狗 美女么自己鸡巴 日韩女优丝袜自卫 666大胆人体艺术 撸撸色色屄 农村骚丈母娘小说 88uuu影qvcd 东莞图片大合集下载 五月天婷婷快播 亚洲熟女淫色图 人体艺术波谷绘狗 少妇嫩逼性交图片 鼎美女朴妮唛狠狠插 跟老妈玩足交 极品白富美爆操15p 日幼发育12p 日日来插逼 想和你上床三邦车视 人体艺术电影在线看 淫荡乱季 大姨和妈妈乱交