Commit 5b2cbcc
authored
[Opt](function) opt of certain time field functions used in conjunction with FROM_UNIXTIME. (#57941)
opt of certain time field functions(`HOUR`, `MINUTE`, `SECOND`, `MICROSECOND`) used in conjunction with `FROM_UNIXTIME`
Take `HOUR(FROM_UNIXTIME(ts))` as an example:
The `hour(from_unixtime(xxx))` function is slow because
`from_unixtime`needs to extract the full yyyy-MM-dd HH:mm:ss format from
the timestamp, which is not necessary. By calculating only the required
fields directly from the timestamp, the process can be significantly
faster.
Add a function `hour_from_unixtime(ts)` to extract the hour from a unix
timestamp, which is timezone aware.
Implementation:
1. Lookup the timezone offset with cctz library
2. Calculate the hour from local unixtime
```cpp
int64_t local_unixtime = unixtime + timezone.lookup_offset(unixtime);
int hour = (local_unixtime % (24 * 3600)) / 3600
```
Performance:
Before VS After:
```text
-- HOUR
Doris> SELECT COUNT(HOUR(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+--------------------------------+
| COUNT(HOUR(FROM_UNIXTIME(ts))) |
+--------------------------------+
| 100000000 |
+--------------------------------+
1 row in set (9.51 sec)
Doris> SELECT COUNT(HOUR(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+--------------------------------+
| COUNT(HOUR(FROM_UNIXTIME(ts))) |
+--------------------------------+
| 100000000 |
+--------------------------------+
1 row in set (0.96 sec)
-- MINUTE
Doris> SELECT COUNT(MINUTE(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+----------------------------------+
| COUNT(MINUTE(FROM_UNIXTIME(ts))) |
+----------------------------------+
| 100000000 |
+----------------------------------+
1 row in set (10.98 sec)
Doris> SELECT COUNT(MINUTE(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+----------------------------------+
| COUNT(MINUTE(FROM_UNIXTIME(ts))) |
+----------------------------------+
| 100000000 |
+----------------------------------+
1 row in set (1.00 sec)
-- SECOND
Doris> SELECT COUNT(SECOND(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+----------------------------------+
| COUNT(SECOND(FROM_UNIXTIME(ts))) |
+----------------------------------+
| 100000000 |
+----------------------------------+
1 row in set (10.01 sec)
Doris> SELECT COUNT(SECOND(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+----------------------------------+
| COUNT(SECOND(FROM_UNIXTIME(ts))) |
+----------------------------------+
| 100000000 |
+----------------------------------+
1 row in set (0.90 sec)
-- MICROSECOND
Doris> SELECT COUNT(MICROSECOND(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+---------------------------------------+
| COUNT(MICROSECOND(FROM_UNIXTIME(ts))) |
+---------------------------------------+
| 100000000 |
+---------------------------------------+
1 row in set (9.75 sec)
Doris> SELECT COUNT(MICROSECOND(FROM_UNIXTIME(ts))) FROM test_hour_from_unixtime;
+---------------------------------------+
| COUNT(MICROSECOND(FROM_UNIXTIME(ts))) |
+---------------------------------------+
| 100000000 |
+---------------------------------------+
1 row in set (1.24 sec)
```1 parent a1e482c commit 5b2cbcc
File tree
15 files changed
+964
-1
lines changed- be/src/vec/functions
- fe/fe-core/src
- main/java/org/apache/doris
- catalog
- nereids
- rules/expression
- rules
- trees/expressions
- functions
- executable
- scalar
- visitor
- test/java/org/apache/doris/nereids/rules/expression
- regression-test
- data/datatype_p0/date
- suites/datatype_p0/date
15 files changed
+964
-1
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
| 24 | + | |
23 | 25 | | |
24 | 26 | | |
25 | 27 | | |
26 | 28 | | |
| 29 | + | |
27 | 30 | | |
28 | 31 | | |
29 | 32 | | |
| 33 | + | |
30 | 34 | | |
31 | 35 | | |
32 | 36 | | |
| |||
427 | 431 | | |
428 | 432 | | |
429 | 433 | | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
430 | 567 | | |
431 | 568 | | |
432 | 569 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
| |||
89 | 90 | | |
90 | 91 | | |
91 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
92 | 98 | | |
93 | 99 | | |
94 | 100 | | |
95 | 101 | | |
96 | 102 | | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
97 | 107 | | |
98 | 108 | | |
99 | 109 | | |
Lines changed: 8 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
238 | 238 | | |
239 | 239 | | |
240 | 240 | | |
| 241 | + | |
241 | 242 | | |
242 | 243 | | |
243 | 244 | | |
| |||
335 | 336 | | |
336 | 337 | | |
337 | 338 | | |
| 339 | + | |
338 | 340 | | |
339 | 341 | | |
340 | 342 | | |
341 | 343 | | |
342 | 344 | | |
343 | 345 | | |
344 | 346 | | |
| 347 | + | |
345 | 348 | | |
346 | 349 | | |
347 | 350 | | |
| |||
419 | 422 | | |
420 | 423 | | |
421 | 424 | | |
| 425 | + | |
422 | 426 | | |
423 | 427 | | |
424 | 428 | | |
| |||
776 | 780 | | |
777 | 781 | | |
778 | 782 | | |
| 783 | + | |
779 | 784 | | |
780 | 785 | | |
781 | 786 | | |
| |||
877 | 882 | | |
878 | 883 | | |
879 | 884 | | |
| 885 | + | |
880 | 886 | | |
881 | 887 | | |
882 | 888 | | |
| |||
886 | 892 | | |
887 | 893 | | |
888 | 894 | | |
| 895 | + | |
889 | 896 | | |
890 | 897 | | |
891 | 898 | | |
| |||
964 | 971 | | |
965 | 972 | | |
966 | 973 | | |
| 974 | + | |
967 | 975 | | |
968 | 976 | | |
969 | 977 | | |
| |||
Lines changed: 2 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| 38 | + | |
38 | 39 | | |
39 | 40 | | |
40 | 41 | | |
| |||
56 | 57 | | |
57 | 58 | | |
58 | 59 | | |
| 60 | + | |
59 | 61 | | |
60 | 62 | | |
61 | 63 | | |
| |||
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
| |||
0 commit comments