Je travaille à la création d'une base de données redshift en écoutant des événements provenant de différentes sources et en pompant ces données dans un cluster redshift.Performances Redshift: requêtes SQL et normalisation de table
L'idée est d'utiliser Kinesis firehose pour pomper des données vers redshift en utilisant la commande COPY. Mais j'ai un dilemme: Je voudrais d'abord interroger des informations à partir redshift à l'aide d'une requête de sélection tel que celui ci-dessous:
select A, B, C from redshift__table where D='x' and E = 'y';
Après avoir obtenu les informations nécessaires à partir redshift, je vais combiner cette information avec ma notification d'événements données et émettre une requête à kinésis. Kinesis fera alors son travail et lancera la commande COPY requise. Maintenant, ma question est que c'est une bonne idée d'interroger à plusieurs reprises redshift comme dire chaque seconde puisque c'est l'heure prévue après laquelle je vais recevoir des notifications d'événements?
Maintenant, permettez-moi de décrire un scénario alternatif:
Si je normalise ma table et séparer certains champs dans une table séparée puis, je vais devoir effectuer moins de requêtes redshift avec la conception normalisée (peut être une fois tous les 30 secondes)
Mais l'inconvénient de cette approche est qu'une fois que j'ai les données dans redshift, je vais devoir effectuer des jointures de table tout en effectuant des analyses en temps réel sur mes données redshift.
Je souhaite donc savoir à un niveau élevé qui approche serait mieux:
ont une table à plat unique, mais requête avant l'émission d'une demande de Kinesis sur une notification d'événement. Il n'y aura pas de jointures de table lors de l'analyse.
Avoir 2 tables et requête redshift moins souvent. Mais effectuez une jointure de table tout en affichant les résultats à l'aide d'outils BI/analytiques.
Lequel de ces 2 pensez-vous est une meilleure option? Supposons que j'utiliserai les clés de tri/clés de distribution appropriées dans les deux cas.
Que * exactement * voulez-vous dire par ["normalisation"] (https://stackoverflow.com/a/40640962/3404097), à la fois en général et ici? Probable "à 1NF" éliminant les valeurs "non-atomiques"? Hélas: "meilleur" (1) ne signifie rien tant que le demandeur ne le définit pas et (2) dépend de tant de détails de haut niveau à bas niveau (utilisation, implémentation, ressources, coûts-bénéfices) il doit être testé empiriquement. La "distribution de clés appropriée" est la bonne direction. Cherchez à identifier "meilleur" et 2 modèles pour évaluer et tester votre workflow. – philipxy
"est-ce une bonne idée d'interroger plusieurs fois redshift comme dire toutes les secondes" - Redshift n'est pas une base de données de style OLTP donc optimisé pour moins de très grandes requêtes, pas beaucoup de très petites requêtes.Vous pourriez trouver que le temps de réponse dans ce scénario n'est pas assez rapide pour une requête par seconde. Vous devez également prendre en compte * concurrence * (nombre de requêtes simultanées autorisé): il existe une concurrence maximale de 50 sur le cluster, de sorte que votre processus utilise l'un des emplacements disponibles presque de façon permanente. http://docs.aws.amazon.com/redshift/latest/dg/cm-c-defining-query-queues.html – Nathan