J'ai une table avec 800 000 entrées sans clé primaire. Je ne suis pas autorisé à ajouter une clé primaire et je ne peux pas trier par Bien sûr, cela ne fonctionne pas. P> De toute façon utiliser ce code / ou un meilleur code pour récupérer la dernière ligne de la table. ? p> p>
6 Réponses :
Vous devez ajouter un index, pouvez-vous?
Même si vous n'avez pas de clé primaire, un index accélérera considérablement la requête. p>
Vous dites que vous n'avez pas de clé primaire, mais pour votre question, je suppose que vous avez un certain type d'horodatage ou quelque chose de similaire sur la table, si vous créez un index en utilisant cette colonne, vous pourrez Exécuter une requête comme: p>
Top 1 code> est nécessaire, car la requête reviendra plus d'une ligne si plusieurs dernières lignes ont été créées simultanément.
Si vous n'êtes pas autorisé à modifier ce tableau, avez-vous envisagé de créer une vue ou de répliquer les données dans le tableau et de la déplacer en une une clé primaire? P>
sonne hacadée, mais alors, votre table de rangée de 800K n'a pas de clé primaire, alors le hacky semble être l'ordre de la journée. :) p>
Cela ne va toujours pas vous dire quoi que ce soit sur la commande que les enregistrements ont été insérés dans.
Cela ne fonctionnera pas? Je pensais que si j'en ai inséré toutes les données à la vue, cela ne tiendrait-il pas le même ordre que la table d'origine? Ensuite, je pourrais ajouter une clé primaire. La vue de la vue serait-elle automatiquement mise à jour comme de nouvelles données sont insérées dans la table d'origine? Si oui, alors ça devrait aller bien?
@ user719825: Cela fonctionnerait, oui, mais cela ne fonctionnerait pas comme si vous l'attendez, car SQL Server ajoutera simplement les données de la table dans l'ordre de récupérer, au lieu d'une commande par code >. Et c'est le problème principal. À moins que vous sachiez quoi commander, vous ne pouvez pas vraiment le faire correctement.
Ok il n'y a pas de moyen facile de le faire. Je devais ajouter une clé primaire et la mettre en œuvre à minuit la nuit dernière. Pas de problème. Merci encore tout le monde.
Si vous devez sélectionner une colonne à partir d'une table de 800 000 lignes où cette colonne est la valeur minimale ou max possible, et que la colonne n'est pas indexée, le fait non assassinable est que SQL devra lire toutes les rangées de la table. Afin d'identifier cette valeur min ou max. p>
(un de côté, sur la face de celui-ci, la lecture de toutes les rangées d'une table de 800 000 rangées ne devrait pas prendre tout ce long. Quelle est la largeur de la colonne? Quelle est la fréquence de la course de la requête? Y a-t-il une concurrence, un verrouillage, un blocage, ou problèmes d'impasse? Ceux-ci peuvent être des points de douleur qui pourraient être abordés. Fin de côté.) P>
Il existe un nombre quelconque (index, vues, vues indexées, copies indexées péridociales de Talbe, exécutée une fois que le résultat de stockage utilise pour la période de temps avant de rafraîchir, etc.), mais pratiquement toutes nécessitent de faire modifications permanentes à la base de données. On dirait que vous n'êtes pas autorisé à faire cela, et je ne pense pas qu'il y a beaucoup de choses que vous pouvez faire ici sans un tel changement permanent - et appelez-le amélioration em> lorsque vous en discutez avec votre chef de projet - La base de données. P>
Je pourrais peut-être créer une vue. Tant que je n'ai rien ajouté aux tables principales, la vue peut fonctionner car je pourrais ajouter une clé primaire là-bas ..... Laissez-moi essayer ça! Merci
Soyez méfiant, car les vues indexées peuvent être délicates pour mettre en œuvre et soutenir. SQL Books Online aidera avec ceci!
Je suppose que lorsque vous dites "Dernières lignes", vous voulez dire "Dernières lignes".
Même si vous aviez la clé primaire, ce ne serait toujours pas la meilleure option à utiliser pour déterminer la commande de création de lignes.
Il n'y a aucune garantie que la ligne avec la plus grande valeur de clé primaire a été créée après la ligne avec une valeur de clé primaire plus petite. C'est une meilleure idée d'avoir une colonne d'horodatage, par exemple CreateDateTime avec une contrainte par défaut.
Vous auriez index sur ce champ. Si vous n'avez pas de colonne horodatage, vous ne pouvez pas Déterminez «Dernières lignes». P> p>
Même si la clé principale est sur la colonne Identity, vous pouvez toujours remplacer toujours les valeurs d'identité sur INSERT en utilisant.
Set Identity_Insert sur CODE>. P>
Votre requête serait simple, efficace et correcte: p>
Merci pour l'aide de tout le monde. Je ne pouvais vraiment pas faire beaucoup d'autre puis trier par clé primaire.Je a été autorisé à l'ajouter, et cela fait le travail. Si je dois sélectionner qui a répondu à la question de la meilleure question, je suppose que je vais vous le donner pour le bon avis.
Si votre table n'a pas de clé primaire ou que votre clé principale n'est pas ordonnée ... Vous pouvez essayer le code ci-dessous ... si vous voulez voir plus cher, vous pouvez modifier le numéro dans le code
Select top (select COUNT(*) from table) * From table EXCEPT Select top ((select COUNT(*) from table)-(1)) * From table
Je pense que vous pouvez l'écrire simplement comme espère que cela aide. p> p>
Citation de Joe Celko: S'il n'a pas de clé primaire, ce n'est pas une table i> - en direct!
haha bon. Malheureusement, je n'ai pas fait cette table..Je l'a acquise et je ne suis pas autorisé à ajouter une clé primaire.
Vous ne pouvez pas simplement ajouter un index régulier, non cluster et non unique? Cela accélérerait les choses.
Si cela prend des heures pour obtenir le dernier enregistrement dans une pile 800.000 (table), la clé primaire manquante n'est pas votre seul problème. Pour votre problème à la main, vous ne pouvez pas ajouter un index?
Qu'utilisez-vous pour déterminer ce que le dernier enregistrement est? Le serveur SQL du numéro d'enregistrement fournit lorsque vous effectuez une sélection * de la table?
Pourquoi n'êtes-vous pas autorisé à ajouter une clé primaire? Sauf si c'est un produit de COTS où vous perdriez le support du vendeur, je repoussais dessus. Bien sûr, pour votre problème, une clé principale est discutable car cela n'indique pas la commande que les enregistrements ont été insérés nécessairement. Il est généralement proche, mais l'enregistrement 34567 pourrait être inséré après l'enregistrement 34568 si les transactions sont fermées à temps. L'identifiant est obtenu au début de la transaction pas la fin. Ou des identifiants peuvent être insérés manuellement lorsque vous déplacez de nouvelles données client. Le seul moyen fiable d'obtenir le dernier enregistrement est d'avoir un champ inséréDDate.
HLGEM: c'est un serveur en direct avec des données insérées / mises à jour toutes les quelques secondes / minutes. Il existe également 20 procédures stockées, 3 Cascading Update / Supprimer / Insérer des déclencheurs, et 15 contraintes, sur la table, outre les temps d'arrêt, trop d'inconnues si la nouvelle table est un problème avec la nouvelle table.
Dforck42: Je détermine le dernier enregistrement par compte, puis je voulais soustraire le soustraire par un décalage de 1. Oracle a une simple commande Rownum, mais elle manque dans MS SQL, donc je n'ai donc aucun moyen d'associer le numéro compté à quelque chose dans la base de données.
RESENNA: Il est indexé sans cluster, mais il n'est pas assez rapide pour trier par descendant avec tant de lignes.
@ user719825 - Si vous dépendez de quelque chose comme Rownum pour déterminer la commande d'enregistrement, vous devez avoir des problèmes plus tôt ou tard. L'ordre record d'un ensemble de résultats est arbitraire sans
commander par code> (arbitraire devrait être lu comme cela ne devrait pas être dépendant) i>.