2010-03-02 3 views
4

Je veux obtenir des enregistrements aléatoires de DB. Il y a deux solutions pour cela:Quelle est la meilleure solution pour obtenir un ensemble d'enregistrements aléatoires de db?

1- En utilisant TABLESAMPLE pour obtenir des données de db directement.

2- Écrivez une méthode Dans mon application pour cela. Dans cette méthode, nous générons plusieurs nombres aléatoires et obtenons des données comme ceci:

select * from db where ID = @RandomNumber 

Si cet ID n'existe pas, je passe un nouveau nombre.

Maintenant, lequel a une meilleure performance?

Répondre

3

Selon le documentation for TABESAMPLE vous ne devriez pas l'utiliser si vous « voulez vraiment un échantillon de lignes individuelles ":

Si vous voulez vraiment un échantillon aléatoire de lignes individuelles, modifier votre requête filtre sur les lignes au hasard, au lieu de en utilisant TABLESAMPLE. Par exemple, l' requête suivante utilise la fonction NEWID pour revenir à peu près une pour cent des lignes de la table de Sales.SalesOrderDetail:

SELECT * 
FROM Sales.SalesOrderDetail 
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) 
     /CAST (0x7fffffff AS int) 

La colonne SalesOrderID est inclus dans l'expression CHECKSUM de sorte que NEWID() évalue une fois par ligne à pour effectuer l'échantillonnage sur une base par ligne. L'expression CAST(CHECKSUM(NEWID(),> SalesOrderID) & 0x7fffffff AS float/CAST(0x7fffffff AS int) évalue à une valeur flottante aléatoire entre 0 et 1.

De toute façon, étant donné le nombre potentiellement infini de demandes que vous pourriez faire en passant dans @RandomNumber (en théorie les 1000 premières demandes que vous faites peut renvoyer rien), la meilleure approche est de limiter le resultset sur le serveur.

1

Je voudrais utiliser TABLESAMPLE, car il est très facile de générer des données d'échantillon. Je pense que ce serait plus efficace que vous appelez seulement un morceau de SQL.

par exemple.

USE AdventureWorks ; 
GO 
SELECT FirstName, LastName 
FROM Person.Contact 
TABLESAMPLE (10 PERCENT) 

Dans votre autre exemple, vous devrez continuer à appeler select * from db where ID = @RandomNumber plusieurs fois.

Si vous après les lignes individuelles alors j'utiliser une autre méthode, une certaine forme de TOP aléatoire 1 etc ...

2

essayez ceci:

SELECT TOP 1 * FROM db 
ORDER BY NEWID() 

la fonction NewID va générer de la valeur UniqueIdentifier et il sera aléatoire. Source: SQL to Select a random row from a database table

+3

La question était "quelle méthode donne une meilleure performance", donc je ne recommanderais pas ORDER BY NEWID(). Il faut assigner NEWID() à toutes les lignes, puis les trier toutes. C'est cher pour les grands recordsets! – filiprem

0

Je recommande de lire un post sur various methods to get random row from table. Il est basé sur PostgreSQL, mais je suis sûr que 90% s'applique également à SQL Server.

Bien sûr, la solution la plus flexible et la plus performante peut être obtenue en écrivant une procédure stockée.Le coût (donc la meilleure performance) de l'obtention d'un échantillon véritablement aléatoire dépend des données (type de données, statistiques et distribution, y compris la parcimonie).

Questions connexes