Re[2]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 08:22
Оценка:
Здравствуйте, Enomay, Вы писали:

G>>1)создать нормализованные таблицы


E>собственно это та причина, по которой твой stackoverflow и не взлетит.


Он именно так и взлетел

G>>Что нам предложит NoSQL подход в данном случае?


E>всё то же самое, все те же view. только скорость работы выше.

Только я могу для MS SQL генерить запросы в коде с помощью Linq, а тебе заранее надо будет их в индексы БД прописать. Причем далеко не все NoSQL базы умеют синхронно индексы пересчитывать синхронно.

E>другое дело что без кеширования всё равно не взлетит.

Именно так и взлетело


А вообще чего языком чесать. дампы Stackoverflow доступны, качай, делай решение, показывай. Интерфейс не нужен, только структура. данные и забеги.
Re[27]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 08:27
Оценка:
Здравствуйте, rm822, Вы писали:

G>>В таблице Articles 100000 записей, Tags — 3000, в ArticleTags около 120000 равномерно распределены по разным тегам и статьям.

R>тест твой полная липа, у тебя каждый тэг используется раз эдак 30. Конечно тут будут рулить джойны.
R>Более реальная картина это Articles 100к , Tags — 100, в ArticleTags — 1М, и вот тут этот подход будет сосать

Той базы у меня не осталось, но мне не впадлу написать SQL для тестов
Структура
  Скрытый текст
CREATE TABLE [dbo].[Articles](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](100) NULL,
 CONSTRAINT [PK__Articles__3214EC077F60ED59] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Tags](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NULL,
 CONSTRAINT [PK__Tags__3214EC0707020F21] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[TagArticles](
    [Tag_Id] [int] NOT NULL,
    [Article_Id] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [Tag_Id] ASC,
    [Article_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[TagArticles]  WITH CHECK ADD  CONSTRAINT [Tag_Articles_Source] FOREIGN KEY([Tag_Id])
REFERENCES [dbo].[Tags] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[TagArticles] CHECK CONSTRAINT [Tag_Articles_Source]
GO

ALTER TABLE [dbo].[TagArticles]  WITH CHECK ADD  CONSTRAINT [Tag_Articles_Target] FOREIGN KEY([Article_Id])
REFERENCES [dbo].[Articles] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[TagArticles] CHECK CONSTRAINT [Tag_Articles_Target]



Заполнение
Declare @counter int

Set @counter = 0

While @counter < 100000
Begin
    insert Articles(Title) values('a'+STR(@counter))

    Set @counter = @counter + 1
End

Set @counter = 0

While @counter < 100
Begin
    insert Tags(Name) values('t'+STR(@counter))
    Set @counter = @counter + 1
End

insert into TagArticles(Tag_Id, Article_Id) 
select top 1000000 t.Id, a.Id from Articles a, Tags t order by  NEWID()


Запрос
select a.Id, a.Title from Articles a 
join [TagArticles] at1 on a.Id = at1.Article_Id
join [TagArticles] at2 on a.Id = at2.Article_Id
join [TagArticles] at3 on a.Id = at3.Article_Id
join Tags as t1 on at1.Tag_Id = t1.Id
join Tags as t2 on at2.Tag_Id = t2.Id
join Tags as t3 on at3.Tag_Id = t3.Id
where t1.Name = 't         9' and t2.Name = 't        70' and t3.Name = 't        99'



  Время ожидания при ответе сервера    337        336        346        339.6667

Это миллисекунды есличо.

База MS SQL Express 2008r2 with advanced services. Ноут у меня помощнее стал: 8 ядер (Express использует одно) и 8 гб памяти (Express использует один)
Оптимизаций не проводилось, схема тупо сгенерирована Entity Framework.

Для интересующихся: план в xml
  Скрытый текст
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.50.2500.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="99.1144" StatementId="1" StatementOptmLevel="FULL" StatementSubTreeCost="15.6103" StatementText="select a.Id, a.Title from Articles a 
join [TagArticles] at1 on a.Id = at1.Article_Id
join [TagArticles] at2 on a.Id = at2.Article_Id
join [TagArticles] at3 on a.Id = at3.Article_Id
join Tags as t1 on at1.Tag_Id = t1.Id
join Tags as t2 on at2.Tag_Id = t2.Id
join Tags as t3 on at3.Tag_Id = t3.Id
where t1.Name = 't         9' and t2.Name = 't        70' and t3.Name = 't        99'
" StatementType="SELECT" QueryHash="0xA9123E0238163C3C" QueryPlanHash="0x6C4D164247C0D442">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="0" MemoryGrant="12248" CachedPlanSize="112" CompileTime="2690" CompileCPU="1517" CompileMemory="3072">
            <RelOp AvgRowSize="115" EstimateCPU="0.000414298" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="99.1144" LogicalOp="Inner Join" NodeId="0" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="15.6103">
              <OutputList>
                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Id" />
                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Title" />
              </OutputList>
              <RunTimeInformation>
                <RunTimeCountersPerThread Thread="0" ActualRows="86" ActualEndOfScans="1" ActualExecutions="1" />
              </RunTimeInformation>
              <NestedLoops Optimized="false" WithUnorderedPrefetch="true">
                <OuterReferences>
                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                  <ColumnReference Column="Expr1014" />
                </OuterReferences>
                <RelOp AvgRowSize="11" EstimateCPU="0.0629338" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="99.1144" LogicalOp="Inner Join" NodeId="2" Parallel="false" PhysicalOp="Hash Match" EstimatedTotalSubtreeCost="15.3164">
                  <OutputList>
                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                  </OutputList>
                  <MemoryFractions Input="0" Output="0" />
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="86" ActualEndOfScans="1" ActualExecutions="1" />
                  </RunTimeInformation>
                  <Hash>
                    <DefinedValues />
                    <HashKeysBuild>
                      <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t3]" Column="Id" />
                    </HashKeysBuild>
                    <HashKeysProbe>
                      <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Tag_Id" />
                    </HashKeysProbe>
                    <RelOp AvgRowSize="37" EstimateCPU="0.000267" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Scan" NodeId="3" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.003392" TableCardinality="100">
                      <OutputList>
                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t3]" Column="Id" />
                      </OutputList>
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                      </RunTimeInformation>
                      <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                        <DefinedValues>
                          <DefinedValue>
                            <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t3]" Column="Id" />
                          </DefinedValue>
                        </DefinedValues>
                        <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Index="[PK__Tags__3214EC0707020F21]" Alias="[t3]" IndexKind="Clustered" />
                        <Predicate>
                          <ScalarOperator ScalarString="[ArticleTags.Context].[dbo].[Tags].[Name] as [t3].[Name]=N't        99'">
                            <Compare CompareOp="EQ">
                              <ScalarOperator>
                                <Identifier>
                                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t3]" Column="Name" />
                                </Identifier>
                              </ScalarOperator>
                              <ScalarOperator>
                                <Const ConstValue="N't        99'" />
                              </ScalarOperator>
                            </Compare>
                          </ScalarOperator>
                        </Predicate>
                      </IndexScan>
                    </RelOp>
                    <RelOp AvgRowSize="15" EstimateCPU="4.61001" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="9857.52" LogicalOp="Inner Join" NodeId="4" Parallel="false" PhysicalOp="Hash Match" EstimatedTotalSubtreeCost="15.25">
                      <OutputList>
                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Tag_Id" />
                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                      </OutputList>
                      <MemoryFractions Input="0.103042" Output="1" />
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="11277" ActualEndOfScans="1" ActualExecutions="1" />
                      </RunTimeInformation>
                      <Hash>
                        <DefinedValues />
                        <HashKeysBuild>
                          <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Article_Id" />
                        </HashKeysBuild>
                        <HashKeysProbe>
                          <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                        </HashKeysProbe>
                        <RelOp AvgRowSize="11" EstimateCPU="0.476807" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="996.264" LogicalOp="Inner Join" NodeId="5" Parallel="false" PhysicalOp="Hash Match" EstimatedTotalSubtreeCost="7.98115">
                          <OutputList>
                            <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Article_Id" />
                          </OutputList>
                          <MemoryFractions Input="0" Output="0" />
                          <RunTimeInformation>
                            <RunTimeCountersPerThread Thread="0" ActualRows="956" ActualEndOfScans="1" ActualExecutions="1" />
                          </RunTimeInformation>
                          <Hash>
                            <DefinedValues />
                            <HashKeysBuild>
                              <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t2]" Column="Id" />
                            </HashKeysBuild>
                            <HashKeysProbe>
                              <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Tag_Id" />
                            </HashKeysProbe>
                            <RelOp AvgRowSize="37" EstimateCPU="0.000267" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Scan" NodeId="6" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.003392" TableCardinality="100">
                              <OutputList>
                                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t2]" Column="Id" />
                              </OutputList>
                              <RunTimeInformation>
                                <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                              </RunTimeInformation>
                              <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                                <DefinedValues>
                                  <DefinedValue>
                                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t2]" Column="Id" />
                                  </DefinedValue>
                                </DefinedValues>
                                <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Index="[PK__Tags__3214EC0707020F21]" Alias="[t2]" IndexKind="Clustered" />
                                <Predicate>
                                  <ScalarOperator ScalarString="[ArticleTags.Context].[dbo].[Tags].[Name] as [t2].[Name]=N't        70'">
                                    <Compare CompareOp="EQ">
                                      <ScalarOperator>
                                        <Identifier>
                                          <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t2]" Column="Name" />
                                        </Identifier>
                                      </ScalarOperator>
                                      <ScalarOperator>
                                        <Const ConstValue="N't        70'" />
                                      </ScalarOperator>
                                    </Compare>
                                  </ScalarOperator>
                                </Predicate>
                              </IndexScan>
                            </RelOp>
                            <RelOp AvgRowSize="15" EstimateCPU="4.76698" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="100171" LogicalOp="Inner Join" NodeId="7" Parallel="false" PhysicalOp="Hash Match" EstimatedTotalSubtreeCost="7.5009">
                              <OutputList>
                                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Tag_Id" />
                                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Article_Id" />
                              </OutputList>
                              <MemoryFractions Input="1" Output="0.896958" />
                              <RunTimeInformation>
                                <RunTimeCountersPerThread Thread="0" ActualRows="110536" ActualEndOfScans="1" ActualExecutions="1" />
                              </RunTimeInformation>
                              <Hash>
                                <DefinedValues />
                                <HashKeysBuild>
                                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at1]" Column="Article_Id" />
                                </HashKeysBuild>
                                <HashKeysProbe>
                                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Article_Id" />
                                </HashKeysProbe>
                                <RelOp AvgRowSize="11" EstimateCPU="0.0418" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="10000" LogicalOp="Inner Join" NodeId="8" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0750776">
                                  <OutputList>
                                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at1]" Column="Article_Id" />
                                  </OutputList>
                                  <RunTimeInformation>
                                    <RunTimeCountersPerThread Thread="0" ActualRows="10122" ActualEndOfScans="1" ActualExecutions="1" />
                                  </RunTimeInformation>
                                  <NestedLoops Optimized="false">
                                    <OuterReferences>
                                      <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t1]" Column="Id" />
                                    </OuterReferences>
                                    <RelOp AvgRowSize="37" EstimateCPU="0.000267" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Scan" NodeId="9" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.003392" TableCardinality="100">
                                      <OutputList>
                                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t1]" Column="Id" />
                                      </OutputList>
                                      <RunTimeInformation>
                                        <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                                      </RunTimeInformation>
                                      <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                                        <DefinedValues>
                                          <DefinedValue>
                                            <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t1]" Column="Id" />
                                          </DefinedValue>
                                        </DefinedValues>
                                        <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Index="[PK__Tags__3214EC0707020F21]" Alias="[t1]" IndexKind="Clustered" />
                                        <Predicate>
                                          <ScalarOperator ScalarString="[ArticleTags.Context].[dbo].[Tags].[Name] as [t1].[Name]=N't         9'">
                                            <Compare CompareOp="EQ">
                                              <ScalarOperator>
                                                <Identifier>
                                                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t1]" Column="Name" />
                                                </Identifier>
                                              </ScalarOperator>
                                              <ScalarOperator>
                                                <Const ConstValue="N't         9'" />
                                              </ScalarOperator>
                                            </Compare>
                                          </ScalarOperator>
                                        </Predicate>
                                      </IndexScan>
                                    </RelOp>
                                    <RelOp AvgRowSize="11" EstimateCPU="0.011157" EstimateIO="0.0186806" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="10000" LogicalOp="Clustered Index Seek" NodeId="10" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0298376" TableCardinality="1000000">
                                      <OutputList>
                                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at1]" Column="Article_Id" />
                                      </OutputList>
                                      <RunTimeInformation>
                                        <RunTimeCountersPerThread Thread="0" ActualRows="10122" ActualEndOfScans="1" ActualExecutions="1" />
                                      </RunTimeInformation>
                                      <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false">
                                        <DefinedValues>
                                          <DefinedValue>
                                            <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at1]" Column="Article_Id" />
                                          </DefinedValue>
                                        </DefinedValues>
                                        <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Index="[PK__TagArtic__A5ACF87E0AD2A005]" Alias="[at1]" IndexKind="Clustered" />
                                        <SeekPredicates>
                                          <SeekPredicateNew>
                                            <SeekKeys>
                                              <Prefix ScanType="EQ">
                                                <RangeColumns>
                                                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at1]" Column="Tag_Id" />
                                                </RangeColumns>
                                                <RangeExpressions>
                                                  <ScalarOperator ScalarString="[ArticleTags.Context].[dbo].[Tags].[Id] as [t1].[Id]">
                                                    <Identifier>
                                                      <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Tags]" Alias="[t1]" Column="Id" />
                                                    </Identifier>
                                                  </ScalarOperator>
                                                </RangeExpressions>
                                              </Prefix>
                                            </SeekKeys>
                                          </SeekPredicateNew>
                                        </SeekPredicates>
                                      </IndexScan>
                                    </RelOp>
                                  </NestedLoops>
                                </RelOp>
                                <RelOp AvgRowSize="15" EstimateCPU="1.10016" EstimateIO="1.55868" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1000000" LogicalOp="Clustered Index Scan" NodeId="11" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="2.65884" TableCardinality="1000000">
                                  <OutputList>
                                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Tag_Id" />
                                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Article_Id" />
                                  </OutputList>
                                  <RunTimeInformation>
                                    <RunTimeCountersPerThread Thread="0" ActualRows="1000000" ActualEndOfScans="1" ActualExecutions="1" />
                                  </RunTimeInformation>
                                  <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                                    <DefinedValues>
                                      <DefinedValue>
                                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Tag_Id" />
                                      </DefinedValue>
                                      <DefinedValue>
                                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at2]" Column="Article_Id" />
                                      </DefinedValue>
                                    </DefinedValues>
                                    <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Index="[PK__TagArtic__A5ACF87E0AD2A005]" Alias="[at2]" IndexKind="Clustered" />
                                  </IndexScan>
                                </RelOp>
                              </Hash>
                            </RelOp>
                          </Hash>
                        </RelOp>
                        <RelOp AvgRowSize="15" EstimateCPU="1.10016" EstimateIO="1.55868" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1000000" LogicalOp="Clustered Index Scan" NodeId="14" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="2.65884" TableCardinality="1000000">
                          <OutputList>
                            <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Tag_Id" />
                            <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                          </OutputList>
                          <RunTimeInformation>
                            <RunTimeCountersPerThread Thread="0" ActualRows="1000000" ActualEndOfScans="1" ActualExecutions="1" />
                          </RunTimeInformation>
                          <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                            <DefinedValues>
                              <DefinedValue>
                                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Tag_Id" />
                              </DefinedValue>
                              <DefinedValue>
                                <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                              </DefinedValue>
                            </DefinedValues>
                            <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Index="[PK__TagArtic__A5ACF87E0AD2A005]" Alias="[at3]" IndexKind="Clustered" />
                          </IndexScan>
                        </RelOp>
                      </Hash>
                    </RelOp>
                  </Hash>
                </RelOp>
                <RelOp AvgRowSize="115" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="98.1144" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="17" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.293457" TableCardinality="100000">
                  <OutputList>
                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Id" />
                    <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Title" />
                  </OutputList>
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="86" ActualEndOfScans="0" ActualExecutions="86" />
                  </RunTimeInformation>
                  <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false">
                    <DefinedValues>
                      <DefinedValue>
                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Id" />
                      </DefinedValue>
                      <DefinedValue>
                        <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Title" />
                      </DefinedValue>
                    </DefinedValues>
                    <Object Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Index="[PK__Articles__3214EC077F60ED59]" Alias="[a]" IndexKind="Clustered" />
                    <SeekPredicates>
                      <SeekPredicateNew>
                        <SeekKeys>
                          <Prefix ScanType="EQ">
                            <RangeColumns>
                              <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[Articles]" Alias="[a]" Column="Id" />
                            </RangeColumns>
                            <RangeExpressions>
                              <ScalarOperator ScalarString="[ArticleTags.Context].[dbo].[TagArticles].[Article_Id] as [at3].[Article_Id]">
                                <Identifier>
                                  <ColumnReference Database="[ArticleTags.Context]" Schema="[dbo]" Table="[TagArticles]" Alias="[at3]" Column="Article_Id" />
                                </Identifier>
                              </ScalarOperator>
                            </RangeExpressions>
                          </Prefix>
                        </SeekKeys>
                      </SeekPredicateNew>
                    </SeekPredicates>
                  </IndexScan>
                </RelOp>
              </NestedLoops>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>
Re[28]: NoSQL vs RDBMS
От: rm822 Россия  
Дата: 25.01.12 08:44
Оценка: -1
это и называется epic fail
3 запроса\сек на ядро или ~30\cек на сервер
перфоманс ниже плинтуса
Re[29]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 10:05
Оценка: -1 :)
Здравствуйте, rm822, Вы писали:

R>это и называется epic fail

R>3 запроса\сек на ядро или ~30\cек на сервер
R>перфоманс ниже плинтуса

Так это 1)ноут с небыстрым диском 2)Express версия 3)никакой оптимизации 4)нет кеширования

В реальном приложении на реальном железе в 100 раз ускорить — не проблема.

А теперь ты продемонстрируй решение на nosql.
Re[3]: NoSQL vs RDBMS
От: Enomay  
Дата: 25.01.12 10:19
Оценка:
G>>>1)создать нормализованные таблицы
E>>собственно это та причина, по которой твой stackoverflow и не взлетит.
G>Он именно так и взлетел

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

G>>>Что нам предложит NoSQL подход в данном случае?

E>>всё то же самое, все те же view. только скорость работы выше.
G>Только я могу для MS SQL генерить запросы в коде с помощью Linq, а тебе заранее надо будет их в индексы БД прописать. Причем далеко не все NoSQL базы умеют синхронно индексы пересчитывать синхронно.

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

в общем-то для других баз так же есть поддержка linq, в том или ином виде. кто как пилит.
Re[30]: NoSQL vs RDBMS
От: rm822 Россия  
Дата: 25.01.12 10:40
Оценка:
G>Так это 1)ноут с небыстрым диском 2)Express версия 3)никакой оптимизации 4)нет кеширования
дешевые отмазки
300мс у тебя чистое процессорное время, все данные в кэше, обращений к диску нет вообще

G>В реальном приложении на реальном железе в 100 раз ускорить — не проблема.

ну покажи класс, ща посмотрим как ты 300мс процессорного времени сократишь до 3х
Re[31]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 10:50
Оценка:
Здравствуйте, rm822, Вы писали:

G>>Так это 1)ноут с небыстрым диском 2)Express версия 3)никакой оптимизации 4)нет кеширования

R>дешевые отмазки
Правда жизни.

R>300мс у тебя чистое процессорное время, все данные в кэше, обращений к диску нет вообще

Так тем более. На реальном серваке это будет не 300, а 30мс или того меньше и ядер будет задействовано побольше.

G>>В реальном приложении на реальном железе в 100 раз ускорить — не проблема.

R>ну покажи класс, ща посмотрим как ты 300мс процессорного времени сократишь до 3х

У меня ни реального железа, ни реального приложения нет. Одно добавление кеша на такие запросы сделает систему в 100 раз быстрее.

Давай лучше ты покажи класс на NoSQL системе. Те же самые условия, такой же запрос. 300 мс ответа и консистентные результаты.
Re[4]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 10:58
Оценка:
Здравствуйте, Enomay, Вы писали:

G>>>>1)создать нормализованные таблицы

E>>>собственно это та причина, по которой твой stackoverflow и не взлетит.
G>>Он именно так и взлетел

E>была статья, где они писали о денормализации в своей базе для увеличения производительности.


Ага, через 2 года после запуска Когда объемы стали в разы больше, чем в любом написаном тобой приложении.

G>>>>Что нам предложит NoSQL подход в данном случае?

E>>>всё то же самое, все те же view. только скорость работы выше.
G>>Только я могу для MS SQL генерить запросы в коде с помощью Linq, а тебе заранее надо будет их в индексы БД прописать. Причем далеко не все NoSQL базы умеют синхронно индексы пересчитывать синхронно.

E>если мы будем рассматривать RavenDB, то запросы так же пишутся на linq. индексы можно как создавать заранее, так и использовать динамически сгенерированные.

Мне RavenDB очень нравится. Только сырой он. Посмотри веб-касты, он умудряется глючить по 3 раза за 20 минут. Для продакшена такое вообще не пойдет. Пока единственное "промышленное" применение RavenDB — блог его автора.

E>индексы перестраиваются асинхронно, что позволяет достичь высокой скорости работы.

Ага, и забить на консистентность результатов... Такой же высокой скорости можно и в SQL добиться разделив хранилище на 2 — транзакционное и read-only с nolock, и сделать асинхронное перемещение.

E>в общем-то для других баз так же есть поддержка linq, в том или ином виде. кто как пилит.

Поддержка linq не решает если adhoc запросы не поддерживаются. А они поддерживаются единицами.
Re[5]: NoSQL vs RDBMS
От: Enomay  
Дата: 25.01.12 11:24
Оценка:
G>>>>>1)создать нормализованные таблицы
E>>>>собственно это та причина, по которой твой stackoverflow и не взлетит.
G>>>Он именно так и взлетел
E>>была статья, где они писали о денормализации в своей базе для увеличения производительности.
G>Ага, через 2 года после запуска Когда объемы стали в разы больше, чем в любом написаном тобой приложении.

ну конечно, ты ведь знаешь у кого какие объемы

у меня например, 25к записей в секунду. ms sql умирает

E>>если мы будем рассматривать RavenDB, то запросы так же пишутся на linq. индексы можно как создавать заранее, так и использовать динамически сгенерированные.

G>Мне RavenDB очень нравится. Только сырой он. Посмотри веб-касты, он умудряется глючить по 3 раза за 20 минут. Для продакшена такое вообще не пойдет. Пока единственное "промышленное" применение RavenDB — блог его автора.

может быть они используют нестабильную версию?
люди юзают в продакшене.

E>>индексы перестраиваются асинхронно, что позволяет достичь высокой скорости работы.

G>Ага, и забить на консистентность результатов... Такой же высокой скорости можно и в SQL добиться разделив хранилище на 2 — транзакционное и read-only с nolock, и сделать асинхронное перемещение.

данные неконсистенты уже в момент их отображения.
собственно, разбитием на 2 хранилища сейчас все и занимаются. только первым почему-то NoSQL выбирают. а вторым денормализованную РСУБД.

E>>в общем-то для других баз так же есть поддержка linq, в том или ином виде. кто как пилит.

G>Поддержка linq не решает если adhoc запросы не поддерживаются. А они поддерживаются единицами.

что есть "adhoc запросы" в данном контексте?
Re[6]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 11:37
Оценка:
Здравствуйте, Enomay, Вы писали:

G>>>>>>1)создать нормализованные таблицы

E>>>>>собственно это та причина, по которой твой stackoverflow и не взлетит.
G>>>>Он именно так и взлетел
E>>>была статья, где они писали о денормализации в своей базе для увеличения производительности.
G>>Ага, через 2 года после запуска Когда объемы стали в разы больше, чем в любом написаном тобой приложении.

E>ну конечно, ты ведь знаешь у кого какие объемы

Статистика прямо на главной странице. Можно эмпирически по этим данным посчитать объемы.

E>у меня например, 25к записей в секунду. ms sql умирает

Покажи какая durable база не умирает? Даже в фс писать без буферизации с такой скоростью не получится.

E>>>если мы будем рассматривать RavenDB, то запросы так же пишутся на linq. индексы можно как создавать заранее, так и использовать динамически сгенерированные.

G>>Мне RavenDB очень нравится. Только сырой он. Посмотри веб-касты, он умудряется глючить по 3 раза за 20 минут. Для продакшена такое вообще не пойдет. Пока единственное "промышленное" применение RavenDB — блог его автора.

E>может быть они используют нестабильную версию?

E>люди юзают в продакшене.
В продакшене юзают или несерьезные сайты (блоги), или те кто её написали и знают особенности.

E>>>индексы перестраиваются асинхронно, что позволяет достичь высокой скорости работы.

G>>Ага, и забить на консистентность результатов... Такой же высокой скорости можно и в SQL добиться разделив хранилище на 2 — транзакционное и read-only с nolock, и сделать асинхронное перемещение.

E>данные неконсистенты уже в момент их отображения.

Нет. Неконсистентность означает что ты пишешь и сразу читаешь. Если нету конкурентного доступа то ты должен прочитать ровно то что записал.
Например увидел вопрос в форуме, свой коммент или оценку. Или свой заказ на сайте в списке заказов.

E>собственно, разбитием на 2 хранилища сейчас все и занимаются. только первым почему-то NoSQL выбирают. а вторым денормализованную РСУБД.

Кто все? Обычная РСУБД выдерживает огромные, по меркам обычного проекта, объемы данных. Там нет смысла этим заниматься.
Посмотри пример выше: поиск по тегам на 10000 статей, без всяких FTS выполняется за 300мс в реальном времени, без всякой асинхронности. При этом каждой статье примерно 10 тегов соотвествует. Возьми РСДН и посмотри распределение тегов по статьям. там плотность на порядок меньше, а именно от нее зависит скорость работы запроса.


E>>>в общем-то для других баз так же есть поддержка linq, в том или ином виде. кто как пилит.

G>>Поддержка linq не решает если adhoc запросы не поддерживаются. А они поддерживаются единицами.

E>что есть "adhoc запросы" в данном контексте?


То что я могу взять A и сделать джоин с B, агрегацию по полю A.c и подзапрос по B.d
Ни одна из известных мне NoSQL баз такое сделать не позволяет. Ты должен в них заранее определить какие данные ты будешь запрашивать.
Re[7]: NoSQL vs RDBMS
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 25.01.12 11:57
Оценка:
Здравствуйте, gandjustas, Вы писали:


E>>собственно, разбитием на 2 хранилища сейчас все и занимаются. только первым почему-то NoSQL выбирают. а вторым денормализованную РСУБД.

G>Кто все? Обычная РСУБД выдерживает огромные, по меркам обычного проекта, объемы данных. Там нет смысла этим заниматься.
G>Посмотри пример выше: поиск по тегам на 10000 статей, без всяких FTS выполняется за 300мс в реальном времени, без всякой асинхронности. При этом каждой статье примерно 10 тегов соотвествует. Возьми РСДН и посмотри распределение тегов по статьям. там плотность на порядок меньше, а именно от нее зависит скорость работы запроса.

afair, в тех сырцах которые выложены, не было реализации тегов. Или уже что-то поменялось? Если ты про какой-то искуственный пример, то это микротест и относится к нему нужно соответственно. Тем более, что цифра 10000 — это просто смешно.
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 12:13
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Здравствуйте, gandjustas, Вы писали:



E>>>собственно, разбитием на 2 хранилища сейчас все и занимаются. только первым почему-то NoSQL выбирают. а вторым денормализованную РСУБД.

G>>Кто все? Обычная РСУБД выдерживает огромные, по меркам обычного проекта, объемы данных. Там нет смысла этим заниматься.
G>>Посмотри пример выше: поиск по тегам на 10000 статей, без всяких FTS выполняется за 300мс в реальном времени, без всякой асинхронности. При этом каждой статье примерно 10 тегов соотвествует. Возьми РСДН и посмотри распределение тегов по статьям. там плотность на порядок меньше, а именно от нее зависит скорость работы запроса.

ANS>afair, в тех сырцах которые выложены, не было реализации тегов. Или уже что-то поменялось? Если ты про какой-то искуственный пример, то это микротест и относится к нему нужно соответственно. Тем более, что цифра 10000 — это просто смешно.


Все есть. Читай посты. 10000 — опечатка, там на нолик больше.

Какой там тест меня мало интересует. Для начала пусть какая-нить NoSQL база результат покажет на тех же объемах. Желательно без FTS. FTS и я могу сделать на lucene.
Re[7]: NoSQL vs RDBMS
От: Enomay  
Дата: 25.01.12 12:35
Оценка:
E>>у меня например, 25к записей в секунду. ms sql умирает
G>Покажи какая durable база не умирает? Даже в фс писать без буферизации с такой скоростью не получится.

ну скажем MySQL справляется.

E>>может быть они используют нестабильную версию?

E>>люди юзают в продакшене.
G>В продакшене юзают или несерьезные сайты (блоги), или те кто её написали и знают особенности.

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

E>>данные неконсистенты уже в момент их отображения.

G>Нет. Неконсистентность означает что ты пишешь и сразу читаешь. Если нету конкурентного доступа то ты должен прочитать ровно то что записал.
G>Например увидел вопрос в форуме, свой коммент или оценку. Или свой заказ на сайте в списке заказов.

это уже детали реализации. отправив коммент, мы его можем сразу отобразить, но вот дать гарантию того, что он сохранится, не можем. и дело тут не в типа базы данных.
а можем и не отображать до тех пор, пока он не переместится во view базу.
собственно, придерживаясь Event Sourcing подхода, мы не можем и писать и читать одновременно. что, имхо, есть правильно.

E>>собственно, разбитием на 2 хранилища сейчас все и занимаются. только первым почему-то NoSQL выбирают. а вторым денормализованную РСУБД.

G>Кто все? Обычная РСУБД выдерживает огромные, по меркам обычного проекта, объемы данных. Там нет смысла этим заниматься.
G>Посмотри пример выше: поиск по тегам на 10000 статей, без всяких FTS выполняется за 300мс в реальном времени, без всякой асинхронности. При этом каждой статье примерно 10 тегов соотвествует. Возьми РСДН и посмотри распределение тегов по статьям. там плотность на порядок меньше, а именно от нее зависит скорость работы запроса.

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

E>>что есть "adhoc запросы" в данном контексте?

G>То что я могу взять A и сделать джоин с B, агрегацию по полю A.c и подзапрос по B.d
G>Ни одна из известных мне NoSQL баз такое сделать не позволяет. Ты должен в них заранее определить какие данные ты будешь запрашивать.

такое можно писать в RavenDB. такое можно делать и в других базах, хотя работать будет медленнее.
но что это даст? удобство разработки? так рано или поздно тебе в MS SQL придется делать вьюхи. что будет равносильно созданию индекса в NoSQL базе.
то есть мы ничего не выигрываем и ничего не теряем.
тем более с учетом того, что 80% данных достаются почти всегда по ключу.
Re[9]: NoSQL vs RDBMS
От: Enomay  
Дата: 25.01.12 12:40
Оценка:
G>Все есть. Читай посты. 10000 — опечатка, там на нолик больше.

G>Какой там тест меня мало интересует. Для начала пусть какая-нить NoSQL база результат покажет на тех же объемах. Желательно без FTS. FTS и я могу сделать на lucene.


где сама задача? можно попробовать сделать синтетический тест.
Re[8]: NoSQL vs RDBMS
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 25.01.12 13:13
Оценка:
Здравствуйте, Enomay, Вы писали:

E>>>у меня например, 25к записей в секунду. ms sql умирает

G>>Покажи какая durable база не умирает? Даже в фс писать без буферизации с такой скоростью не получится.

E>ну скажем MySQL справляется.


25K комитов в сек на одной железяке? Верится с трудом.
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[9]: NoSQL vs RDBMS
От: Enomay  
Дата: 25.01.12 13:28
Оценка:
E>>>>у меня например, 25к записей в секунду. ms sql умирает
G>>>Покажи какая durable база не умирает? Даже в фс писать без буферизации с такой скоростью не получится.

E>>ну скажем MySQL справляется.


ANS>25K комитов в сек на одной железяке? Верится с трудом.


ну не на 1
но MS SQL значительно хуже себя показывает в этом деле.
Re[9]: NoSQL vs RDBMS
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 25.01.12 14:04
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Все есть. Читай посты. 10000 — опечатка, там на нолик больше.


Какие посты? Лень пальцем показать иль нету ничего?

Ты про это? http://data.stackexchange.com/stackoverflow/query/785/how-many-upvotes-do-i-have-for-each-tag
Как этот запрос соотносится с этим:

* Tags — okay, time to blow out of the bullet points for a second.

StackOverflow limits you to five tags per question (answers aren't tagged), and all five are stored in this field. For example, for question 305223, the Tags field is "<offtopic><fun><not-programming-related><jon-skeet>". It's up to you to normalize these. Sam Saffron's SoSlow utility automatically creates Tags and PostsTags tables to normalize these.

btw, Мне написало '28976 rows returned in 6427 ms'. Это нормально? С учем того, что, скорее всего, всё влазит ОЗУ.

G>Какой там тест меня мало интересует.


Зря. Это ж R/O БД. Мало кому такое интересно.

G>Для начала пусть какая-нить NoSQL база результат покажет на тех же объемах.


Вопрос не ко мне. Но, имхо, ты привратно понимаешь термин NoSql.

G>Желательно без FTS. FTS и я могу сделать на lucene.
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 18:28
Оценка:
Здравствуйте, Enomay, Вы писали:

E>>>у меня например, 25к записей в секунду. ms sql умирает

G>>Покажи какая durable база не умирает? Даже в фс писать без буферизации с такой скоростью не получится.

E>ну скажем MySQL справляется.


Ох не верится. Я вот на ноуте запись в файл без буферизации прогнал, сильно меньше получилось.

E>>>данные неконсистенты уже в момент их отображения.

G>>Нет. Неконсистентность означает что ты пишешь и сразу читаешь. Если нету конкурентного доступа то ты должен прочитать ровно то что записал.
G>>Например увидел вопрос в форуме, свой коммент или оценку. Или свой заказ на сайте в списке заказов.

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

E>а можем и не отображать до тех пор, пока он не переместится во view базу.
E>собственно, придерживаясь Event Sourcing подхода, мы не можем и писать и читать одновременно. что, имхо, есть правильно.
не понял о чем ты? Вот мы делаем POST, потом GET. А не изменилось состояние, а потом через несколько GET мы получаем результаты. Это противоречит ожиданиям юзеров.

E>>>собственно, разбитием на 2 хранилища сейчас все и занимаются. только первым почему-то NoSQL выбирают. а вторым денормализованную РСУБД.

G>>Кто все? Обычная РСУБД выдерживает огромные, по меркам обычного проекта, объемы данных. Там нет смысла этим заниматься.
G>>Посмотри пример выше: поиск по тегам на 10000 статей, без всяких FTS выполняется за 300мс в реальном времени, без всякой асинхронности. При этом каждой статье примерно 10 тегов соотвествует. Возьми РСДН и посмотри распределение тегов по статьям. там плотность на порядок меньше, а именно от нее зависит скорость работы запроса.

E>это искусственные данные, и они сильно отличаются от того, что может быть на сервере.


Так слей реальные и прогони, в чем проблема?

E>такое можно писать в RavenDB. такое можно делать и в других базах, хотя работать будет медленнее.

E>но что это даст? удобство разработки? так рано или поздно тебе в MS SQL придется делать вьюхи. что будет равносильно созданию индекса в NoSQL базе.
Это даст то что индексированные вьюхи можно написать сильно позже, а в NoSQL ты должен такой дизайн upfront придумать.

E>то есть мы ничего не выигрываем и ничего не теряем.

Еще как выигрываем

E>тем более с учетом того, что 80% данных достаются почти всегда по ключу.

В NoSQL — да, в РСУБД зависит от задачи.
Re[10]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 18:29
Оценка:
Здравствуйте, Enomay, Вы писали:

G>>Все есть. Читай посты. 10000 — опечатка, там на нолик больше.


G>>Какой там тест меня мало интересует. Для начала пусть какая-нить NoSQL база результат покажет на тех же объемах. Желательно без FTS. FTS и я могу сделать на lucene.


E>где сама задача? можно попробовать сделать синтетический тест.


Это сильно давно было, можешь отмотать ветку назад. Что-то типа поиска статей по тегам, кто-то утверждал что это пипец как медленно будет без FTS.
Re[10]: NoSQL vs RDBMS
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.01.12 18:34
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Здравствуйте, gandjustas, Вы писали:


G>>Все есть. Читай посты. 10000 — опечатка, там на нолик больше.


ANS>Какие посты? Лень пальцем показать иль нету ничего?

Давно было, я не помню. В древовидном представлении иди вверх по ветке.

ANS>Ты про это? http://data.stackexchange.com/stackoverflow/query/785/how-many-upvotes-do-i-have-for-each-tag

Нет

ANS>btw, Мне написало '28976 rows returned in 6427 ms'. Это нормально? С учем того, что, скорее всего, всё влазит ОЗУ.

Кто и что написало? Если ты про запрос, то у меня при после перезапуска сервера выдает 1-1,5 сек. Далее по 300мсек.


G>>Для начала пусть какая-нить NoSQL база результат покажет на тех же объемах.

ANS>Вопрос не ко мне. Но, имхо, ты привратно понимаешь термин NoSql.
Этот вопрос уже был в этой теме. Что такое NoSQL? Ведь оно противопоставляется SQL (РСУБД), которые сейчас умеют и FTS, и xml, и много чего другого.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.