O banco de dados precisa manter uma B-Tree (ou uma estrutura semelhante) com a chave de forma a tê-los ordenados.
Se a chave tiver hash e for armazenada na B-Tree, seria bom verificar rapidamente a singularidade da chave -- a chave ainda pode ser pesquisada com eficiência. Mas você não poderá pesquisar com eficiência por intervalo de dados (por exemplo, com
LIKE
) porque o B-Tree não é mais ordenado de acordo com o valor String. Então eu acho que a maioria dos bancos de dados realmente armazena a String na B-Tree, que pode (1) ocupar mais espaço do que valores numéricos e (2) exigem que o B-Tree seja rebalanceado se as chaves forem inseridas em ordem arbitrária (sem noção de valor crescente como com pk numérico).
A penalidade na prática pode variar de insignificante a enorme. Tudo depende do uso, do número de linhas, do tamanho médio da chave de string, das consultas que unem a tabela, etc.