Why my database table not created on activation?

The rule of thumb is to never do anything which is not triggered by action or filter.

In this case you try register a hook before wordpress even finished to “boot”. This may work sometimes, but totally not an healthy idea. Use at least the ‘init’ hook (and even better the ‘wp_loaded’ if you can), to trigger you initialization, and do not do anything before that unless you have a very good reason.

As for the activation hook, be very careful with trusting it being triggered as it will not be triggered on multisite install, and not when updates are done, so you might as well plan in advance and detect by yourself when DB initialization or updates are required.

tech