나는 구매 버튼을 누를 때 사용자를 위해 부품을 찾기 위해 규칙 세트 (더 정확하게는 7 개)를 사용하는 사용자 정의 상점 사이트를 가지고 있습니다. 이러한 규칙 중 일부는 같은 : (허용되는 지역 당 하나의 판매자) 소비자와 동일한 주, 도시 및 지구에 최초의 판매자에 대한더 나은 성능 : UNION 쿼리 대 separete 쿼리?
- 봐
- 판매자 위가없는 경우 부분과 동일한 그룹의 판매자를 한 곳에서 얻을 수 있으며 같은 도시에있는 경우
- 위 판매자에게 부품이 없으면 같은 도시의 판매자를 찾으십시오.
- 등등 .. .
나는 쿼리의 첫 번째 결과 만 가져 오려면 각 규칙의 거대한 결합에서 약 300 줄의 SQL (쉽게 읽을 수 있도록 형식이 지정됨)이 있어야합니다.
이 방법이 더 좋은지 잘 모르겠습니까? 아니면 다음 번 호출하기 전에 결과가 있는지를 확인하기 위해 조건부 왕복 7 건을 순서 검사에서하는 것이 더 좋습니다.
대다수의 사용자는 규칙 4를 따르고 SQL Server에 대해 4 회 왕복하며 거대한 조합 쿼리의 결과가 10 만 개 미만의 부분에서 1 초 이내에 반환 될 것으로 예상합니다 표.
문제는이 사이트가 사용 가능한 부분의 온도로 자라기 시작한 경우 SQL Server가 1 회의 여행에서 필요한 것만 반환하는 거대한 쿼리로 작업을 처리하는 것이 더 좋습니다. 별도의 쿼리를 호출합니까?
우리는이 작업에 고전적인 ASP를 사용하고 있습니다 (예! Old school, 아시겠습니까?).
검색어 자체를 살펴 봐야하는지 알려주세요.
편집 :
이SELECT TOP 1 regras.ids, regras.idCadastro, regras.regra, e.descricao AS nomeEstado, cd.descricao AS nomeCidade, b.nome AS nomeBairro
FROM (
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '1' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro
WHERE (pi.idCadastro IS NULL OR c.tipoParceiro = 'c') AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro
WHERE (pi.idCadastro IS NULL OR c.tipoParceiro = 'c') AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra1
GROUP BY idCadastro
UNION
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '2' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.idCadastroGrupo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.idCadastroGrupo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra2
GROUP BY idCadastro
UNION
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '3' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.idCadastroGrupo = 1
INNER JOIN cadastrosCidades cc ON c.idCadastro = cc.idCadastro AND cc.idCidade = 4850
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.idCadastroGrupo = 1
INNER JOIN cadastrosCidades cc ON c.idCadastro = cc.idCadastro AND cc.idCidade = 4850
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra3
GROUP BY idCadastro
UNION
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '4' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
INNER JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r'
INNER JOIN cadastrosGrupos cg ON c.idCadastroGrupo = cg.idCadastroGrupo AND cg.idMarca = 2
INNER JOIN cadastrosCidades cc ON c.idCadastro = cc.idCadastro AND cc.idCidade = 4850
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
INNER JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r'
INNER JOIN cadastrosGrupos cg ON c.idCadastroGrupo = cg.idCadastroGrupo AND cg.idMarca = 2
INNER JOIN cadastrosCidades cc ON c.idCadastro = cc.idCadastro AND cc.idCidade = 4850
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra4
GROUP BY idCadastro
UNION
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '5' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
INNER JOIN cadastrosGrupos cg ON pi.idCadastro = cg.idCadastroMontadora AND cg.idCadastroGrupo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
INNER JOIN cadastrosGrupos cg ON pi.idCadastro = cg.idCadastroMontadora AND cg.idCadastroGrupo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra5
GROUP BY idCadastro
UNION
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '6' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.idEstado = 25 AND c.atendeEstadoTodo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.idEstado = 25 AND c.atendeEstadoTodo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra6
GROUP BY idCadastro
UNION
SELECT dbo.group_concat(idPecaItem) AS ids, idCadastro, '7' AS regra
FROM (
SELECT TOP 2 idPecaItem, idCadastro
FROM pecasItens
WHERE COALESCE(pecasItens.idCadastro, 0) = (CASE WHEN EXISTS(
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.atendeBrasilTodo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) THEN (
SELECT TOP 1 COALESCE(pi.idCadastro, 0)
FROM pecasItens pi
LEFT JOIN cadastros c ON pi.idCadastro = c.idCadastro AND c.tipoParceiro = 'r' AND c.atendeBrasilTodo = 1
WHERE pi.idCadastro IS NOT NULL AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
GROUP BY pi.idCadastro
HAVING COUNT(pi.idPecaItem) >= 2
) ELSE NULL END)
AND idPeca = 31740 AND idPedidoItem IS NULL AND dataEntrada <= '2014-3-13' AND devolucaoSolicitada IS NULL
) regra7
GROUP BY idCadastro
) regras
LEFT JOIN cadastros c ON regras.idCadastro = c.idCadastro
LEFT JOIN listaEstados e ON c.idEstado = e.idEstado
LEFT JOIN listaCidades cd ON c.idCidade = cd.idCidade
LEFT JOIN listaBairros b ON c.idBairro = b.idBairro
ORDER BY regra ASC
아니, MySQL은 아니다 :
그냥 결론을 위해, 여기에 내가 지금 사용하고 쿼리입니다. group_concat()
은이 사용자의 맞춤 집계입니다 http://groupconcat.codeplex.com/
어떻게 생각하십니까,이 시점에서 쿼리를 볼 필요가 있습니까? – Alexander
죄송합니다. 나는 그것을 얻지 못했다. 영어가 제 집 언어가 아닙니다. 당신이 아이러니 컬하고 쿼리를 게시하라고 말하고 있습니다. 맞아, 재밌니? – rcdmk
조기 최적화 ("http://c2.com/cgi/wiki?PrematureOptimization")에주의하십시오! 어쨌든 그것을 생각하면 좋다. 이 방법으로 생각하면 ... 두 가지 선택 사항이 있으므로 병목 현상이 될 경우 중간에서 프로세스를 전환 할 수 있습니다. 선택의 여지가 여기 있습니다. 이러한 쿼리를 공용체로 푸시하는 경향이 있습니다 (특히 기본 쿼리가이 컨텍스트에서만 사용되는 경우). 세 번째 옵션은 필터링 된 레코드 집합 (SQL은 위대한)을 100 개 레코드로 반환하고 코드에서 의사 결정을 내리는 것입니다 (그리고 단위 테스트에서 어떻게 결정할 것인가). – BlackjacketMack