【问题标题】:speeding up records fetch time加快记录获取时间
【发布时间】:2018-12-15 18:24:25
【问题描述】:

我有一个 SQL 语句,它需要大约 44 秒来获取数据。如何减少时间?

这是sql

Select AVNR,replace(to_char((CAST(DBTM as timestamp)),'hh24:mi'),'00:00','24:00') as ptime,
        Wert
From e_mw_60min_me
Where to_char((CAST ( DBTM as TIMESTAMP)), 'DD-MM-YYYY') = '13-03-1396'  and
      AVNR In (1141,1142,1144,10335,10336,12016,1146,1147,1149,1129,1130,1132,1134,1135,1137,5895,5896,5900,8906,8907,8909,8901,8902,8904,8940,8941,8943,8951,8952,8954,8972,8973,8975,8830,8831,8833,8835,8836,8838,1113,1982,1984,2314,2315,2317,3272,3273,3275,3267,3268,3270,3262,3263,3265,10231,10136,9066,8779,8780,8782,8774,8775,8777,8320,8321,8323,7696,7697,7699,10486,10487,10489,3329,3330,12018,3322,3328,10132,3320,3321,12017,3222,3223,3225,686,687,689,691,692,694,696,697,699,1,2,4,10527,10528,10529,4911,4912,4914,4917,4918,4920,5162,5163,5166,5157,5158,5160,5168,5169,5171,5449,5450,5452,10116,10117,10119,10120,10121,10123,2271,2272,2279,2266,2267,2269,2259,2260,2262,1292,1293,1295,5380,5381,5383,5374,5375,5377,10545,10546,10547,3281,10126,12031,3244,3245,12030,10983,10984,12033,10987,10989,12032,11073,11074,1125,11079,11080,3333,105,106,108,100,101,103,93,94,96,29,30,32,95,102,1197,124,123,126,12085,12086,12087,2520,2521,2523,2525,2526,2528,2515,2516,2518,2510,2511,2513,5444,5445,5447,2201,2202,12025,3336,3337,3339,3002,3003,12029,1643,1644,1646,1609,1610,1612,1596,1597,1599,9717,9718,9720,9722,9723,9725,2146,2147,2149,2141,2142,2144,2136,2137,2139,2131,2132,2134,2121,2122,2124,2126,2127,2129,2635,2636,2638,2641,2642,2644,7499,7500,7502,4610,4611,4613,4605,4606,4608,4600,4601,4603,9074,9075,9077,9079,9080,9082,9235,9236,9238,9240,9241,9243,9245,9246,9248,8468,8469,8471,5785,5786,5788,5790,5791,5793,5691,5692,5694,5685,5686,5688,8455,8456,8458,11312,11313,4588,7654,7655,7657,9376,9377,9379,9371,9372,9374,9382,9383,9385,5918,5919,5922,5934,5935,5938,5912,5913,5916,10963,7860,10964,135,136,138,10658,10659,10664,10660,10661,10662,5173,5458,5460);

 //these AVNRs are completley Dynamic

表格是这样的:

  1. AVNR(类似 ID 号)
  2. DBTM(每次记录每个点)
  3. Wert(值)

我想知道任何其他可以加快获取速度的 sql 命令

【问题讨论】:

  • 你为什么要投射 DBTM?它是什么数据类型?你有什么索引?在查看查询优化时,您确实需要包含表和索引信息以及当前查询的执行计划。
  • 我无权更改数据库,但 DBTM 是 DATE。但它显示的是日期+时间,所以我需要单独的日期和时间
  • 你有多少数据?一共有多少条记录? DBTM 的每个日期元素有多少?你在表上建立了哪些索引?你想用多少时间来缩短这 44 秒?

标签: sql oracle oracle11g query-optimization performance-testing


【解决方案1】:

如果 DBTM 是日期,则无需将其转换为时间戳;如果上面有索引,那么您不应该将其转换为字符串以与另一个字符串进行比较 - 将其保留为日期并将固定值也转换为日期,并与覆盖全天的范围进行比较:

select AVNR,
  replace(to_char(DBTM,'hh24:mi'),'00:00','24:00') as ptime,
  Wert
from e_mw_60min_me
where DBTM >= date '1396-03-13'
and DBTM < date '1396-03-14'
and AVNR In (1141, ...);

我使用过日期文字,但如果您从变量字符串开始,您可以使用 to_date()

where DBTM >= to_date('13-03-1396', 'DD-MM-YYYY')
and DBTM < to_date('13-03-1396', 'DD-MM-YYYY') + 1
and AVNR In (1141, ...);

您还应该考虑为您正在寻找的所有 AVNR 值创建一个集合,并使用member of 代替IN,或者分解该集合并加入它。不过,这取决于这些值的来源。

【讨论】:

    【解决方案2】:

    您可以添加索引:

    create index idx_e_mw_60min_me_2 on (to_char((CAST ( DBTM as TIMESTAMP)), 'DD-MM-YYYY'), AVNR)
    

    这与where 子句完全匹配,因此应该会加快查询速度。

    【讨论】:

    • 我有一个关于 AVNR 和 DBTM 的索引,因为它们的组合是独一无二的
    • @nnmmss 。 . .这是一个单一的复合索引。
    • 所以,你的意思是......?
    • @nnmmss 。 . .正是答案中指定的索引。
    • 如果你创建一个单独的索引只是为了服务这个查询,你最好把wert放在最后,完全避免表访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多