如何进行快速查询

Posted

技术标签:

【中文标题】如何进行快速查询【英文标题】:how to make fast query 【发布时间】:2019-03-07 10:08:27 【问题描述】:

我在创建小表时测试了这个编码 SQL,它有 4 行数据,我得到了快速查询,但是当我更改为真表很长时间并且不给我任何结果时,这个真值表有超过 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
;

给我快速的结果

任何人都可以帮助我如何从真实表中获得快速结果

【问题讨论】:

解释输出说明了什么? docs.oracle.com/cd/B19306_01/server.102/b14211/… 你有islaam_vca(em_code) 的索引吗?表中有多少行匹配islaam_vca where em_code = '2222' 附带说明:您真的将日期存储为字符串,因此您必须使用TO_DATE 转换它们吗?不要这样做,使用适当的数据类型DATE 来存储日期。那么,em_code 是不是数字?您将它与一个字符串进行比较,但该字符串包含一个数字。 我想知道richs_secret_hint 应该做什么。唉,这不是每个人似乎都在寻找的神奇的“走得更快”的暗示。那是什么? 你有关于 islaam_vca(em_code) 的索引吗?您的表中有多少行与 em_code = '2222' 的 islaam_vca 匹配? 2 行开始日期到结束日期 【参考方案1】:
    在我看来,em_code 和 start_date 的组合对于这个表来说是唯一的,所以应该存在这个唯一性的索引:
CREATE UNIQUE INDEX islaam_vca_uk1 ON islaam_vca(em_code, start_date)

    其次,请将日期存储为 DATE 数据类型,而不是字符串。

    测试了一下,可能会出现这样的情况,查询时会尝试对表 islaam_vca 进行 TABLE ACCESS FULL,所以你可以尝试这样做:

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;

【讨论】:

很高兴它帮助了你。 我需要全部雇佣你能帮我吗artbro

以上是关于如何进行快速查询的主要内容,如果未能解决你的问题,请参考以下文章

如何快速进行此查询?只要我在 SQL Server 数据库中运行它就会超时

如何快速获取对特定网址的查询 [关闭]

如何将查询字符串作为获取参数快速发送

353mysql查询每个表的数据量_大厂面试官:千万级数据量的表,如何进行快速查询?

Confluence 6 如何配置快速导航的同时查找数量

如何快速查询 GCP 表