8
votes

SQL Obtenez les dernières lignes dans la table sans identifiant primaire

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 top 1 .... Ordre par Desc car il prend des heures pour compléter cette tâche . J'ai donc essayé ce travail autour de: XXX

Bien sûr, cela ne fonctionne pas.

De toute façon utiliser ce code / ou un meilleur code pour récupérer la dernière ligne de la table. ?


10 commentaires

Citation de Joe Celko: S'il n'a pas de clé primaire, ce n'est pas une table - 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 (arbitraire devrait être lu comme cela ne devrait pas être dépendant) .


6 Réponses :


1
votes

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.

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: xxx


1 commentaires

Top 1 est nécessaire, car la requête reviendra plus d'une ligne si plusieurs dernières lignes ont été créées simultanément.



0
votes

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?

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. :)


4 commentaires

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 . 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.



2
votes

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.

(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é.)

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 lorsque vous en discutez avec votre chef de projet - La base de données.


2 commentaires

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!



2
votes

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.
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 .

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.
Votre requête serait simple, efficace et correcte: xxx

Si vous n'avez pas de colonne horodatage, vous ne pouvez pas Déterminez «Dernières lignes».


1 commentaires

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.



11
votes

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


0 commentaires

-2
votes

Je pense que vous pouvez l'écrire simplement comme xxx

espère que cela aide.


0 commentaires