Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Не освобождаются страницы при переключении секции.

Доброго дня.
Ситуация следующая. Есть 3 таблицы. SrcTable - основная OLTP таблица. tmpSrcTable временная таблица для подготовки данных для архивной таблицы. ArchTable архивная таблица с кластерным колоночным индексом. Действия следующие:
1. перекидываем порцию данных из SrcTable в tmpSrcTable.
2. создаем секционный кластерный колоночный индекс на tmpSrcTable.
3. переключаем секции в ArchTable.
4. удаляем кластерный колоночный индекс на tmpSrcTable.
В итоге наблюдаем следующую картину (sp_spaceused и ssms свойство таблицы) кол-во строк 0, data и index_size больше 0, т.е. такое поведение как при удалении из кучи, данных фактически нет (они в архиве), но страницы не помечены как освобожденные (в PFS). освобождение страниц происходит только при truncate. Вот думаю это бага или фитча?

+ скрипт распределения страниц

SELECT au.allocation_unit_id
,au.type_desc
,au.total_pages
,au.used_pages
,au.data_pages
,p.index_id
,i.name AS [indexname]
,i.type_desc AS [index_type]
,fg.name AS [filegroup]
,s.name AS [schema]
,o.name AS [Object]
,o.type_desc 
,p.data_compression_desc
FROM sys.system_internals_allocation_units au
JOIN sys.partitions [p] ON [p].[partition_id] = au.[container_id]
JOIN sys.filegroups fg ON au.filegroup_id = fg.data_space_id
JOIN sys.objects o ON o.object_id = p.object_id
JOIN sys.schemas s ON s.schema_id = o.schema_id
JOIN sys.indexes i ON i.object_id = o.object_id AND i.index_id = p.index_id
WHERE o.name = 'tmpSrcTable'
ORDER BY total_pages DESC;

EXEC sp_spaceused 'dbo.tmpSrcTable';



Подготовка данных.
CREATE PARTITION FUNCTION fn_Dt2 (DATETIME2) AS RANGE RIGHT FOR VALUES('20160811','20160812','20160813')
GO
CREATE PARTITION SCHEME sch_Dt2 AS PARTITION fn_Dt2 ALL TO ([PRIMARY]);
GO
CREATE PARTITION FUNCTION fn_tiny (TINYINT) AS RANGE RIGHT FOR VALUES(0,1,2,3,4,5,6,7,8,9)
GO
CREATE PARTITION SCHEME sch_tiny AS PARTITION fn_tiny ALL TO ([PRIMARY]);
GO

CREATE TABLE dbo.SrcTable (Id INT NOT NULL,FName VARCHAR(20) NOT NULL,InsDate DATETIME2,PartNo TINYINT NOT NULL) ON sch_tiny(PartNo)
GO
CREATE CLUSTERED INDEX ixSrcTable ON dbo.SrcTable(InsDate,PartNo) ON sch_tiny(PartNo)
GO

CREATE TABLE dbo.tmpSrcTable (Id INT NOT NULL,FName VARCHAR(20) NOT NULL,InsDate DATETIME2,PartNo TINYINT NOT null) ON sch_Dt2(InsDate) 
GO

CREATE TABLE dbo.ArchTable (Id INT NOT NULL,FName VARCHAR(20) NOT NULL,InsDate DATETIME2,PartNo TINYINT NOT NULL) ON sch_Dt2(InsDate)
GO

CREATE CLUSTERED COLUMNSTORE INDEX ixArchTable ON dbo.ArchTable
GO

INSERT INTO dbo.SrcTable ( Id, FName, InsDate, PartNo ) VALUES 
(1,'AAAAAA','20160811 13:10',1%10),
(2,'AAAAAA','20160811 15:15',2%10),
(3,'AAAAAA','20160812 09:17',3%10),
(4,'AAAAAA','20160812 13:10',4%10),
(5,'AAAAAA','20160813 13:20',5%10),
(6,'AAAAAA','20160813 15:10',6%10)
GO


Проверяем tmpSrcTable, сейчас все по 0-м.
allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
72057594047234048 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594047299584 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594047365120 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594047430656 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE

name rows reserved data index_size unused
tmpSrcTable 0 0 KB 0 KB 0 KB 0 KB

далее переносим данные из таблицы.
DELETE d
OUTPUT Deleted.* INTO dbo.tmpSrcTable
FROM dbo.SrcTable d
WHERE d.InsDate < '20160812'


при этом в логе видно, что в PFS страницах объекта SrcTable идет обновление, что логично, т.к. есть кластерный индекс.

