Крест Присоединяйтесь!В SQL Server, но мне действительно нужно только около трети строк? - PullRequest
1 голос
/ 26 октября 2011

Хорошо, поэтому я не уверен, правильно ли я поступлю. Но мой сценарий - у меня есть хранимая процедура, которую я хотел бы протестировать, используя все возможные комбинации входных данных, которые она принимает.

Допустим, у меня есть хранимая процедура, которая принимает два параметра, например:

set UsefulValue = exec spMyStoredProc @ProfileID, @RoleID

Теперь в моем случае ProfileID означает что-то вроде people , а RoleID означает что-то вроде system ролей. Я намерен быть немного генералом. Дело в том, что у меня около 60 000 определенных людей и около 600 определенных ролей.

К сожалению, система, которую я тестирую, является СЛОЖНОЙ, как сложный день, и мне действительно нужно пройти эту процедуру в полном темпе.

Хорошо, пока со мной? Надеюсь, вы; проверьте этот sql для генерации данных, которые я в конечном итоге передам хранимой процедуре:

    select profiles.ProfileID, roles.RoleID from Profile profiles
cross join dbo.DefinedRoles roles

Это на самом деле довольно хорошо, но проблема в том, что он работает вечно, и, честно говоря, мне не нужно каждую перестановку этих двух значений.

Поэтому я попытался ограничить результирующий набор следующим образом:

select top 300000 profiles.ProfileObjID, roles.RoleName from dbo.Profile profiles
cross join dbo.rj_v_DefinedRoles roles 

Но упс! Это ограничивает конечный результат, поэтому я в итоге получаю только результат с 2-3 ролями (в зависимости от того, что я передаю верхнему глаголу) и ProfileID для каждого человека.

Что бы я хотел иметь, моя цель - получить результаты по всем моим ролям (около 600) и по каждой из них, возможно, использовать только половину ProfileID вместо целых притон.

Так имеет ли смысл то, что я спрашиваю?

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

Если я понимаю проблему, вы хотите несколько тестовых случаев, но не хотите, чтобы они генерировались в пользу конкретной роли / человека (какое перекрестное соединение делает с вами).

select top 300000
profiles.ProfileObjID, roles.RoleName 
from dbo.Profile profiles 
cross join dbo.rj_v_DefinedRoles roles
order by newid()

Порядок будет рандомизировать ваши результаты, а затем превысить результаты, чтобы получить случайный набор тестовых данных. Это, конечно, не гарантирует какую-либо конкретную роль / человека в конечных результатах, это процентный шанс и т. Д.

1 голос
/ 26 октября 2011

Вы можете использовать ROW_NUMBER () в нескольких разных местах, чтобы выбрать часть ваших данных ...

-- Maximum of 20,000 rows per RoleID
WITH
  combinations AS
(
  SELECT
    roles.RoleID,
    profiles.ProfileID,
    ROW_NUMBER() OVER (PARTITION BY roles.RoleID) AS profile_sequence_id
  FROM
    Profile          profiles
  CROSS JOIN
    dbo.DefinedRoles roles
)
SELECT
  *
FROM
  combinations
WHERE
  profile_sequence_id < 20000

Или ...

-- Maximum of 20,000 rows per RoleID
WITH
  profiles AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY 1) AS profile_sequence_id
  FROM
    Profile
)
SELECT
  roles.RoleID,
  profiles.ProfileID
FROM
  dbo.DefinedRoles roles
CROSS JOIN
  profiles
WHERE
  profiles .profile_sequence_id < 20000
0 голосов
/ 26 октября 2011

Это сработало хорошо. GREATLY сокращает время, необходимое для выполнения перекрестного соединения.

select profiles.ProfileObjID, roles.RoleName
from dbo.rj_v_DefinedRoles roles
cross join dbo.Profile profiles
where ProfileObjId in (select ProfileObjId from dbo.Profile
                    where ProfileObjId between 10000 and 11000) 
0 голосов
/ 26 октября 2011

Вы пытались использовать ключевое слово DISTINCT?

выбрать DISTINCT profiles.ProfileObjID, role.RoleName из dbo.Profile кросс-профили dbo.rj_v_DefinedRoles role

...