Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Добрый день.

Вопрос вызван невозможностью провести анализ планов выполнения обоих вариантов из-за отсутствия необходимого объёма данных.
Версия сервера
Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
	May  3 2005 23:18:38 
	Copyright (c) 1988-2003 Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

Итак, предположим, есть таблица TRANSACTIONS, состоящая из сотен миллионов записей. Таблица хранит данные о транзакциях. Количество записей за месяц достигает десяти миллионов. Модифицировать её структуру нельзя (добавлять индексы и т.д.).

Система работает в режиме 24х7. Задача - определить количество дней, за которые не было транзакций (соответственно, в эти дни были какие-то проблемы).

На первом этапе я загоняю данные за месяц (например, за январь) в курсор условием

... WHERE TRANSACTOINDATE BETWEEN '2009-01-01 00:00:00' AND '2009-01-31 23:59:59.999'


Создаётся вспомогательная таблица ##Calendar (DayDate int) (календарь, в котором есть все дни месяца 1..31)
Вопрос: каким методом лучше осуществлять проверку дней в пределах этого месяца


1.
SELECT 31 - COUNT(DISTINCT DATEPART(DAY,TRANSACTOINDATE) FROM [Cursor])

2. В пределах курсора объявляется переменная DECLARE @CurDay int, в которую поочерёдно загоняются все дни месяца из ##Calendar
IF EXISTS (SELECT 1 FROM TRANSACTIONS WHERE DATEPART(DAY,TRANSACTOINDATE) = @CurDay)


Над кодом особо не думал, просто хотел передать основной принцип, заложенный в поиске "пропавших" дней.
18 сен 09, 11:10    [7677549]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
P.S. Во втором варианте ещё объявляется переменная-счётчик, которая и будет подсчитывать количество "NOT EXIST-ов"
18 сен 09, 11:12    [7677571]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Зачем вообще эти проверки дней ?
18 сен 09, 11:21    [7677659]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Glory
Зачем вообще эти проверки дней ?

чтобы узнать, когда в системе были проблемы
18 сен 09, 11:24    [7677684]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Timid
Glory
Зачем вообще эти проверки дней ?

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

Хороший ответ.
Т.е. SELECT 31 - "какое-то число" сразу показывает, что в системы были/не были проблемы ?
18 сен 09, 11:26    [7677701]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Glory
Timid
Glory
Зачем вообще эти проверки дней ?

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

Хороший ответ.
Т.е. SELECT 31 - "какое-то число" сразу показывает, что в системы были/не были проблемы ?


Грубо говоря, оно покажет, сколько система простАивала
18 сен 09, 11:31    [7677761]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Timid
Glory
Timid
Glory
Зачем вообще эти проверки дней ?

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

Хороший ответ.
Т.е. SELECT 31 - "какое-то число" сразу показывает, что в системы были/не были проблемы ?


Грубо говоря, оно покажет, сколько система простАивала

Какую задачу вы решаете ?
18 сен 09, 11:35    [7677803]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Поставлена задача - определить кол-во дней в месяце, когда не было транзакций
18 сен 09, 11:42    [7677873]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Что то типа такого

SELECT Date,
CASE
WHEN EXISTS (SELECT TOP 1 1 FROM Tbl_tran WHERE Tran_Date = Date) THEN 1
ELSE 0
END as Flag
FROM Calendar
WHERE Date BETWEEN '2009-01-01' AND '2009-01-31

где, Tran_Date - приведенная дата транзакции(без времени)
18 сен 09, 11:55    [7678004]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
--__Александр__--
Что то типа такого

SELECT Date,
CASE
WHEN EXISTS (SELECT TOP 1 1 FROM Tbl_tran WHERE Tran_Date = Date) THEN 1
ELSE 0
END as Flag
FROM Calendar
WHERE Date BETWEEN '2009-01-01' AND '2009-01-31

где, Tran_Date - приведенная дата транзакции(без времени)


а приводить время надо будет к символьному типу данных?
И Вы советуете обрабатывать сразу все данные в пределах месяца?
18 сен 09, 12:04    [7678097]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
500 миллионов записей за 10 лет - это 50 млн записей за год
то есть чуть больше 4 млн записей за месяц, правильно?

Производить поиск "дней с проблемами" нужно раз в месяц,
в ночь на первое число следующего после "подитоживаемого" месяца,
я правильно догадался?

И разве это проблема, если сервер раз в месяц среди ночи одну минуту усиленно поработает
над этими несчастными 4 млн записями ?
18 сен 09, 12:07    [7678127]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
--__Александр__--
Что то типа такого

SELECT Date,
CASE
WHEN EXISTS (SELECT TOP 1 1 FROM Tbl_tran WHERE Tran_Date = Date) THEN 1
ELSE 0
END as Flag
FROM Calendar
WHERE Date BETWEEN '2009-01-01' AND '2009-01-31

