2016-08-12 4 views
0

создать таблицу следующим образом:Получить запрос Быстрее

CREATE TABLE [dbo].[Table_10](
    [Name] [nchar](10) NULL, 
    [Date] [datetime] NULL 
) 

после создан кластерный индекс [Дата]

CREATE CLUSTERED INDEX index_name10 
ON dbo.table_10 ([Date]); 

затем заполнила таблицу с 80K данных случайным образом (но в упорядоченном DateTime)

запустить этот запрос и закончили примерно 1 минуту

Я ожидаю, что это работает быстрее, потому что я думаю, что п запрос может быть выполнен в логарифмическом времени. но кажется, что это не так, где я ошибаюсь или как это делается быстрее?

SELECT Table_10.[date], (SELECT COUNT(*) FROM 
             Table_10 AS t10 
             WITH(INDEX(index_name10)) 
             WHERE table_10.[date] < t10.[Date]) 

FROM table_10 
+0

Какая СУБД для этого? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

добавлен тег sql-сервера – mojtaba357

+0

Не имеет значения, что вы делаете свои вставки, упорядоченные по дате. Для СУБД таблица по-прежнему является неупорядоченным набором данных. –

ответ

0

Возможно, вы используете SQL Server. Вы можете использовать rank() для этой цели:

select t.*, 
     (rank() over (order by [date]) - 1) 
from table_10; 

Если [date] не имеет дубликатов, то понятнее использовать row_number() вместо:

select t.*, 
     (row_number() over (order by [date]) - 1) 
from table_10; 

- 1 только необходим потому что вы, кажется, хотят, чтобы начать нумерация в 0, а не 1.

+0

спасибо за другое решение, но мой главный вопрос - почему мой код работает медленно? создав индекс, я ожидаю более быстрое выполнение – mojtaba357

+0

@ mojtaba357. , , Ваш запрос выполняется медленно, потому что это неправильный способ выразить то, что вы хотите сделать. –

+1

@ GordonLinoff вы можете объяснить? это правильный способ сделать это? – MtwStark