Как лучше всего извлечь переходы в транзакционной таблице? - PullRequest
0 голосов
/ 21 апреля 2009

Гипотетический пример:

У меня есть таблица SQL, которая содержит около миллиарда транзакций:

| Cost | DateTime   |
| 1.00 | 2009-01-02 |
| 2.00 | 2009-01-03 |
| 2.00 | 2009-01-04 |
| 3.00 | 2009-01-05 |
| 1.00 | 2009-01-06 |
...

Я хочу создать пару данных, чтобы я мог видеть только стоимость переходов :

| Cost | DateTime   |
| 1.00 | 2009-01-02 |
| 2.00 | 2009-01-03 |
| 3.00 | 2009-01-05 |
| 1.00 | 2009-01-06 |
...

Самый простой (и самый медленный) способ сделать это - выполнить итерацию по всей таблице, отслеживая изменения. Есть ли более быстрый / лучший способ сделать это в SQL?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2009

Это классический пример попытки использовать кувалду, когда нужен молоток. Вы хотите извлечь из таблицы некоторые сумасшедшие данные отчетов, но это убьет ваш SQL Server. Чтобы отслеживать изменения, вам нужно создать таблицу отслеживания специально для этой цели. Затем используйте триггер, который записывает изменение стоимости продукта в эту таблицу. Так что на моей таблице продуктов, когда я меняю цену, она попадает в таблицу отслеживания цен.

Если вы используете это для отслеживания цен на акции или чего-то подобного, тогда вы снова используете тот же подход, за исключением того, что вы проводите сравнение таблицы цен и, если происходит изменение, вы сохраняете его. Таким образом, сравнение происходит только с новыми данными, все старые сравнения по-прежнему хранятся в одном месте, поэтому вам не нужно повторно запускать запрос, который приведет к снижению производительности вашего SQL Server.

0 голосов
/ 21 апреля 2009

Нет. Там нет более быстрого пути. Вы можете написать запрос, который выполняет ту же работу, но он будет намного медленнее. Вы (как разработчик) знаете, что вам нужно сравнивать значение только с его прямым предыдущим значением, и нет способа указать это с помощью SQL. Таким образом, вы можете сделать оптимизацию, которую не может выполнить SQL. Поэтому я думаю, что быстрее всего написать программу, которая передает результаты с диска, сохраняя в оперативной памяти только последнее действительное значение и текущее (отфильтровывая каждое значение, равное последнему действительному значению).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...