<SQL SERVER> Muitos Registos/Velocidade

Lq96

Power Member
Bom dia,

estou a ter um problema com o SQL SERVER devido a ter uma tabela que cresce muito rapido e a velocidade não consegue acompanhar.

Eu tenho uma tabela de "Posições" em que diz a matricula do veiculo e tem um campo do tipo bit que informa se o veiculo se encontra ligado ou não (entre outros campos), ou seja:

Posicao
Matricula nvarchar(10)
Ignicao bit

Exemplo de tabela preenchida:
XX-XX-XX | 0
XX-XX-XX | 0
XX-XX-XX | 1
XX-XX-XX | 1
XX-XX-XX | 1
XX-XX-XX | 1
XX-XX-XX | 1
XX-XX-XX | 0
XX-XX-XX | 0
XX-XX-XX | 1
XX-XX-XX | 1
XX-XX-XX | 0

Através desta tabela necessito de saber quantos percursos o veiculo realizou, ou seja, quantas vezes ligou a ignição e a desligou.

Já fiz várias Querys, mas são muito demoradas, chegando por vezes a demorar + de 30 minutos...
Relembrando que existem veiculos que tem + de 50.000 registos e que os mesmos estão constantemente a aumentar.

Alguém tem alguma ideia de um algoritmo que torne esta consulta rapida?

Desde já agradeço.
 
Podes meter um índice bitmap nessa coluna, visto que só pode assumir dois valores.

Colocando esse índice como puderá ajudar na pesquisa?
Pelo que pesquisei na internet esse índice poderia ajudar se eu quisesse saber o numero de "1" na tabela. Mas quando o carro está em andamento envia vários "1" e não é considerado um percurso apenas uma posição.

Será que percebi mal como funciona o indice?
 
Li agora que o índice bitmap, pode ser mau onde existam várias operações de DML, que parece ser o caso.

Basicamente é um tipo de índice que é útil a aplicar a tabelas onde existam colunas que assumem poucos valores, ou seja pouca cardinalidade.
 
Li agora que o índice bitmap, pode ser mau onde existam várias operações de DML, que parece ser o caso.

Basicamente é um tipo de índice que é útil a aplicar a tabelas onde existam colunas que assumem poucos valores, ou seja pouca cardinalidade.


Sim existem várias operações DML nesta tabela visto haver constantes "INSERT" de vários veiculos.
Têm mais alguma sugestão de query ou de como a tornar mais rapido?
 
mostra as queries que estás a usar.

Boa tarde,

Não sei se a Query é de fácil entendimento por isso passo a explicar.
1 Conto o numero de linhas na tabela para uma determinada matricula
2 Faço um WHILE para percorrer todas as linhas
3 Tenho uma variavel que armazena o valor que eu quero encontrar, ou seja, 1 ou 0
4 Estou a procurar 1, quando encontro digo que quero procurar 0
5 Estou a procurar 0, quando encontro digo que quero procurar 1 e incremento a variavel do numero de percursos

Não sei se dá para entender assim...


Query:

Código:
DECLARE @Matricula as nvarchar(50)
DECLARE @i as int;
DECLARE @totalLines as int;
DECLARE @encontra as bit;
DECLARE @countPer as int

SET @Matricula='XX-XX-XX'
SET @i = 1;
SET @encontra = 1;
SET @countPer = 0;
SELECT @totalLines = COUNT(Matricula) FROM Posicao WHERE Matricula=@matricula


WHILE(@i <= @totalLines)
    BEGIN

        DECLARE @ig as bit;
        SELECT @ig = Igniciao FROM (SELECT Igniciao,Data, ROW_NUMBER() OVER (ORDER BY Data) AS RowNum FROM Posicao WHERE Matricula=@Matricula) AS p WHERE p.RowNum=@i ORDER BY Data ASC
        IF(@encontra=1)
            BEGIN
                IF(@ig=1)
                    BEGIN
                        SET @encontra=0;
                    END
            END
        ELSE
            BEGIN
                IF(@ig=0)
                    BEGIN
                        SET @countPer = @countPer + 1;
                        SET @encontra=1;
                END
            END
  
        SET @i  = @i  + 1      
    END

SELECT @countPer as Max;
 
o teu problema não está na tabela. Estás a fazer dezenas de queries, é natural que demore.
Importante: Em SQL deves evitar ao máximo fazer loops, pelo que se puderes alterar o algoritmo, altera.
Entretanto, experimenta colocar o subset das linhas que te interessam numa tabela temporária, bem como logo o cálculo do RowNum.

