Крест Присоединяйтесь! В SQL Server, но мне действительно нужно только около трети строк?

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

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

set UsefulValue = exec spMyStoredProc @ProfileID, @RoleID

Теперь в моем случае ProfileID означает что-то вроде людей, а RoleID означает что-то вроде системных ролей. Я намерен быть немного генералом. Дело в том, что у меня около 60000 определенных людей и около 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 вместо всего Shebang.

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

4 ответа

Решение

Это сработало хорошо. ОТЛИЧНО сокращает время, необходимое для выполнения перекрестного соединения.

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) 

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

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

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

Вы можете использовать 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

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

Выбрать DISTINCT profiles.ProfileObjID, role.RoleName из dbo.Profile профили перекрестного соединения ролей dbo.rj_v_DefinedRoles

Другие вопросы по тегам