Operation Context AllocUnitName
LOP_INSERT_ROWS LCX_HEAP dbo.tmpSrcTable
LOP_SET_FREE_SPACE LCX_PFS Unknown Alloc Unit
LOP_DELETE_ROWS LCX_MARK_AS_GHOST dbo.SrcTable.ixSrcTable
LOP_SET_BITS LCX_PFS dbo.SrcTable.ixSrcTable
LOP_INSERT_ROWS LCX_HEAP dbo.tmpSrcTable
LOP_DELETE_ROWS LCX_MARK_AS_GHOST dbo.SrcTable.ixSrcTable
LOP_SET_BITS LCX_PFS dbo.SrcTable.ixSrcTable

проверяем распределение страниц tmpSrcTable данные есть.
allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
72057594047299584 IN_ROW_DATA 2 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594047365120 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594047430656 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594047234048 IN_ROW_DATA 0 0 0 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE

name rows reserved data index_size unused
tmpSrcTable 2 16 KB 8 KB 8 KB 0 KB

Строим кластерный колоночный индекс
CREATE CLUSTERED COLUMNSTORE INDEX ixtmpSrcTable ON dbo.tmpSrcTable ON sch_Dt2(InsDate)
GO


проверяем распределение страниц, добавились LOB_DATA в них же данные.
allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
72057594048806912 LOB_DATA 10 3 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594048610304 LOB_DATA 2 2 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594049003520 LOB_DATA 2 2 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594049200128 LOB_DATA 2 2 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594048544768 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594049134592 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594048741376 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE
72057594048937984 IN_ROW_DATA 0 0 0 1 ixtmpSrcTable CLUSTERED COLUMNSTORE PRIMARY dbo tmpSrcTable USER_TABLE COLUMNSTORE

name rows reserved data index_size unused
tmpSrcTable 2 128 KB 72 KB 0 KB 56 KB

переключаем партицию и удаляем индекс
ALTER TABLE dbo.tmpSrcTable SWITCH PARTITION 2 TO dbo.ArchTable PARTITION 2
GO
drop INDEX ixtmpSrcTable ON dbo.tmpSrcTable 
GO

Проверяем tmpSrcTable, остались только IN_ROW_DATA, и страниц стало больше (16 против 36). С чего бы?
allocation_unit_id	type_desc	total_pages	used_pages	data_pages	index_id	indexname	index_type	filegroup	schema	Object	type_desc	data_compression_desc
72057594049331200 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594049396736 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594049462272 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
72057594049527808 IN_ROW_DATA 9 2 1 0 NULL HEAP PRIMARY dbo tmpSrcTable USER_TABLE NONE
name rows reserved data index_size unused
tmpSrcTable 0 288 KB 32 KB 32 KB 224 KB

при удалении кластерного колоночного индекса в логе только такие записи.
Operation	Context	AllocUnitName
LOP_EXPUNGE_ROWS LCX_CLUSTERED sys.sysrscols.clst
LOP_SET_BITS LCX_PFS sys.sysrscols.clst

далее, что бы освободить страницы от tmpSrcTable можно только через truncate.
Ответ: gds,

Строка columnstore: SQL Server помечает строку как логически удаленную, но не возвращает физическое хранилище для строки до тех пор, пока индекс не будет перестроен.


думаю, просто забыли актуализировать выделенное под таблицу место
Вопрос: Cognos Report Studio: несколько страниц с crosstab-ами

Подскажите пожалуйста, можно ли решить с помощью Cognos такую задачу.

Запрос выдает некоторое количество групп данных.

Группа 1 Строка 1 Колонка 1 Значение
Группа 1 Строка 1 Колонка 2 Значение
Группа 1 Строка 2 Колонка 1 Значение
Группа 1 Строка 2 Колонка 2 Значение
Группа 2 Строка 1 Колонка 1 Значение
Группа 2 Строка 1 Колонка 2 Значение


Нужно для каждой группы построить одинаковые crosstab'ы.

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

Спасибо.
Ответ: Tubic,

Можно только поменять имя страницы в её свойствах, а числовой инкремент не меняется.
Вопрос: Вывод определенной строки из базы данных MySQL

Доброго времени суток !
Допустим есть БД с таблицей и такими строками: id, author, text_name
Например:

