J'ai besoin d'une requête pour empêcher une jointure qui produit 1.34218E + 35 résultats!Évitez les résultats de jointure de requête intermédiaire énorme (1.33615E + 35 lignes)
J'ai un tableau item
(environ 8k articles, par exemple bouclier de Foo, arme de barre), et chaque article est l'un des 9 item_type
différents (armure, arme, etc.). Chaque élément a plusieurs entrées dans item_attribute
(par exemple Damage, Defense). Voici une représentation pseudo-code:
Table item (
item_id autoincrement,
...
item_type_id char, --- e.g. Armor, Weapon, etc
level int --- Must be at least this level to wear this item
);
Table item_attribute (
item_id int references item(item_id),
...
attribute char --- e.g. Damage, Defense, etc
amount int --- e.g. 100
)
Maintenant, un personnage porte 9 articles au total à la fois (un chacun armure, arme, bouclier, etc) que j'appelle une configuration . Je veux construire une liste de configurations qui maximise un attribut, mais a un minimum d'un autre attribut. En termes d'exemple: pour un niveau de personnage 100, présente les 10 meilleurs réglages par dégâts où sum(defense of all items) >= 100
.
L'approche naïve est:
select top 10
q1.item_id,q2.item_id,q3.item_id,..., q1.damage+q2.damage+q3.damage... as damage
from
(select item_id from item where item_type = 'Armor'
and level <= 100) as q1
inner join (select item_id from item where item_type = 'Shield'
and level <= 100) as q2 on 1 = 1
inner join (select item_id from item where item_type = 'Weapon'
and level <= 100) as q3 on 1 = 1
...
where
q1.defense+q2.defense+q3.defense+... >= 100
order by
q1.damage+q2.damage+q3.damage,... descending
Mais, parce qu'il ya environ 8k articles dans item
, cela signifie que l'importance des résultats pour le SGBD pour trier par près de 8000^9 = 1.34218E + 35 différentes configurations! Y a-t-il un meilleur moyen? Vous ne pouvez pas vous joindre uniquement aux # éléments les plus puissants?
Êtes-vous un développeur de World of Warcraft ou quelque chose? 8k articles! OMFG –
Cela pourrait-il être une tâche que le joueur devrait faire (en optimisant sa tenue selon vos règles)? Ils résolvent le problème comme ils le veulent; vous faites simplement respecter les règles. – John
8k articles n'est pas si difficile à acquérir. C'est moins de 900 éléments par type, dont beaucoup ont probablement été générés par programmation. – corsiKa