Другой способ сделать это - передать управляемую строку (экземпляр StringBuilder) через P / Invoke (в качестве параметра вашей функции Run
).
Таким образом никакие выделения не выполняются на неуправляемой стороне.
Другими словами, у вас будет что-то вроде:
extern «C» __declspec (dllexport) void __cdecl Run (char * data) {// заполнить массив данными // no return value (void)}
и вызвать его следующим образом:
[DllImport (" Unmanaged.dll ", CharSet = CharSet.Ansi)] static extern void Run (результат StringBuilder); Результат StringBuilder = новый StringBuilder (100); Выполнить (результат);
SELECT *
FROM (
SELECT *
FROM table
ORDER BY DBMS_RANDOM.VALUE)
WHERE rownum < 21;
SELECT column FROM
( SELECT column, dbms_random.value FROM table ORDER BY 2 )
where rownum <= 20;
SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20;
Это более эффективно, так как не нужно сортировать таблицу.
SAMPLE () не гарантирует , чтобы дать вам ровно 20 строк, но может быть подходящим (и может выполнять значительно лучше, чем полный запрос + сортировать по случайному для больших таблиц):
SELECT *
FROM table SAMPLE(20);
Примечание: здесь 20
- приблизительный процент, а не количество требуемых строк. В этом случае, поскольку у вас есть 100 строк, чтобы получить приблизительно 20 строк, вы запрашиваете 20% -ный образец.
Чтобы случайным образом выбрать 20 строк, я думаю, вам лучше выбрать, сколько из них будет упорядочено и выбрать первые 20 из этого набора.
Что-то вроде:
Select *
from (select *
from table
order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM
where rownum < 21;
Лучше всего использовать для небольших таблиц, чтобы избежать выбора больших фрагментов данных, чтобы отбросить большинство из них.
DBMS_RANDOM.VALUE
? – Filburt 26 March 2012 в 09:01