Código:
CREATE TABLE #TempMatriculas(<campos da tabela + RowNum>)

INSERT INTO #TempMatriculas(<campos da tabela + RowNum>)
SELECT <campos da tabela>,
ROW_NUMBER() OVER (ORDER BY Data)
FROM Posicao WHERE Matricula=@Matricula) ORDER BY Data ASC
..
SELECT @totalLines = @@ROWCOUNT --Isto diz-te o número de linhas que inseriste no comando anterior, logo não precisas de fazer 1 count
..
SELECT @ig = Igniciao FROM #TempMatriculas 
WHERE p.RowNum=@i
...
 
o teu problema não está na tabela. Estás a fazer dezenas de queries, é natural que demore.
Importante: Em SQL deves evitar ao máximo fazer loops, pelo que se puderes alterar o algoritmo, altera.
Entretanto, experimenta colocar o subset das linhas que te interessam numa tabela temporária, bem como logo o cálculo do RowNum.

Código:
CREATE TABLE #TempMatriculas(<campos da tabela + RowNum>)

INSERT INTO #TempMatriculas(<campos da tabela + RowNum>)
SELECT <campos da tabela>,
ROW_NUMBER() OVER (ORDER BY Data)
FROM Posicao WHERE Matricula=@Matricula) ORDER BY Data ASC
..
SELECT @totalLines = @@ROWCOUNT --Isto diz-te o número de linhas que inseriste no comando anterior, logo não precisas de fazer 1 count
..
SELECT @ig = Igniciao FROM #TempMatriculas
WHERE p.RowNum=@i
...


Bom dia,

estive a utilizar o código que me passou e removi também o WHILE e a resposta é apresentada em menos de 5 segundos.

Para remover o While fiz um Query que basicamente fica uma tabela com os numeros Seguidos (1,0,1,0,1,0), ou seja, remove os numeros repetidos seguidos, e depois divido por 2 e sei o numero de percursos.

Pode verificar se acha que assim é mais pratico, ou se poderei fazer mais alterações a minha query?


Código:
DECLARE @Matricula as nvarchar(50)
DECLARE @i as int;
DECLARE @totalLines as int;
DECLARE @encontra as bit;
DECLARE @countPer as int
DECLARE @ig as bit;

SET @Matricula='XX-XX-XX'
SET @i = 1;
SET @encontra = 1;
SET @countPer = 0;

DROP TABLE #TempMatriculas

CREATE TABLE #TempMatriculas(Ignicao bit, data datetime, RowNum int)

INSERT INTO #TempMatriculas(Ignicao, data, RowNum)
SELECT Igniciao,Data, ROW_NUMBER() OVER (ORDER BY Data) AS RowNum FROM Posicao WHERE Matricula=@Matricula ORDER BY Data ASC

SELECT @totalLines = @@ROWCOUNT

SELECT COUNT(*)/2 FROM #TempMatriculas as T WHERE Ignicao<>(SELECT Ignicao FROM #TempMatriculas AS l WHERE l.RowNum=(T.RowNum+1))
 
Bom dia,

estive a utilizar o código que me passou e removi também o WHILE e a resposta é apresentada em menos de 5 segundos.

Para remover o While fiz um Query que basicamente fica uma tabela com os numeros Seguidos (1,0,1,0,1,0), ou seja, remove os numeros repetidos seguidos, e depois divido por 2 e sei o numero de percursos.

Pode verificar se acha que assim é mais pratico, ou se poderei fazer mais alterações a minha query?


Código:
DECLARE @Matricula as nvarchar(50)
DECLARE @i as int;
DECLARE @totalLines as int;
DECLARE @encontra as bit;
DECLARE @countPer as int
DECLARE @ig as bit;

SET @Matricula='XX-XX-XX'
SET @i = 1;
SET @encontra = 1;
SET @countPer = 0;

DROP TABLE #TempMatriculas

CREATE TABLE #TempMatriculas(Ignicao bit, data datetime, RowNum int)

INSERT INTO #TempMatriculas(Ignicao, data, RowNum)
SELECT Igniciao,Data, ROW_NUMBER() OVER (ORDER BY Data) AS RowNum FROM Posicao WHERE Matricula=@Matricula ORDER BY Data ASC

SELECT @totalLines = @@ROWCOUNT

