Half entries are created in certain cases where there is a mapping of inside -> outside or when packet is initiated from inside -> outside.
When the router is configured for NAT overload (Port Addess Translation (PAT)) and non-pattable traffic hits the router, non-pattable bind entries get created for this traffic. It leads to this kind of entry in the NAT table:
--- 10.10.10.1 172.16.9.9 --- ---
This bind entry consumes an entire address from the pool. In this example, 10.10.10.1 is an address from an overloaded pool.
That means an inside local IP Address gets bound to the outside global IP which is similar to static NAT. Because of this, until the current entry gets timed out, new inside local IP Addresses cannot use this global IP Address. All the translation created for this bind is 1-to-1 translations instead of overload.
In order to solve this issue, you can use route-maps with dynamic NAT. With route-maps, NAT won't create half-entries or use interface overload instead of pool overload. Non-pattable bindings are not created in case of interface overload.