Sql Oracle:优化日期和时间条件,TRUNC和TO_CHAR花费的时间太长
我有一个sql语句,它太长了。Sql Oracle:优化日期和时间条件,TRUNC和TO_CHAR花费的时间太长,sql,oracle,date,time,to-char,Sql,Oracle,Date,Time,To Char,我有一个sql语句,它太长了。 所以我最近一直在深入研究,发现问题出在日期类型的单个列上 这是第一句话的缩影: SELECT --needed values -- FROM X_Product pr INNER JOIN Z_COST co ON co.x_product_id = pr.x_product_id WHERE pr.isValid = 'Y' AND TRUNC(sysdate, 'MM') - 1 = co.dateto; 使用这组where条件,原始(长语句)运行
所以我最近一直在深入研究,发现问题出在日期类型的单个列上
这是第一句话的缩影:
SELECT
--needed values --
FROM X_Product pr
INNER JOIN Z_COST co ON co.x_product_id = pr.x_product_id
WHERE pr.isValid = 'Y'
AND TRUNC(sysdate, 'MM') - 1 = co.dateto;
使用这组where条件,原始(长语句)运行大约需要37秒。
当我删除最后一个条件时,我们得到:
SELECT
--needed values --
FROM X_Product pr
INNER JOIN Z_COST co ON co.x_product_id = pr.x_product_id
WHERE pr.isValid = 'Y';
只需2秒钟。
我尝试使用不同类型的函数来表示字符,只得到月份,我尝试将“TRUNC(sysdate,'MM')-1”和“co.dateto”添加到选择中,然后在另一个选择中验证它们是否相等。
我在列上创建了索引,也在列上的函数上创建了索引。
但这总是需要很长时间。
所以我的想法越来越少了,似乎找不到其他方法。 谢谢你的帮助。
编辑:
完整查询:(一个很长的lol)
它的解释计划是:
计划哈希值:1172089290
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 364M| 101G| | 5950K (1)| 19:50:06 |
| 1 | SORT AGGREGATE | | 1 | 24 | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID | M_PRODUCTLOCATOR | 1 | 24 | | 3 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | FK915_16182 | 2 | | | 1 (0)| 00:00:01 |
|* 4 | HASH JOIN RIGHT OUTER | | 364M| 101G| | 5950K (1)| 19:50:06 |
| 5 | TABLE ACCESS FULL | Z_COSTING_CALCUL | 535 | 6420 | | 6 (0)| 00:00:01 |
|* 6 | HASH JOIN RIGHT OUTER | | 364M| 97G| 45M| 5948K (1)| 19:49:45 |
|* 7 | TABLE ACCESS FULL | M_PRODUCT_PO | 1483K| 28M| | 7707 (1)| 00:01:33 |
|* 8 | VIEW | | 364M| 90G| | 1114K (2)| 03:42:52 |
|* 9 | HASH JOIN | | 364M| 64G| | 1114K (2)| 03:42:52 |
| 10 | TABLE ACCESS FULL | M_PRODUCT_CATEGORY | 1957 | 76323 | | 29 (0)| 00:00:01 |
|* 11 | HASH JOIN OUTER | | 364M| 51G| 139M| 1112K (1)| 03:42:31 |
|* 12 | HASH JOIN | | 986K| 127M| | 57859 (1)| 00:11:35 |
| 13 | VIEW | index$_join$_009 | 20 | 240 | | 3 (34)| 00:00:01 |
|* 14 | HASH JOIN | | | | | | |
|* 15 | INDEX FAST FULL SCAN | FK265_14205 | 20 | 240 | | 1 (0)| 00:00:01 |
| 16 | INDEX FAST FULL SCAN | PK265 | 20 | 240 | | 1 (0)| 00:00:01 |
|* 17 | HASH JOIN | | 1281K| 151M| | 57849 (1)| 00:11:35 |
| 18 | INDEX FULL SCAN | Z_WAREHOUSE_10 | 291 | 3492 | | 1 (0)| 00:00:01 |
|* 19 | HASH JOIN | | 1281K| 136M| | 57842 (1)| 00:11:35 |
| 20 | INDEX FULL SCAN | Z_LOCATOR_30 | 283 | 3396 | | 1 (0)| 00:00:01 |
|* 21 | HASH JOIN | | 1291K| 123M| 46M| 57834 (1)| 00:11:35 |
| 22 | VIEW | M_STORAGE_V | 1291K| 32M| | 41216 (1)| 00:08:15 |
| 23 | HASH GROUP BY | | 1291K| 91M| 104M| 41216 (1)| 00:08:15 |
|* 24 | HASH JOIN | | 1291K| 91M| | 18710 (1)| 00:03:45 |
| 25 | VIEW | index$_join$_020 | 283 | 3396 | | 3 (34)| 00:00:01 |
|* 26 | HASH JOIN | | | | | | |
| 27 | INDEX FAST FULL SCAN| FK207_1390 | 283 | 3396 | | 1 (0)| 00:00:01 |
| 28 | INDEX FAST FULL SCAN| PK207 | 283 | 3396 | | 1 (0)| 00:00:01 |
|* 29 | HASH JOIN RIGHT OUTER | | 1301K| 76M| 33M| 18701 (1)| 00:03:45 |
| 30 | TABLE ACCESS FULL | M_PRODUCT | 679K| 25M| | 11466 (1)| 00:02:18 |
| 31 | TABLE ACCESS FULL | M_STORAGEDETAIL | 1301K| 27M| | 3453 (1)| 00:00:42 |
| 32 | TABLE ACCESS FULL | M_PRODUCT | 679K| 47M| | 11514 (1)| 00:02:19 |
| 33 | TABLE ACCESS FULL | Z_COSTING_PRODUCT | 251M| 3598M| | 723K (2)| 02:24:46 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("MPL"."AD_ORG_ID"=:B1)
3 - access("MPL"."M_PRODUCT_ID"=:B1)
4 - access("CC"."C_ACCTSCHEMA_ID"(+)="ACSCH"."C_ACCTSCHEMA_ID" AND
"CC"."Z_COSTING_CALCUL_ID"(+)="MC"."Z_COSTING_CALCUL_ID")
6 - access("PO"."AD_ORG_ID"(+)="from$_subquery$_014"."QCSJ_C000000000800003" AND
"PO"."M_PRODUCT_ID"(+)="from$_subquery$_014"."QCSJ_C000000000400008")
7 - filter("PO"."ISCURRENTVENDOR"(+)='Y')
8 - filter("WINF_GETPRODUCT_STOCK"("from$_subquery$_014"."QCSJ_C000000000400008","from$_subquery$_014"
."QCSJ_C000000000800007")<>0)
9 - access("MPC"."M_PRODUCT_CATEGORY_ID"="MP"."M_PRODUCT_CATEGORY_ID")
11 - access("MC"."M_PRODUCT_ID"(+)="MP"."M_PRODUCT_ID")
12 - access("ACSCH"."AD_ORGONLY_ID"="W"."AD_ORG_ID")
14 - access(ROWID=ROWID)
15 - filter("ACSCH"."AD_ORGONLY_ID" IS NOT NULL)
17 - access("W"."M_WAREHOUSE_ID"="L"."M_WAREHOUSE_ID")
19 - access("L"."M_LOCATOR_ID"="S"."M_LOCATOR_ID")
21 - access("MP"."M_PRODUCT_ID"="S"."M_PRODUCT_ID")
24 - access("L"."M_LOCATOR_ID"="ST"."M_LOCATOR_ID")
26 - access(ROWID=ROWID)
29 - access("P"."M_PRODUCT_ID"(+)="ST"."M_PRODUCT_ID")
-----------------------------------------------------------------------------------------------------------------
|Id |操作|名称|行|字节|临时SPC |成本(%CPU)|时间|
-----------------------------------------------------------------------------------------------------------------
|0 | SELECT语句| 364M | 101G | 5950K(1)| 19:50:06|
|1 |对骨料进行排序| | 1 | 24 | ||
|*2 |按索引ROWID访问表| M|U PRODUCTLOCATOR | 1 | 24 | 3(0)| 00:00:01|
|*3 |索引范围扫描| FK915 | U 16182 | 2 | | | 1(0)| 00:00:01|
|*4 | HASH JOIN RIGHT OUTER | 364M | 101G | 5950K(1)| 19:50:06|
|5 |表格访问完整| Z|u成本计算| 535 | 6420 | 6(0)| 00:00:01|
|*6 | HASH JOIN RIGHT OUTER | 364M | 97G | 45M | 5948K(1)| 19:49:45|
|*7 |表访问完整| M| U产品| U PO | 1483K | 28M | 7707(1)| 00:01:33|
|*8 |视图| 364M | 90G | 1114K(2)| 03:42:52|
|*9 | HASH JOIN | 364M | 64G | 1114K(2)| 03:42:52|
|10 |表格访问完整| M| U产品| U类别| 1957 | 76323 | 29(0)| 00:00:01|
|*11 | HASH JOIN OUTER | 364M | 51G | 139M | 1112K(1)| 03:42:31|
|*12 | HASH JOIN | 986K | 127M | 57859(1)| 00:11:35|
|13 |查看|索引|加入| 009 | 20 | 240 | 3(34)| 00:00:01|
|*14 |散列连接| | | | | ||
|*15 |索引快速全扫描| FK265 | U 14205 | 20 | 240 | 1(0)| 00:00:01|
|16 |索引快速全扫描| PK265 | 20 | 240 | 1(0)| 00:00:01|
|*17 | HASH JOIN | 1281K | 151M | 57849(1)| 00:11:35|
|18 |索引完全扫描| Z|U仓库| 10 | 291 | 3492 | 1(0)| 00:00:01|
|*19 |散列连接| 1281K | 136M | 57842(1)| 00:11:35|
|20 |索引全扫描| Z|U定位器| 30 | 283 | 3396 | 1(0)| 00:00:01|
|*21 | HASH JOIN | 1291K | 123M | 46M | 57834(1)00:11:35|
|22 |查看| M| U存储| V | 1291K | 32M | 41216(1)| 00:08:15|
|23 | HASH GROUP BY | | | 1291K | 91M | 104M | 41216(1)| 00:08:15|
|*24 | HASH JOIN | | 1291K | 91M | | | 18710(1)| 00:03:45|
|25 |查看|索引|加入| 020 | 283 | 3396 | 3(34)| 00:00:01|
|*26 |散列连接| | | | | ||
|27 |索引快速全扫描| FK207|U 1390 | 283 | 3396 | 1(0)| 00:00:01|
|28 |索引快速全扫描| PK207 | 283 | 3396 | 1(0)| 00:00:01|
|*29 |散列连接右外| 1301K | 76M | 33M | 18701(1)| 00:03:45|
|30 |表访问完整| M| U产品| 679K | 25M | 11466(1)| 00:02:18|
|31 |表访问完整| M| U存储详细信息| 1301K | 27M | 3453(1)| 00:00:42|
|32 |表访问完整| M| U产品| 679K | 47M | 11514(1)| 00:02:19|
|33 |表格访问完整| Z|成本核算|产品| 251M | 3598M | 723K(2)| 02:24:46|
-----------------------------------------------------------------------------------------------------------------
谓词信息(由操作id标识):
---------------------------------------------------
2-过滤器(“MPL”。“广告组织ID”=:B1)
3-访问(“MPL”。“M_产品ID”=:B1)
4-访问(“CC”。“C_ACCTSHEMA_ID”(+)=“ACSCH”。“C_ACCTSHEMA_ID”和
“CC.“Z_成本计算ID”(+)=“MC.“Z_成本计算ID”)
6-从$\u子查询$\u 014.“QCSJ\u C00000”中访问(“PO”。“AD\u组织ID”(+)=”
Plan hash value: 2645911395
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5786K| 1743M| | 1210K (2)| 04:02:04 |
| 1 | SORT AGGREGATE | | 1 | 24 | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID | M_PRODUCTLOCATOR | 1 | 24 | | 3 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | FK915_16182 | 2 | | | 1 (0)| 00:00:01 |
|* 4 | HASH JOIN RIGHT OUTER | | 5786K| 1743M| 45M| 1210K (2)| 04:02:04 |
|* 5 | TABLE ACCESS FULL | M_PRODUCT_PO | 1483K| 28M| | 7707 (1)| 00:01:33 |
|* 6 | HASH JOIN | | 5786K| 1633M| | 1116K (2)| 03:43:13 |
| 7 | TABLE ACCESS BY INDEX ROWID | Z_COSTING_CALCUL | 9 | 252 | | 4 (0)| 00:00:01 |
|* 8 | INDEX SKIP SCAN | Z_COSTING_CALCUL_DATETO | 1 | | | 3 (0)| 00:00:01 |
|* 9 | VIEW | | 364M| 90G| | 1114K (2)| 03:42:52 |
|* 10 | HASH JOIN | | 364M| 64G| | 1114K (2)| 03:42:52 |
| 11 | TABLE ACCESS FULL | M_PRODUCT_CATEGORY | 1957 | 76323 | | 29 (0)| 00:00:01 |
|* 12 | HASH JOIN OUTER | | 364M| 51G| 139M| 1112K (1)| 03:42:31 |
|* 13 | HASH JOIN | | 986K| 127M| | 57859 (1)| 00:11:35 |
| 14 | VIEW | index$_join$_009 | 20 | 240 | | 3 (34)| 00:00:01 |
|* 15 | HASH JOIN | | | | | | |
|* 16 | INDEX FAST FULL SCAN | FK265_14205 | 20 | 240 | | 1 (0)| 00:00:01 |
| 17 | INDEX FAST FULL SCAN | PK265 | 20 | 240 | | 1 (0)| 00:00:01 |
|* 18 | HASH JOIN | | 1281K| 151M| | 57849 (1)| 00:11:35 |
| 19 | INDEX FULL SCAN | Z_WAREHOUSE_10 | 291 | 3492 | | 1 (0)| 00:00:01 |
|* 20 | HASH JOIN | | 1281K| 136M| | 57842 (1)| 00:11:35 |
| 21 | INDEX FULL SCAN | Z_LOCATOR_30 | 283 | 3396 | | 1 (0)| 00:00:01 |
|* 22 | HASH JOIN | | 1291K| 123M| 46M| 57834 (1)| 00:11:35 |
| 23 | VIEW | M_STORAGE_V | 1291K| 32M| | 41216 (1)| 00:08:15 |
| 24 | HASH GROUP BY | | 1291K| 91M| 104M| 41216 (1)| 00:08:15 |
|* 25 | HASH JOIN | | 1291K| 91M| | 18710 (1)| 00:03:45 |
| 26 | VIEW | index$_join$_020 | 283 | 3396 | | 3 (34)| 00:00:01 |
|* 27 | HASH JOIN | | | | | | |
| 28 | INDEX FAST FULL SCAN| FK207_1390 | 283 | 3396 | | 1 (0)| 00:00:01 |
| 29 | INDEX FAST FULL SCAN| PK207 | 283 | 3396 | | 1 (0)| 00:00:01 |
|* 30 | HASH JOIN RIGHT OUTER | | 1301K| 76M| 33M| 18701 (1)| 00:03:45 |
| 31 | TABLE ACCESS FULL | M_PRODUCT | 679K| 25M| | 11466 (1)| 00:02:18 |
| 32 | TABLE ACCESS FULL | M_STORAGEDETAIL | 1301K| 27M| | 3453 (1)| 00:00:42 |
| 33 | TABLE ACCESS FULL | M_PRODUCT | 679K| 47M| | 11514 (1)| 00:02:19 |
| 34 | TABLE ACCESS FULL | Z_COSTING_PRODUCT | 251M| 3598M| | 723K (2)| 02:24:46 |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("MPL"."AD_ORG_ID"=:B1)
3 - access("MPL"."M_PRODUCT_ID"=:B1)
4 - access("PO"."AD_ORG_ID"(+)="from$_subquery$_014"."QCSJ_C000000000800003" AND
"PO"."M_PRODUCT_ID"(+)="from$_subquery$_014"."QCSJ_C000000000400008")
5 - filter("PO"."ISCURRENTVENDOR"(+)='Y')
6 - access("CC"."C_ACCTSCHEMA_ID"="ACSCH"."C_ACCTSCHEMA_ID" AND
"CC"."Z_COSTING_CALCUL_ID"="MC"."Z_COSTING_CALCUL_ID")
8 - access("CC"."DATETO"=TRUNC(SYSDATE@!,'fmmm')-1)
filter("CC"."DATETO"=TRUNC(SYSDATE@!,'fmmm')-1 AND
TRUNC(INTERNAL_FUNCTION("DATETO"),'fmmm')=TRUNC(TRUNC(SYSDATE@!,'fmmm')-1,'fmmm'))
9 - filter("WINF_GETPRODUCT_STOCK"("from$_subquery$_014"."QCSJ_C000000000400008","from$_subquery$_014"."QCS
J_C000000000800007")<>0)
10 - access("MPC"."M_PRODUCT_CATEGORY_ID"="MP"."M_PRODUCT_CATEGORY_ID")
12 - access("MC"."M_PRODUCT_ID"(+)="MP"."M_PRODUCT_ID")
13 - access("ACSCH"."AD_ORGONLY_ID"="W"."AD_ORG_ID")
15 - access(ROWID=ROWID)
16 - filter("ACSCH"."AD_ORGONLY_ID" IS NOT NULL)
18 - access("W"."M_WAREHOUSE_ID"="L"."M_WAREHOUSE_ID")
20 - access("L"."M_LOCATOR_ID"="S"."M_LOCATOR_ID")
22 - access("MP"."M_PRODUCT_ID"="S"."M_PRODUCT_ID")
25 - access("L"."M_LOCATOR_ID"="ST"."M_LOCATOR_ID")
27 - access(ROWID=ROWID)
30 - access("P"."M_PRODUCT_ID"(+)="ST"."M_PRODUCT_ID")
AND TRUNC(sysdate, 'MM') - 1 = cc.dateto;
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 364M| 101G| | 5950K (1)| 19:50:06 |
| 1 | SORT AGGREGATE | | 1 | 24 | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID | M_PRODUCTLOCATOR | 1 | 24 | | 3 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | FK915_16182 | 2 | | | 1 (0)| 00:00:01 |
|* 4 | HASH JOIN RIGHT OUTER | | 364M| 101G| | 5950K (1)| 19:50:06 |
| 5 | TABLE ACCESS FULL | Z_COSTING_CALCUL | 535 | 6420 | | 6 (0)| 00:00:01 |
|* 6 | HASH JOIN RIGHT OUTER | | 364M| 97G| 45M| 5948K (1)| 19:49:45 |
|* 7 | TABLE ACCESS FULL | M_PRODUCT_PO | 1483K| 28M| | 7707 (1)| 00:01:33 |
|* 8 | VIEW | | 364M| 90G| | 1114K (2)| 03:42:52 |
|* 9 | HASH JOIN | | 364M| 64G| | 1114K (2)| 03:42:52 |
| 10 | TABLE ACCESS FULL | M_PRODUCT_CATEGORY | 1957 | 76323 | | 29 (0)| 00:00:01 |
|* 11 | HASH JOIN OUTER | | 364M| 51G| 139M| 1112K (1)| 03:42:31 |
|* 12 | HASH JOIN | | 986K| 127M| | 57859 (1)| 00:11:35 |
| 13 | VIEW | index$_join$_009 | 20 | 240 | | 3 (34)| 00:00:01 |
|* 14 | HASH JOIN | | | | | | |
|* 15 | INDEX FAST FULL SCAN | FK265_14205 | 20 | 240 | | 1 (0)| 00:00:01 |
| 16 | INDEX FAST FULL SCAN | PK265 | 20 | 240 | | 1 (0)| 00:00:01 |
|* 17 | HASH JOIN | | 1281K| 151M| | 57849 (1)| 00:11:35 |
| 18 | INDEX FULL SCAN | Z_WAREHOUSE_10 | 291 | 3492 | | 1 (0)| 00:00:01 |
|* 19 | HASH JOIN | | 1281K| 136M| | 57842 (1)| 00:11:35 |
| 20 | INDEX FULL SCAN | Z_LOCATOR_30 | 283 | 3396 | | 1 (0)| 00:00:01 |
|* 21 | HASH JOIN | | 1291K| 123M| 46M| 57834 (1)| 00:11:35 |
| 22 | VIEW | M_STORAGE_V | 1291K| 32M| | 41216 (1)| 00:08:15 |
| 23 | HASH GROUP BY | | 1291K| 91M| 104M| 41216 (1)| 00:08:15 |
|* 24 | HASH JOIN | | 1291K| 91M| | 18710 (1)| 00:03:45 |
| 25 | VIEW | index$_join$_020 | 283 | 3396 | | 3 (34)| 00:00:01 |
|* 26 | HASH JOIN | | | | | | |
| 27 | INDEX FAST FULL SCAN| FK207_1390 | 283 | 3396 | | 1 (0)| 00:00:01 |
| 28 | INDEX FAST FULL SCAN| PK207 | 283 | 3396 | | 1 (0)| 00:00:01 |
|* 29 | HASH JOIN RIGHT OUTER | | 1301K| 76M| 33M| 18701 (1)| 00:03:45 |
| 30 | TABLE ACCESS FULL | M_PRODUCT | 679K| 25M| | 11466 (1)| 00:02:18 |
| 31 | TABLE ACCESS FULL | M_STORAGEDETAIL | 1301K| 27M| | 3453 (1)| 00:00:42 |
| 32 | TABLE ACCESS FULL | M_PRODUCT | 679K| 47M| | 11514 (1)| 00:02:19 |
| 33 | TABLE ACCESS FULL | Z_COSTING_PRODUCT | 251M| 3598M| | 723K (2)| 02:24:46 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("MPL"."AD_ORG_ID"=:B1)
3 - access("MPL"."M_PRODUCT_ID"=:B1)
4 - access("CC"."C_ACCTSCHEMA_ID"(+)="ACSCH"."C_ACCTSCHEMA_ID" AND
"CC"."Z_COSTING_CALCUL_ID"(+)="MC"."Z_COSTING_CALCUL_ID")
6 - access("PO"."AD_ORG_ID"(+)="from$_subquery$_014"."QCSJ_C000000000800003" AND
"PO"."M_PRODUCT_ID"(+)="from$_subquery$_014"."QCSJ_C000000000400008")
7 - filter("PO"."ISCURRENTVENDOR"(+)='Y')
8 - filter("WINF_GETPRODUCT_STOCK"("from$_subquery$_014"."QCSJ_C000000000400008","from$_subquery$_014"
."QCSJ_C000000000800007")<>0)
9 - access("MPC"."M_PRODUCT_CATEGORY_ID"="MP"."M_PRODUCT_CATEGORY_ID")
11 - access("MC"."M_PRODUCT_ID"(+)="MP"."M_PRODUCT_ID")
12 - access("ACSCH"."AD_ORGONLY_ID"="W"."AD_ORG_ID")
14 - access(ROWID=ROWID)
15 - filter("ACSCH"."AD_ORGONLY_ID" IS NOT NULL)
17 - access("W"."M_WAREHOUSE_ID"="L"."M_WAREHOUSE_ID")
19 - access("L"."M_LOCATOR_ID"="S"."M_LOCATOR_ID")
21 - access("MP"."M_PRODUCT_ID"="S"."M_PRODUCT_ID")
24 - access("L"."M_LOCATOR_ID"="ST"."M_LOCATOR_ID")
26 - access(ROWID=ROWID)
29 - access("P"."M_PRODUCT_ID"(+)="ST"."M_PRODUCT_ID")