SELECT COUNT(*)/2 FROM #TempMatriculas as T WHERE Ignicao<>(SELECT Ignicao FROM #TempMatriculas AS l WHERE l.RowNum=(T.RowNum+1))



Boa tarde novamente,

estive a fazer uma verificação mais detalhada e vi a minha query não está correcta:

Código:
SELECT COUNT(*)/2 FROM #TempMatriculas as T WHERE Ignicao<>(SELECT Ignicao FROM #TempMatriculas AS l WHERE l.RowNum=(T.RowNum+1))

Se imaginar o exemplo seguinte:
XX-XX-XX | 0 | 2016-08-23 13:20
XX-XX-XX | 1 | 2016-08-23 13:21
XX-XX-XX | 1 | 2016-08-23 13:22
XX-XX-XX | 0 | 2016-08-23 13:23
XX-XX-XX | 1 | 2016-08-23 13:24
XX-XX-XX | 0 | 2016-08-23 13:25
XX-XX-XX | 0 | 2016-08-23 13:26
XX-XX-XX | 0 | 2016-08-23 13:27
XX-XX-XX | 1 | 2016-08-23 13:28
XX-XX-XX | 1 | 2016-08-23 13:29
XX-XX-XX | 0 | 2016-08-23 13:30

Com o meu código iria dar:
XX-XX-XX | 0 | 2016-08-23 13:20
XX-XX-XX | 1 | 2016-08-23 13:22
XX-XX-XX | 0 | 2016-08-23 13:23
XX-XX-XX | 1 | 2016-08-23 13:24
XX-XX-XX | 0 | 2016-08-23 13:27
XX-XX-XX | 1 | 2016-08-23 13:29

Mas deveria dar:
XX-XX-XX | 1 | 2016-08-23 13:21
XX-XX-XX | 0 | 2016-08-23 13:23
XX-XX-XX | 1 | 2016-08-23 13:24
XX-XX-XX | 0 | 2016-08-23 13:25
XX-XX-XX | 1 | 2016-08-23 13:28
XX-XX-XX | 0 | 2016-08-23 13:30

Existe alguma forma de através de uma query chegar ao falar pretendido? (Já vi todas as tabelas de verdade e nenhuma bate certo com o pretendido)

Também pensei em criar um coluna adicional na tabela que sempre que ele vai inserir uma nova posição verifica a anterior e verifica se é inicio/fim de percurso ou se é uma posição intermédia.
E depois com essa coluna já tinha os "cabeçalhos" de cada percurso...
 
tendo por base os valores do exemplo de cima, isto ajuda ?

Código:
create table ignitions
(
    license nvarchar(8) not null,
    ignition bit not null,
    date datetime not null
)

go

insert into ignitions (license, ignition, date)
    select 'XX-XX-XX', '0', '2016-08-23 13:20' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:21' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:22' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:23' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:24' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:25' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:26' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:27' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:28' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:29' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:30'

go

;with data as (
    select
        t1.date as first_date,
        t1.ignition as first_ignition,
        lead(t1.date) over (order by t1.date) as next_date,
        lead(t1.ignition) over (order by t1.date) as next_ignition from ignitions as t1
)
select * from data where first_ignition <> next_ignition
 
tendo por base os valores do exemplo de cima, isto ajuda ?

Código:
create table ignitions
(
    license nvarchar(8) not null,
    ignition bit not null,
    date datetime not null
)

go

insert into ignitions (license, ignition, date)
    select 'XX-XX-XX', '0', '2016-08-23 13:20' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:21' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:22' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:23' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:24' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:25' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:26' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:27' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:28' union all
    select 'XX-XX-XX', '1', '2016-08-23 13:29' union all
    select 'XX-XX-XX', '0', '2016-08-23 13:30'

go

;with data as (
    select
        t1.date as first_date,
        t1.ignition as first_ignition,
        lead(t1.date) over (order by t1.date) as next_date,
        lead(t1.ignition) over (order by t1.date) as next_ignition from ignitions as t1
)
select * from data where first_ignition <> next_ignition


Bom dia,

com o exemplo dos valores que me deu em cima realmente esse código funciona na perfeição...
Tentei aplicar o código a uma situação real e não funcionou correctamente.