id auther text_name
1 Пупкин Новость 1
2 Федоров Новость 2
3 Сидоров Новость 3
4 Иванов Новость 4
На странице идет запрос к БД на вывод таблицы:
Код PHP
1
2
3
4
5
$db = mysql_connect ("сервер","название","пароль");
mysql_select_db ("название",$db);
mysql_set_charset (utf8);
$result = mysql_query ("SELECT author FROM full_text",$db);
$myrow = mysql_fetch_array ($result);
Для вывода на странице обычно используется код:
Код PHP
1
<? echo $myrow ['author']; ?>
Запрос идет на все строки из пункта author. Чтобы вывести имя нужно указывать либо конкретный id либо конкретное имя автора. И тут сам вопрос: можно ли сделать так, чтоб шел запрос на весь пункт author из таблицы, но чтоб каждое имя можно было-бы вывести на страницу в разных местах кода ? И если можно - то как ?
Заранее спасибо )
Ответ: Проблема в том, что у меня в таблице очень много имен авторов и все имена нужно вывести на одной странице, и расположить их в нужном месте нужное имя
Вопрос: Связать ID страницы в Вордпрессе с MySQL

Доброго всем здравия. Пока что только начинаю осваивать этот удивительный мир. И вот с какой задачей столкнулся. Дело в том что на моем сайте очень много одинаковых страниц, но с разными данными.
Заполнять отдельно в ручную около 150 страниц это очень трудная задача, да и данные будут меняться со временем.
Решил все это организовать с помощью базы данных.
Каким образом:
Сайт построен на Вордпресс, тоесть у каждой созданной странице есть id. Но этот id скорее всего находиться в другой базе данных. Чтобы не загажевать основную базу сайта, я создал отдельную базу. В этой базе будут значения которые при совпадение id страницы и колонки id_page будут выводить данные именно этой строки.
Выводить данные я уже научился очень хорошо, а вот с этой задачей что то не очень получается справиться.
Ответ: Что то хрен поймешь что нужно.
Но этот id скорее всего находиться в другой базе данных
Как это скорее всего? Если эти 150 страниц выводятся из базу, перенеси все данные в базу Wordpress
Вопрос: Печать отчета на двустороннем бланке (вторая страница)

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

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

Внизу второй страницы необходимо впечатывать ФИО подписывающих лиц в строго определенном месте.


Не могу понять, как реализовать такое форматирование отчета.


ПС: не хочется потом повторно запускать бланк только для печати ФИО.
Ответ: forestry96,
скорректированный вариант (оба отчета одинаковы, для наглядности в них разное количество строк с данными в источнике данных отчета)

К сообщению приложен файл (db50-1.zip - 17Kb)
Вопрос: ssrs нумерация строк

Как в отчете на каждой странице начинать нумерацию строк сначала?
Ответ: tarrus, хорошо. А как тогда рабить по группам на страницы??)
Вопрос: Как текстовую строку преобразовать в набор переменных?

Добрый день,
Есть текстовая строка вида "A & B & C", ABC - переменные.
Как из этой строки вывести в отчет эти переменные?
Ответ:
Банджо
прошу не пинать

ну, как тут не пинать?...
Курточка снята, шея - голая...

Ты хоть мало-мало думаешь о тех, кто будет ЧИТАТЬ это?

+
Option Compare Database
Option Explicit
'

Private Sub ОбластьДанных_Format(Cancel As Integer, FormatCount As Integer)
Dim Vis, ARM, Ski, V_F, Typ, RKK, F_T, GDM, A_K, _
    OBO, Dia, Rec, Kon, Rep, Text1, Text2 As Variant
Public Out, FlText As Boolean

    'Формируем группы текста
    'Dia
    If Not IsNull(rst!Диагноз) Then
        Dia = (vbNewLine + "Диагноз: " + rst!Диагноз + vbNewLine + vbNewLine)
    End If
    
    'Rec
    If Not IsNull(rst!Назначения) Then
        Rec = (vbNewLine + vbNewLine + "Рекомендовано: " + _
                rst!Назначения + vbNewLine)
    End If
    
    '..............и тд ........
    
    'Rep
    If Not IsNull(rst!ПовторныйОсмотр) Then
        Rep = (vbNewLine + vbNewLine + "Повторный осмотр: " + _
                rst!ПовторныйОсмотр + vbNewLine)
    End If
    
    'Подсчет числа строк в каждой группе и нарастающим, и места разрыва
    CountLine = 0
    Text1 = "Dia"
    Text2 = Null
    FlText = False
    Me.КонецСтраницы.Visible = False
    
    'Dia
    If Not IsNull(rst!Диагноз) Then
        CountLine = CountLine + 6 'Диагноз
    End If
    
    'Rec
    If Not IsNull(rst!Назначения) Then
        CountLine = CountLine + 12
    End If
    
    If FlText = False And CountLine <= 45 Then 'Лимит строк на странице с _
        учетом чтобы поместилась подпись
        Text1 = Text1 & " & Rec"
    ElseIf FlText = False And CountLine > 45 Then
        FlText = True 'Выполнен разрыв
        Me.КонецСтраницы.Visible = True
        CLPlace = CountLine 'Запомнили число строк на разрыве
        Text2 = Text2 & "Rec & " 'Перешли на второе поле
    ElseIf FlText = True And CountLine > 45 Then
        Text2 = Text2 & "Rec & "
    End If
    .........и тд....
    
    'Rep
    If Not IsNull(rst!ПовторныйОсмотр) Then
        CountLine = CountLine + 3
    End If
    
    If FlText = False And CountLine <= 45 Then
        Text1 = Text1 & " & Rep"
    ElseIf FlText = False And CountLine > 45 Then
        FlText = True
        Me.КонецСтраницы.Visible = True
        CLPlace = CountLine
        Text2 = Text2 & "Rep"
    ElseIf FlText = True And CountLine > 45 Then
        Text2 = Text2 & "Rep"
    End If
    
    'Если место разрыва приходится не на последнюю группу, то в первое поле _
        переносим один набор из второго поля.
    'Если разрыв приходится на последнюю группу, то ничего не делаем.
    'Все имена переменных по 3 знака, поэтому использовал стрингоператорами. _
        Как сделать этот перенос если бы был набор переменных я не знаю.
    
    If CLPlace < CountLine Then
        Dop = Right(Text1, 3)
        Text1 = Left(Text1, (Len(Text1) - 5))
        Text2 = Dop & " & " & Text2
    End If
    
    Me![Текст1] = ??????????
    Me![Текст2] = ??????????
    
