Supondo que a consulta a seguir seja legítima e executada com êxito, existe alguma maneira de acelerá-la?
SELECT foo from T1 --T1 is a huge (>5e6 rows) table with no indexes
UNION
SELECT bar from T1
UNION
SELECT baz from T1
UNION
SELECT qux from T1
As quatro colunas mostradas acima são todas do tipo nvarchar(128)
, não esparsas e anuláveis. Estou usando o SQL Server 2008. Obrigado!
EDIT: Forneceu mais informações. Não consigo adicionar índices porque é uma tabela Stage. Além disso, removendo o DISTINCT
s; Eu esqueci totalmente sobre isso.
Phil: Como faço para consolidar isso em uma única consulta?
Você certamente pode projetar
foo
,bar
,baz
equx
em uma única varredura (SELECT foo, bar, baz, qux FROM T1
). UmCROSS APPLY
TVF pode transformar cada linha (4 colunas) em 4 linhas (1 coluna) e então aplicar DISTINCT no topo. Se o plano original tivesse 4 varreduras de T1 que dominariam o custo, isso pode ser melhor.Existem alternativas para a sugestão CROSS APPLY de @Remus Rusanu . Mesmo que eu me incline a usar o CROSS APPLY para o seu tipo de problema, acho que vale a pena conhecer outras maneiras de obter o mesmo resultado sem introduzir várias varreduras da mesma tabela.
UNPIVOT
:CROSS JOIN
para uma exibição em linha (essencialmente um pré-UNPIVOT
método de unpivoting):O último parece menos atraente para mim dos três métodos (incluindo CROSS APPLY), mas ainda acho que pode ser útil conhecê-lo como um padrão a ser reconhecido em scripts mais antigos, para que você possa transformá-lo em um CROSS provavelmente mais eficiente APLICAR ou, quando mais adequado, UNPIVOT.