Aqui segue os dados da situação real:
Código:
DELETE FROM [dbo].[ignitions]
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 11:26:28.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:27:27.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 11:27:43.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:28:18.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:18.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:26.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:27.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:28.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:29.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:30.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:38.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:41.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 11:29:45.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 11:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 12:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 13:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 14:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 15:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 16:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 17:11:59.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 17:15:16.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 17:30:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:17:56.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:18:02.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:02.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:07.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:08.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:15.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:18.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:22.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:25.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:26.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:34.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:37.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:42.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:52.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:53.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:54.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:19:56.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:00.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:05.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:10.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:21.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:24.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:30.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:35.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:38.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 1, CAST(N'2016-08-05 18:20:41.000' AS DateTime))
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 18:20:48.000' AS DateTime))


Para os dados que lhe envio em cima o resultado da sua query é o seguinte:

2016-08-05 11:26:28.000 0
2016-08-05 11:27:27.000 1
2016-08-05 11:27:43.000 0
2016-08-05 11:29:45.000 1
2016-08-05 16:30:05.000 0
2016-08-05 17:11:59.000 1
2016-08-05 17:30:05.000 0
2016-08-05 18:20:41.000 1

Mas deveria ser:
2016-08-05 11:27:27.000 1
2016-08-05 11:27:43.000 0
2016-08-05 11:28:18.000 1
2016-08-05 11:30:05.000 0
2016-08-05 17:11:59.000 1
2016-08-05 17:15:16.000 0
2016-08-05 18:17:56.000 1
2016-08-05 18:20:48.000 0


Consegue-me ajudar? Estive a tentar adaptar a query que me enviou para corrigir o problema mas consegui.
 
o "deveria ser" esta na direita no resultado da query
2016-08-05 11:26:28.000 0 2016-08-05 11:27:27.000 1
2016-08-05 11:27:27.000 1 2016-08-05 11:27:43.000 0
2016-08-05 11:27:43.000 0 2016-08-05 11:28:18.000 1
2016-08-05 11:29:45.000 1 2016-08-05 11:30:05.000 0
2016-08-05 16:30:05.000 0 2016-08-05 17:11:59.000 1
2016-08-05 17:11:59.000 1 2016-08-05 17:15:16.000 0
2016-08-05 17:30:05.000 0 2016-08-05 18:17:56.000 1
2016-08-05 18:20:41.000 1 2016-08-05 18:20:48.000 0

a titulo de curiosidade, se removesse a 1ª entrada
INSERT [dbo].[ignitions] ([license], [ignition], [date]) VALUES (N'XX-XX-XX', 0, CAST(N'2016-08-05 11:26:28.000' AS DateTime))
qual seria o resultado esperado ?
 
De qualquer forma, e voltando à solução inicial, a coluna "Matricula" devia estar indexada, pois é a tua condição de pesquisa (cláusula where).
 
o "deveria ser" esta na direita no resultado da query


a titulo de curiosidade, se removesse a 1ª entrada qual seria o resultado esperado ?


Bom dia,

realmente o resultado pretendido está na direita :) não tinha percebido.
Já fiz vários testes em situações reais e funcionou correctamente.
Inclusive já coloquei a query online e está a funcionar correctamente, reuzindo o tempo de espera drásticamente :)

Muito obrigado pela sua ajuda
 
De qualquer forma, e voltando à solução inicial, a coluna "Matricula" devia estar indexada, pois é a tua condição de pesquisa (cláusula where).


Bom dia,

sim eu tenho a coluna Matricula indexada :)

Mas cada matricula pode ter muitos registos.... e com o meu WHERE realmente fazia muitas "contas" e demorava muito mais a responder
 
"Seleccionar o número e o nome de todas as equipas" como faço isto em SQL?

Foi o que fiz mas não funciona
SELECT equipas.*
FROM equipas
WHERE equipas.e_numero AND equipas.e_nome

Help please, não percebo nada disto
 
Boas,

primeiro na cláusula select se o que pretendes são os campos número e nome, deves indicá-los e neste momento estás a pedir todos os campos (equipas.*) e deves fazer (equipas.e_numero, equipas.e_nome) e nem precisas de especificar a tabela porque como só queres dados duma tabela não irá existir conflito de nomes, em segundo na cláusula where ... and não estás a especificar a condição, ou seja estás a dizer que queres os valores onde equipas.e_numero, mas não estás a dizer se o e_numero é maior, menor, igual ou diferente de alguma coisa e precisas de o fazer, uma forma de fazer seria esta:
SELECT e_numero, e_nome FROM equipas
ou assim:
SELECT e_numero, e_nome FROM equipas WHERE e_numero > 10 AND e_nome = "Nome da equipa"
 
Back
Topo