End Sub
Вопрос: Выбор строки в подчиненной форме по значению его поля

Приветствую коллеги.

Дошел до 3 страницы гугла....не нашел ответа.

Как выбрать (выделить, установить фокус) строку в подчиненной таблице зная значение одного из ее полей.

Имеется:
Главная1
Главная2
Главная2.Подчиненая2

По событию на Главная1 нужно

выделить строку в Главная2.Подчиненная2 где Главная2.Подчиненная2.поле.значение = Главная1.Поле.значение?
Ответ:
Сообщение от GrayShadow
По событию на Главная1 нужно
выделить строку в Главная2.Подчиненная2 где Главная2.Подчиненная2.поле.значение = Главная1.Поле.значение?
Код Visual Basic
1
2
3
4
5
6
7
8
9
With Me.Подчиненная2.Form.Recordset
   'Найти значение в подчиненной
   .Findfirst "поле='" & Me.Поле & "'"
   If Not .Nomatch Then
      'Значение найдено в подформе. Выделить найденную строку
      Me.Подчиненная2!поле.SetFocus
      docmd.RunCommand acCmdSelectRecord
   End If
End With
Синтаксис строки поиска зависит от типа поля. В примере тип поля текстовый. Для числовых полей и дат синтаксис несколько иной
Вопрос: Найти строки в таблице, которых нет в другой таблице

Здравствуйте!

Помогите, пожалуйста, составить запрос. Думаю думаю, никак не могу сообразить.
Значит есть таблица:
phones
--------
id
phone
name

и вторая таблица:
messages
--------
id
phone
text

Мне нужно выбрать из таблицы phones строки, у которых поле phone нет в строках таблицы messages.

За ранее благодарю!
Ответ:
Сообщение от ruslanyugov
Мне нужно выбрать из таблицы phones строки, у которых поле phone нет в строках таблицы messages.
На этой же странице
Вопрос: SSRS: печать отчета на одной странице

Есть отчет SSRS в Visual Studio 2010, который отображается на нескольких страницах. При печати мне нужно, чтобы он влез в одну страницу. Возможно ли такое? Речь идет именно про печать, а не про preview в дизайнере (на предпросмотре уже сделал на одну стр., поставив interactive heigh = 0).
Ответ: Да в настройках печати в VS уже выставлен формат А4. Но содержимое отчета физически не умещается на одной странице такого формата. Думал есть какая-то функция автоподгонки содержимого для печати на одной стр., чтобы ужималось все. Но походу такого нет. Майкрософт пишет про физическую страницу: "По умолчанию страница имеет размеры 21 x 29,7 см, но этот размер можно изменить с помощью панели Свойства отчета, диалогового окна Параметры страницы или при изменении свойств PageHeight и PageWidth на панели Свойства. Размеры страницы не увеличиваются и не уменьшаются, чтобы вместить содержимое текста отчета. Если необходимо, чтобы отчет появился на единственной странице, все содержимое текста отчета должно быть подогнано к одной физической странице. Если не удается выполнить такую подгонку и используется формат с жесткими разрывами страниц, для отчета потребуются дополнительные страницы. Если текст отчета выходит за правый край физической страницы, разрыв страницы вставляется по горизонтали. Если текст отчета выходит за нижний край физической страницы, разрыв страницы вставляется по вертикали." То есть говорится что вручную надо ужимать все.