如何进行快速查询
how to make fast query
我测试了这个编码 SQL 创建小 table 它有 4 行数据并且我得到快速查询但是当我更改为 true table 深度时间并且不给我任何结果,这个真相table它有超过100万条记录
SELECT DISTINCT /*+ richs_secret_hint */
em_code, (to_date(end_date,'DD-MM-YYYY') - level + 1) AS days
FROM
islaam_vca where em_code = '2222'
CONNECT BY level <= (to_date(end_date,'DD-MM-YYYY') - to_date(start_date,'DD-MM-YYYY') + 1)
order by days ASC
;
快给我结果
任何人都可以帮助我如何从 true 中快速获得结果 table
- 在我看来 em_code 和 start_date 的组合对于这个 table 来说是唯一的,所以应该存在这个唯一性的索引:
CREATE UNIQUE INDEX islaam_vca_uk1 ON islaam_vca(em_code, start_date)
其次,请将日期存储为 DATE 数据类型,而不是字符串。
稍微测试了一下,可能会出现这样的情况,当查询将尝试 TABLE ACCESS FULL for table islaam_vca 时,您可以尝试这样做:
SELECT /*+ALL_ROWS*/ distinct em_code --sorry about my interpretation of secret your hint
, start_date
, NVL(end_date, SYSDATE) end_date --don't know if end date is nullable or now
, TRUNC(start_date) + level - 1 specific_date
FROM (SELECT em_code
, start_date
, end_date
FROM islaam_vca
WHERE em_code = '2222')
CONNECT BY level <= TRUNC(NVL(end_date, SYSDATE)) - TRUNC(start_date) + 1
order by specific_date;
我测试了这个编码 SQL 创建小 table 它有 4 行数据并且我得到快速查询但是当我更改为 true table 深度时间并且不给我任何结果,这个真相table它有超过100万条记录
SELECT DISTINCT /*+ richs_secret_hint */
em_code, (to_date(end_date,'DD-MM-YYYY') - level + 1) AS days
FROM
islaam_vca where em_code = '2222'
CONNECT BY level <= (to_date(end_date,'DD-MM-YYYY') - to_date(start_date,'DD-MM-YYYY') + 1)
order by days ASC
;
快给我结果
任何人都可以帮助我如何从 true 中快速获得结果 table
- 在我看来 em_code 和 start_date 的组合对于这个 table 来说是唯一的,所以应该存在这个唯一性的索引:
CREATE UNIQUE INDEX islaam_vca_uk1 ON islaam_vca(em_code, start_date)
其次,请将日期存储为 DATE 数据类型,而不是字符串。
稍微测试了一下,可能会出现这样的情况,当查询将尝试 TABLE ACCESS FULL for table islaam_vca 时,您可以尝试这样做:
SELECT /*+ALL_ROWS*/ distinct em_code --sorry about my interpretation of secret your hint
, start_date
, NVL(end_date, SYSDATE) end_date --don't know if end date is nullable or now
, TRUNC(start_date) + level - 1 specific_date
FROM (SELECT em_code
, start_date
, end_date
FROM islaam_vca
WHERE em_code = '2222')
CONNECT BY level <= TRUNC(NVL(end_date, SYSDATE)) - TRUNC(start_date) + 1
order by specific_date;