2015-04-21 2 views
2

Мне интересно, какой порядок данных возвращает PROC SQL, если нет или group by. Это всегда одно и то же?Порядок строк, возвращаемых PROC SQL

Например, предположим, что я делаю это:

proc sql; 
    create table cusips as 
     select a.cusip as c1, b.cusip as c2 
     from shrs a, shrs b; 
quit; 

который только дает мне список каждой комбинации двух переменных Cusip. Будет ли их порядок таким же, как в исходных входных данных? Похоже, что это в моем случае, но мне интересно, могу ли я быть уверенным, что это всегда будет правдой.

+2

Таблицы и результирующие наборы в SQL (в отличие от SAS) представляют собой * неупорядоченные * наборы. Вы не можете зависеть от упорядочения значений в результирующем наборе, если вы не укажете предложение 'order by'. –

ответ

2

PROC SQL не гарантирует тот же порядок в любой обстоятельство. В общем случае, если вы делаете простой выбор из одной таблицы, он, вероятно, вернется в том порядке, в котором данные уже были, в основном потому, что больше работать не нужно.

Однако PROC SQL, если он решит, что является оптимальным для этого будет делать такие вещи, как расщепленные данные на куски и обрабатывать их по отдельности параллельно - не столько, сколько это РЕКОМЕНДУЕМЫХ возможно, но это будет иногда, тем не менее. Это часто случается с join, в частности, поскольку это может быть сделано как хеш-соединение, в этом случае вы можете получить его в порядке одной таблицы или в обоих случаях, либо в декартовом продукте, либо в нескольких других вариантах.

В частности, в вашем объединении выше оптимизатор SQL может выбрать его как декартово произведение, как хеш-соединение, как объединение индексов или несколько других методов. Каждый из них, вероятно, приведет к другому результату. Даже в этом случае возможно, что если соединение выполняется с несколькими потоками, потоки могут быть сбалансированы по-разному в зависимости от условий сервера/компьютера, на котором он выполняется в то время (т. Е. Если один процессор находится под большей нагрузкой из других процессов, он может получить меньше/больше данных).

Таким образом, вы никогда не должны полагаться на это, возвращая данные по порядку - всегда просите, чтобы он был возвращен по порядку.

Это также почему функция monotonic() не рекомендуется для производственного кода (так как она может не всегда возвращать ожидаемые значения, если окончательный порядок отличается от первоначального заказа).

Если вы хотите вернуть данные в первоначальном заказе и не знаете первоначального заказа или не хотите указывать полный заказ, одним хорошим способом является использование вида datastep для получения первоначального заказа , Представления Datastep будут обрабатывать данные по порядку.

data myview/view=myview; 
    set mydata; 
    _ordervar+1; 
run; 

proc sql; 
    select * from myview 
    order by _ordervar; 
quit; 
Смежные вопросы