- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有不同子句的查询:
SELECT -- /*+ first_rows */
distinct a.sub_id, b.status,
pkg_sp_subbrief.get_sub_typ (a.sub_id) sub_type,
c.svc_provider_nm, fn_sp_get_svc_plan (a.sub_id) svc_plan,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'contact.name.salutation'
) salutation,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'first_name'
) first_name,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'contact.name.middle'
) middle_name,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'last_name'
) last_name,
pkg_sp_subbrief.get_sub_parm (a.sub_id, 'company_name') company_name,
pkg_sp_subbrief.get_sub_parm (a.sub_id, 'itc_account') itc_accout,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'phones.home.number'
) phone_number,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'address_1'
) addr_home_address,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'city'
) addr_home_city,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'prov'
) addr_home_prov,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'postal_cd'
) addr_home_postal_code,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'country'
) addr_home_country,
e.val cm_mta_mac, ' ' telephone_number,
pkg_sp_subbrief.get_subsvc_parm_first (a.sub_id,
3374
) alpha_tag,
NVL (j.voipdn1, ' ') voip_dn1,
NVL (j.mtavoiceport, ' ') mta_voice_port
FROM svc_provider c,
ref_status b,
sub a,
sub_svc d,
sub_svc_parm e,
(SELECT f.sub_id, g.val voipdn1, i.val mtavoiceport
FROM sub_svc f, sub_svc_parm g, sub_svc_parm i
WHERE f.svc_id = SvcId('smp_dial_tone_access')
AND f.sub_svc_status_id ! = 29
AND f.sub_svc_id = g.sub_svc_id
AND g.parm_id = get_cgo_parm_id('voip_dn1', GET_CLASS_ID('SubSvcSpec'), SvcID('smp_dial_tone_access'))
AND f.sub_svc_id = i.sub_svc_id
AND i.parm_id = 20410) j
WHERE a.svc_provider_id = c.svc_provider_id
AND a.sub_status_id = b.status_id
AND a.sub_id = d.sub_id
AND d.sub_svc_id = e.sub_svc_id
AND (e.parm_id = 1254 OR e.parm_id = 20249)
AND d.sub_svc_status_id != 29
AND a.sub_status_id != 9
AND a.sub_id = j.sub_id(+);
此查询返回 10,146 行,执行时间将近 135 秒
对此的解释计划是:
Execution Plan
----------------------------------------------------------
Plan hash value: 2622307916
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10409 | 1118K| | 2540 (4)| 00:00:31 |
| 1 | HASH UNIQUE | | 10409 | 1118K| 1240K| 2540 (4)| 00:00:31 |
|* 2 | HASH JOIN RIGHT OUTER | | 10409 | 1118K| | 2279 (4)| 00:00:28 |
| 3 | VIEW | | 899 | 23374 | | 1340 (6)| 00:00:17 |
|* 4 | HASH JOIN | | 899 | 53940 | | 1340 (6)| 00:00:17 |
|* 5 | HASH JOIN | | 885 | 35400 | | 918 (8)| 00:00:12 |
|* 6 | TABLE ACCESS BY INDEX ROWID| SUB_SVC | 877 | 17540 | | 434 (0)| 00:00:06 |
|* 7 | INDEX RANGE SCAN | SUB_SVC_IX2 | 951 | | | 3 (0)| 00:00:01 |
|* 8 | TABLE ACCESS FULL | SUB_SVC_PARM | 1770 | 35400 | | 483 (14)| 00:00:06 |
|* 9 | TABLE ACCESS FULL | SUB_SVC_PARM | 2632 | 52640 | | 422 (2)| 00:00:06 |
|* 10 | HASH JOIN | | 10409 | 853K| | 939 (2)| 00:00:12 |
|* 11 | TABLE ACCESS FULL | REF_STATUS | 95 | 2280 | | 3 (0)| 00:00:01 |
|* 12 | HASH JOIN | | 10409 | 609K| | 935 (2)| 00:00:12 |
| 13 | VIEW | index$_join$_001 | 49 | 588 | | 3 (34)| 00:00:01 |
|* 14 | HASH JOIN | | | | | | |
| 15 | INDEX FAST FULL SCAN | SVC_PROVIDER_PK | 49 | 588 | | 1 (0)| 00:00:01 |
| 16 | INDEX FAST FULL SCAN | SVC_PROVIDER_UK1 | 49 | 588 | | 1 (0)| 00:00:01 |
|* 17 | HASH JOIN | | 10409 | 487K| | 932 (2)| 00:00:12 |
|* 18 | TABLE ACCESS FULL | SUB | 8777 | 111K| | 53 (0)| 00:00:01 |
|* 19 | HASH JOIN | | 10607 | 362K| | 878 (2)| 00:00:11 |
|* 20 | TABLE ACCESS FULL | SUB_SVC_PARM | 10607 | 207K| | 423 (2)| 00:00:06 |
|* 21 | TABLE ACCESS FULL | SUB_SVC | 90284 | 1322K| | 454 (1)| 00:00:06 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."SUB_ID"="J"."SUB_ID"(+))
4 - access("F"."SUB_SVC_ID"="I"."SUB_SVC_ID")
5 - access("F"."SUB_SVC_ID"="G"."SUB_SVC_ID")
6 - filter("F"."SUB_SVC_STATUS_ID"<>29)
7 - access("F"."SVC_ID"="SVCID"('smp_dial_tone_access'))
8 - filter("G"."PARM_ID"="GET_CGO_PARM_ID"('voip_dn1',"GET_CLASS_ID" ('SubSvcSpec'),"SVCID"('smp_dial_tone_access')))
9 - filter("I"."PARM_ID"=20410)
10 - access("A"."SUB_STATUS_ID"="B"."STATUS_ID")
11 - filter("B"."STATUS_ID"<>9)
12 - access("A"."SVC_PROVIDER_ID"="C"."SVC_PROVIDER_ID")
14 - access(ROWID=ROWID)
17 - access("A"."SUB_ID"="D"."SUB_ID")
18 - filter("A"."SUB_STATUS_ID"<>9)
19 - access("D"."SUB_SVC_ID"="E"."SUB_SVC_ID")
20 - filter("E"."PARM_ID"=1254 OR "E"."PARM_ID"=20249)
21 - filter("D"."SUB_SVC_STATUS_ID"<>29)
Statistics
----------------------------------------------------------
470461 recursive calls
0 db block gets
13591783 consistent gets
0 physical reads
0 redo size
1272441 bytes sent via SQL*Net to client
7960 bytes received via SQL*Net from client
678 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10146 rows processed
当我从查询中删除 distinct 子句时,它会在 4 秒内执行但查询返回 10163 行,这意味着它也返回重复的行。
这是没有distinct子句的执行计划:
Execution Plan
----------------------------------------------------------
Plan hash value: 3514824003
---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10409 | 3608K| 2279 (4)| 00:00:28 |
|* 1 | HASH JOIN RIGHT OUTER | | 10409 | 3608K| 2279 (4)| 00:00:28 |
| 2 | VIEW | | 899 | 237K| 1340 (6)| 00:00:17 |
|* 3 | HASH JOIN | | 899 | 53940 | 1340 (6)| 00:00:17 |
|* 4 | HASH JOIN | | 885 | 35400 | 918 (8)| 00:00:12 |
|* 5 | TABLE ACCESS BY INDEX ROWID| SUB_SVC | 877 | 17540 | 434 (0)| 00:00:06 |
|* 6 | INDEX RANGE SCAN | SUB_SVC_IX2 | 951 | | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS FULL | SUB_SVC_PARM | 1770 | 35400 | 483 (14)| 00:00:06 |
|* 8 | TABLE ACCESS FULL | SUB_SVC_PARM | 2632 | 52640 | 422 (2)| 00:00:06 |
|* 9 | HASH JOIN | | 10409 | 853K| 939 (2)| 00:00:12 |
|* 10 | TABLE ACCESS FULL | REF_STATUS | 95 | 2280 | 3 (0)| 00:00:01 |
|* 11 | HASH JOIN | | 10409 | 609K| 935 (2)| 00:00:12 |
| 12 | VIEW | index$_join$_001 | 49 | 588 | 3 (34)| 00:00:01 |
|* 13 | HASH JOIN | | | | | |
| 14 | INDEX FAST FULL SCAN | SVC_PROVIDER_PK | 49 | 588 | 1 (0)| 00:00:01 |
| 15 | INDEX FAST FULL SCAN | SVC_PROVIDER_UK1 | 49 | 588 | 1 (0)| 00:00:01 |
|* 16 | HASH JOIN | | 10409 | 487K| 932 (2)| 00:00:12 |
|* 17 | TABLE ACCESS FULL | SUB | 8777 | 111K| 53 (0)| 00:00:01 |
|* 18 | HASH JOIN | | 10607 | 362K| 878 (2)| 00:00:11 |
|* 19 | TABLE ACCESS FULL | SUB_SVC_PARM | 10607 | 207K| 423 (2)| 00:00:06 |
|* 20 | TABLE ACCESS FULL | SUB_SVC | 90284 | 1322K| 454 (1)| 00:00:06 |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."SUB_ID"="J"."SUB_ID"(+))
3 - access("F"."SUB_SVC_ID"="I"."SUB_SVC_ID")
4 - access("F"."SUB_SVC_ID"="G"."SUB_SVC_ID")
5 - filter("F"."SUB_SVC_STATUS_ID"<>29)
6 - access("F"."SVC_ID"="SVCID"('smp_dial_tone_access'))
7 - filter("G"."PARM_ID"="GET_CGO_PARM_ID"('voip_dn1',"GET_CLASS_ID" ('SubSvcSpec'),"SVCID"('smp_dial_tone_access')))
8 - filter("I"."PARM_ID"=20410)
9 - access("A"."SUB_STATUS_ID"="B"."STATUS_ID")
10 - filter("B"."STATUS_ID"<>9)
11 - access("A"."SVC_PROVIDER_ID"="C"."SVC_PROVIDER_ID")
13 - access(ROWID=ROWID)
16 - access("A"."SUB_ID"="D"."SUB_ID")
17 - filter("A"."SUB_STATUS_ID"<>9)
18 - access("D"."SUB_SVC_ID"="E"."SUB_SVC_ID")
19 - filter("E"."PARM_ID"=1254 OR "E"."PARM_ID"=20249)
20 - filter("D"."SUB_SVC_STATUS_ID"<>29)
Statistics
----------------------------------------------------------
470461 recursive calls
0 db block gets
13592455 consistent gets
0 physical reads
0 redo size
1168343 bytes sent via SQL*Net to client
7971 bytes received via SQL*Net from client
679 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10163 rows processed
所以我正在寻找 distinct 子句的任何替代方案来调整此查询。
我的数据库版本是:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
最佳答案
我会通过取出函数然后在外部查询中选择那些列来包装整个不同的查询。应该减少函数调用的次数,并且这样 distinct 也应该更快。
SELECT *, pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'contact.name.salutation'
) salutation,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'first_name'
) first_name,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'contact.name.middle'
) middle_name,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'last_name'
) last_name,
pkg_sp_subbrief.get_sub_parm (a.sub_id, 'company_name') company_name,
pkg_sp_subbrief.get_sub_parm (a.sub_id, 'itc_account') itc_accout,
pkg_sp_subbrief.get_sub_contact_parm
(a.sub_id,
'phones.home.number'
) phone_number,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'address_1'
) addr_home_address,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'city'
) addr_home_city,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'prov'
) addr_home_prov,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'postal_cd'
) addr_home_postal_code,
pkg_sp_subbrief.get_location_parm
(a.sub_id,
'country'
) addr_home_country,\
pkg_sp_subbrief.get_subsvc_parm_first (a.sub_id,
3374
) alpha_tag,
fn_sp_get_svc_plan (a.sub_id) svc_plan,
pkg_sp_subbrief.get_sub_typ (a.sub_id) sub_type
FROM (
SELECT -- /*+ first_rows */
distinct a.sub_id, b.status,
c.svc_provider_nm,
e.val cm_mta_mac, ' ' telephone_number,
NVL (j.voipdn1, ' ') voip_dn1,
NVL (j.mtavoiceport, ' ') mta_voice_port
FROM svc_provider c,
ref_status b,
sub a,
sub_svc d,
sub_svc_parm e,
(SELECT f.sub_id, g.val voipdn1, i.val mtavoiceport
FROM sub_svc f, sub_svc_parm g, sub_svc_parm i
WHERE f.svc_id = SvcId('smp_dial_tone_access')
AND f.sub_svc_status_id ! = 29
AND f.sub_svc_id = g.sub_svc_id
AND g.parm_id = get_cgo_parm_id('voip_dn1', GET_CLASS_ID('SubSvcSpec'), SvcID('smp_dial_tone_access'))
AND f.sub_svc_id = i.sub_svc_id
AND i.parm_id = 20410) j
WHERE a.svc_provider_id = c.svc_provider_id
AND a.sub_status_id = b.status_id
AND a.sub_id = d.sub_id
AND d.sub_svc_id = e.sub_svc_id
AND (e.parm_id = 1254 OR e.parm_id = 20249)
AND d.sub_svc_status_id != 29
AND a.sub_status_id != 9
AND a.sub_id = j.sub_id(+)
)
关于sql - 性能调整或替代 distinct 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31512225/
我有一个包含电子邮件、IP、州、城市、时间戳、ID 列的表 我需要按州分组计算电子邮件和 IP 的不同位置 所以当我运行 MYSQL 查询时, select State, City ,count(di
我试过 select distinct ID from DB.TABLE; 它返回所有记录中的唯一 ID。 select distinct * from DB.TABLE; 它将通过比较所有列
我正在尝试在 Postgresql 中编写一个查询,该查询提取一组有序数据并按不同的字段对其进行过滤。我还需要从同一表行中提取其他几个字段,但需要将它们排除在不同的评估之外。示例: SELECT
我有一个使用以下语句创建的 Postgres 表。该表由另一个服务的数据转储填充。 CREATE TABLE data_table ( date date DEFAULT NULL,
我在一个名为 products 的表中有 4 列 id|p_name| p_img | 1 | Xs | xsmax.png | 2 | Xs | xr.png |
当它的状态仅为"is"时,我想从“num”中选择不同的值,而不是立即包括“否”? 表: +--------+-----+--------+ | id | num | status | +---
全部!今天我有一个棘手的问题要给你,我想使用 select DISTINCT 语句来选择一个需要不同的行,但也在同一个语句中(或者我尝试过的方式?)一个没有的行't/不能区分。我想要的结果是每个类名中
我有一个正在使用 Distinct() 的 linq 查询。如果我只是调用 Distinct() 而没有转换为列表,那么它不会返回不同的列表 - 它仍然包含重复项。 但是,如果我转换为 List 并然
说到性能,我应该使用 .ToList().Distinct() 还是 .Distinct().ToList() ? 两种扩展方法是否生成相同的 SQL 查询? 看起来第二种方法应该表现更好,但这是真的
如何在不支持 SQL Server 2008R2 的 SQL 实现中重写包含标准 IS DISTINCT FROM 和 IS NOT DISTINCT FROM 运算符的表达式? 最佳答案 IS DI
有一张 table (在 HIVE) 示例 - meanalytics.key2_master_ids 该表有 6 列(cmpgn_id、offr_id、exec_id、creatv_id、cmpl_
SELECT * FROM `amc_info` WHERE department =' ( SELECT DISTINCT department ) into outfile = 'Differe
如何在Elasticsearch中计算“不同的平均值”?我有一些这样的非规范化数据: { "record_id" : "100", "cost" : 42 } { "record_id" : "200
关注这个question我有... ID SKU PRODUCT ======================= 1 FOO-23 Orange 2 BAR
我有这个 mysql 查询: SELECT DISTINCT post.postId,hash,previewUrl,lastRetrieved FROM post INNER JOIN (tag a
http://sqlfiddle.com/#!2/37dd94/17 如果我执行 SELECT DISTINCT,我得到的结果与只执行 SELECT 的结果相同。 在查询结果中,您将看到两个包含 Di
我有一列包含空条目,例如此列中的可能值为 None, 1, 2, 3 当我使用 session.query(func.count(distinct(Entry.col))).scalar() 计算列中
这是否可能从表列中选择不同的行并计算单个查询中每个不同字段的重复行 $sql = "SELECT DISTINCT location and COUNT(DISTINCT location)
我在 MySQL 数据库中有一个包含 1100 万行的表。其中一列是个人身份证号码。人们在表中被多次列出,我想知道有多少个唯一的个人 ID 号码。然后创建一个包含这些唯一数字的表格。当我计算列中不同的
我刚刚注意到我的 Informix SQL 列(在同一个表中)的某些 上有些奇怪。当我执行此查询时 SELECT DISTINCT colName FROM myTable 例如,我得到 40 行。但
我是一名优秀的程序员,十分优秀!