где, Tran_Date - приведенная дата транзакции(без времени)
Просветите меня, пожалуйста, зачем в EXISTS стоит TOP 1?
Не проще ли
SELECT Date, ISNULL((SELECT TOP 1 1 FROM Tbl_tran WHERE Tran_Date = Date),0) Flag
FROM Calendar
WHERE Date >= '2009' AND Date < '20090201';
Это не по вопросу темы, а только по конкретному предложенному запросу
18 сен 09, 12:16    [7678199]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timid
--__Александр__--
Что то типа такого

SELECT Date,
CASE
WHEN EXISTS (SELECT TOP 1 1 FROM Tbl_tran WHERE Tran_Date = Date) THEN 1
ELSE 0
END as Flag
FROM Calendar
WHERE Date BETWEEN '2009-01-01' AND '2009-01-31

где, Tran_Date - приведенная дата транзакции(без времени)


а приводить время надо будет к символьному типу данных?
И Вы советуете обрабатывать сразу все данные в пределах месяца?


время никуда приводить не надо, у вас индексы использоваться не будут и вы познаете все прелести сканирования больших таблиц. Вложеный запрос сделайте так:
exists( select * from Tbl_Tran where Tran_Date>= Date and Tran_Date < Date+1)
18 сен 09, 12:17    [7678212]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Timid
Это уже частности.
Основная идея - временные таблицы и курсоры тут уже не нужны.
18 сен 09, 12:18    [7678214]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timid,

а нагрузка на сервер у вас будет очень лояльная, 31 раз Index Seek с выбором 1 записи - не деньги. Если у вас есть индекс по дате конечно
18 сен 09, 12:19    [7678227]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
iap Привычка так писать. На сколько знаю - на план это ниак не влияет.


iljy,iap
Над запросом в плотную не думал. Написал лишь примерный вариант.
Поэтому и написано,"Что то типа такого".
18 сен 09, 12:22    [7678255]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
iljy
Timid,

а нагрузка на сервер у вас будет очень лояльная, 31 раз Index Seek с выбором 1 записи - не деньги. Если у вас есть индекс по дате конечно


В том-то и дело, что индекса по этому полю нет :(
18 сен 09, 12:28    [7678291]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timid
iljy
Timid,

а нагрузка на сервер у вас будет очень лояльная, 31 раз Index Seek с выбором 1 записи - не деньги. Если у вас есть индекс по дате конечно


В том-то и дело, что индекса по этому полю нет :(


??? мда.... тогда вам тяжко конечно придется... Тогда так:
CREATE TABLE #T (date Datetime primary key)

INSERT INTO #t
SELECT TRANSACTIONDATE from TRANSACTIONS
WHERE TRANSACTOINDATE >= '20090101' AND TRANSACTOINDATE < '20090201'

SELECT Date,
CASE 
WHEN EXISTS (SELECT * FROM #T WHERE Date >= c.Date and Date < c.Date + 1) THEN 1
ELSE 0
END as Flag
FROM Calendar c
WHERE Date >= '20090101' AND Date < '20090201'

18 сен 09, 12:38    [7678371]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
За 2 года 800 млн. записей и результат желательно выводить сразу в пределах задаваемого периода, т.е. 2 года. А если эта выборка (теоретически) будет выполняться на боевом серваке (который работает 24х7), то ...
18 сен 09, 12:39    [7678373]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
пред. пост к тому, что может в пределах каждого месяца всё таки целесообразно заносить данные в курсор?
18 сен 09, 12:41    [7678392]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
Тогда открываем курсорчик/цикл и обрабатываем табличку потихоньку по одному дню/часу. Нагрузка будет минимальной, при наличии индекса по дате.
18 сен 09, 12:42    [7678402]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timid,

можно еще подточить, меньше будет нагрузка за счет уменьшения временной таблицы. Но конечно боевую вам придется сканировать всю.

CREATE TABLE #T (date Datetime)


CREATE UNIQUE CLUSTERED INDEX IX_DATE_TEMP
    ON #T (date) WITH (IGNORE_DUP_KEY = ON)

INSERT INTO #t
SELECT dateadd(dd, datediff(dd, 0, TRANSACTIONDATE), 0) from TRANSACTIONS
WHERE TRANSACTOINDATE >= '20090101' AND TRANSACTOINDATE < '20090201'

SELECT Date,
CASE 
WHEN EXISTS (SELECT * FROM #T WHERE Date= c.Date) THEN 1
ELSE 0
END as Flag
FROM Calendar c
WHERE Date >= '20090101' AND Date < '20090201'
18 сен 09, 12:47    [7678440]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timid,

а, ну да, еще WITH(nolock, readpast) добавить на боевую, чтоб мешать по минимуму.
18 сен 09, 12:49    [7678461]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, какой из вариантов решения более лоялен к ресурсам сервера?  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Всем спасибо за помощь, буду переваривать полученную информацию!
18 сен 09, 13:14    [7678655]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить