4

SQL For Smartiesで、JoeCelkoはSeriesテーブルのANSISQL定義を提供します(他の場所ではTallyまたはNumbersと呼ばれます)。彼の定義は、列の値が1から最大値まで一意で、正で、連続していることを保証します。

CREATE TABLE Series (
  seq INTEGER NOT NULL PRIMARY KEY,
  CONSTRAINT non_negative_nbr CHECK (seq > 0),
  CONSTRAINT numbers_are_complete CHECK ((SELECT COUNT(*) FROM Series) = (SELECT MAX(seq) FROM Series))
);

一意性は、PRIMARYKEY宣言によって保証されます。陽性は制約によって保証されますnon_negative_nbr。これらの2つの制約が設定されている場合、隣接性は制約によって保証されますnumbers_are_complete

SQL Serverは、チェック制約のサブクエリをサポートしていません。Seriesテーブルを作成しようとすると、次のようなエラーが発生します。

Msg 1046, Level 15, State 1, Line 4
Subqueries are not allowed in this context. Only scalar expressions are allowed.
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ')'.

サポートされていない制約を削除すると、次のnumbers_are_complete定義が残ります。

CREATE TABLE Series (
  seq INTEGER NOT NULL PRIMARY KEY,
  CONSTRAINT non_negative_nbr CHECK (seq > 0)
);

このバージョンのシリーズを作成しようとすると、成功します。

Command(s) completed successfully.

このバージョンのシリーズは、テーブル内の数値の連続性を強制しないため、脆弱です。

これを示すために、最初にテーブルにデータを入力する必要があります。ItzikBen-Ganが彼の記事「VirtualAuxiliaryTableof Numbers」で説明した手法を採用して、65,536行でこれを効率的に実行しました。

WITH
N0(_) AS (SELECT NULL UNION ALL SELECT NULL),
N1(_) AS (SELECT NULL FROM N0 AS L CROSS JOIN N0 AS R),
N2(_) AS (SELECT NULL FROM N1 AS L CROSS JOIN N1 AS R),
N3(_) AS (SELECT NULL FROM N2 AS L CROSS JOIN N2 AS R),
N4(_) AS (SELECT NULL FROM N3 AS L CROSS JOIN N3 AS R)
INSERT INTO Series (
  seq
)
SELECT
  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
FROM N4;

クエリは次のような出力を生成します。

(65536 row(s) affected)

これで、次のようなテーブルから選択して、65,536行を生成できます。

SELECT seq
FROM Series;

結果セットを切り捨てましたが、次のようになります。

seq
1
2
...
65535
65536

自分で確認すると、区間[1、65536]のすべての数値が結果セットに含まれていることがわかります。シリーズは連続しています。

ただし、範囲のエンドポイントではない行を削除することで、隣接関係を解消できます。

DELETE FROM Series
WHERE seq = 25788;

隣接が強制された場合、このステートメントはエラーを発生させますが、代わりに成功します。

(1 row(s) affected)

人間が目視検査で不足している値を見つけるのは難しいでしょう。彼らは、問題に取り組む前に、そもそも値が欠落しているのではないかと疑う必要があります。これらの理由から、Seriesデータの改ざんは、連続するSeriesテーブルに依存するSQLServerアプリケーションに微妙なバグを導入する簡単な方法です。

ユーザーがSequenceから読み取り、別のソースからの行を列挙するクエリを作成したと想定します。私が改ざんした後、そのクエリは特定の値の周りに誤った結果を生成するようになりました-25,788行目までに、すべてが1つずれています。

Seriesテーブルで欠落している値を検出するクエリを作成することは可能ですが、欠落している値が不可能になるようにテーブルを制約するにはどうすればよいですか?

4

3 に答える 3

4

私は3つの潜在的な提案があります:


(1)番号テーブルを読み取り専用にします(たとえば、更新/挿入/削除を拒否します)。なぜこのテーブルから削除するのですか?あなたのアプリは確かにそれをするべきではありません、そしてあなたのユーザーも手動でそうすることができないはずです。「このボタンは何をするのか」を押すユーザーにとって、これらすべてのチェック制約は必要ありません。ボタン、ボタンを簡単に削除できる場合。

DENY DELETE ON dbo.Serial TO [your_app_user];
-- repeat for individual users/roles

(2)そもそも削除を防ぐために、トリガーの代わりにトリガーを作成する方がさらに簡単です。

CREATE TRIGGER dbo.LeaveMyNumbersAlone
ON dbo.Serial
INSTEAD OF DELETE
AS
BEGIN
  SET NOCOUNT ON;
  RAISERROR('Please leave my numbers table alone.', 11, 1);
END

はい、これは打ち負かすことができますが、誰かがそれをするために本当に邪魔をしなければなりません。そして、これを行う可能性のある人々を雇用していて、データベースへの一般的なアクセス権を持つ人々を信頼している場合は、これが彼らが計画している最大の被害であることを祈ってください。

はい、数値テーブルを削除/再作成したり、別の場所に実装したりすると、トリガーを再実装するのを忘れる可能性があります。しかし、とにかくギャップに対処するために手動で行う可能性のあることも忘れてしまう可能性があります。


(3)その場で数値を導き出すことをいとわないのであれば、数値テーブルを完全に回避することができます。これには、必要な数に応じて、sys.all_columnsやsys.all_objectsなどのカタログビューを使用します。

;WITH n AS (SELECT TOP (10000) n FROM 
  (SELECT n = ROW_NUMBER() OVER
    (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
  ) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!

100行だけが必要な場合は、クロス結合なしでビューの1つを使用できます。さらに必要な場合は、ビューを追加できます。数字の表からあなたを遠ざけようとはしていませんが、これにより、(a)すべてのインスタンスで数字の表を作成することや(b)そのようなことに哲学的に反対している人々などの制限を回避できます(私は私の中で多くの人に出くわしましたキャリア)。


余談ですが、これは本当に製品に含まれているはずです。次のConnect項目で、実際のビジネスユースケースに投票して説明してください。

http://connect.microsoft.com/SQLServer/feedback/details/258733/add-a-built-in-table-of-numbers

于 2012-08-29T17:19:14.890 に答える
2

この問題を解決する1つの方法は、テーブルをビューに置き換えることです。

このビュー定義は、質問で参照されている同じ記事に基づいており、最大65,536の一意の、正の、連続した行を生成します。

CREATE VIEW SeriesView
AS
WITH
N0(_) AS (SELECT NULL UNION ALL SELECT NULL),
N1(_) AS (SELECT NULL FROM N0 AS L CROSS JOIN N0 AS R),
N2(_) AS (SELECT NULL FROM N1 AS L CROSS JOIN N1 AS R),
N3(_) AS (SELECT NULL FROM N2 AS L CROSS JOIN N2 AS R),
N4(_) AS (SELECT NULL FROM N3 AS L CROSS JOIN N3 AS R)
SELECT
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS seq
FROM N4;

このように、行番号は常にROW_NUMBER関数によってクエリ時に生成されます。ROW_NUMBER関数によって出力される値のセットは連続しており、すべての値は一意で正です。

ビューから削除しようとした場合:

DELETE FROM SeriesView
WHERE seq = 25788;

ビューが更新できないため、サーバーはエラーを発生させます。

Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'SeriesView' failed because it 

派生フィールドまたは定数フィールドが含まれます。

値をテーブルに格納する場合と比較して、この手法のパフォーマンスを比較していません。どちらも実際には十分に高速に見えますが、私はまだ本番環境でビューを使用していないことを認めています。

シリーズから選択するクエリのパフォーマンス調整は、ビューから選択するだけで生成される実行プランが大きいため、おそらくより困難になります。

これらの実行プランの長さを比較するだけで、見かけの複雑さを比較できます。

これは、質問のテーブルから選択して生成された実行プランです。

<?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.1" Build="10.0.5500.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
    <BatchSequence>
        <Batch>
            <Statements>
                <StmtSimple StatementCompId="1" StatementEstRows="65535" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="0.153148" StatementText="SELECT seq&#xD;&#xA;FROM Series;" StatementType="SELECT" QueryHash="0x5765DD2692E59AB9" QueryPlanHash="0x598E82F24F85C8B9">
                    <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="1" CachedPlanSize="8" CompileTime="0" CompileCPU="0" CompileMemory="80">
                        <RelOp AvgRowSize="11" EstimateCPU="0.0722455" EstimateIO="0.0809028" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="65535" LogicalOp="Clustered Index Scan" NodeId="0" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.153148" TableCardinality="65535">
                            <OutputList>
                                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[Series]" Column="seq" />
                            </OutputList>
                            <RunTimeInformation>
                                <RunTimeCountersPerThread Thread="0" ActualRows="65535" ActualEndOfScans="1" ActualExecutions="1" />
                            </RunTimeInformation>
                            <IndexScan Ordered="false" ForcedIndex="false" NoExpandHint="false">
                                <DefinedValues>
                                    <DefinedValue>
                                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[Series]" Column="seq" />
                                    </DefinedValue>
                                </DefinedValues>
                                <Object Database="[tempdb]" Schema="[dbo]" Table="[Series]" Index="[PK__Series__DDDFBCBE0F975522]" IndexKind="Clustered" />
                            </IndexScan>
                        </RelOp>
                    </QueryPlan>
                </StmtSimple>
            </Statements>
        </Batch>
    </BatchSequence>
</ShowPlanXML>

これは、私の回答のビューから選択して生成された実行プランです。

<?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.1" Build="10.0.5500.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
    <BatchSequence>
        <Batch>
            <Statements>
                <StmtSimple StatementCompId="1" StatementEstRows="65536" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="TimeOut" StatementSubTreeCost="0.692044" StatementText="SELECT seq&#xD;&#xA;FROM SeriesView;" StatementType="SELECT" QueryHash="0xD7D3DE2C825E3F56" QueryPlanHash="0x927D671566369AAC">
                    <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="1" CachedPlanSize="32" CompileTime="6" CompileCPU="6" CompileMemory="680">
                        <RelOp AvgRowSize="15" EstimateCPU="0.00524288" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="65536" LogicalOp="Compute Scalar" NodeId="0" Parallel="false" PhysicalOp="Sequence Project" EstimatedTotalSubtreeCost="0.692044">
                            <OutputList>
                                <ColumnReference Column="Expr1065" />
                            </OutputList>
                            <RunTimeInformation>
                                <RunTimeCountersPerThread Thread="0" ActualRows="65536" ActualEndOfScans="1" ActualExecutions="1" />
                            </RunTimeInformation>
                            <SequenceProject>
                                <DefinedValues>
                                    <DefinedValue>
                                        <ColumnReference Column="Expr1065" />
                                        <ScalarOperator ScalarString="row_number">
                                            <Sequence FunctionName="row_number" />
                                        </ScalarOperator>
                                    </DefinedValue>
                                </DefinedValues>
                                <RelOp AvgRowSize="15" EstimateCPU="0.00131072" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="65536" LogicalOp="Segment" NodeId="1" Parallel="false" PhysicalOp="Segment" EstimatedTotalSubtreeCost="0.686801">
                                    <OutputList>
                                        <ColumnReference Column="Expr1064" />
                                        <ColumnReference Column="Segment1066" />
                                    </OutputList>
                                    <RunTimeInformation>
                                        <RunTimeCountersPerThread Thread="0" ActualRows="65536" ActualEndOfScans="1" ActualExecutions="1" />
                                    </RunTimeInformation>
                                    <Segment>
                                        <GroupBy />
                                        <SegmentColumn>
                                            <ColumnReference Column="Segment1066" />
                                        </SegmentColumn>
                                        <RelOp AvgRowSize="11" EstimateCPU="0.0065536" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="65536" LogicalOp="Compute Scalar" NodeId="2" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="0.68549">
                                            <OutputList>
                                                <ColumnReference Column="Expr1064" />
                                            </OutputList>
                                            <ComputeScalar>
                                                <DefinedValues>
                                                    <DefinedValue>
                                                        <ColumnReference Column="Expr1064" />
                                                        <ScalarOperator ScalarString="NULL">
                                                            <Const ConstValue="NULL" />
                                                        </ScalarOperator>
                                                    </DefinedValue>
                                                </DefinedValues>
                                                <RelOp AvgRowSize="9" EstimateCPU="0.27394" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="65536" LogicalOp="Inner Join" NodeId="3" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.678937">
                                                    <OutputList />
                                                    <Warnings NoJoinPredicate="true" />
                                                    <RunTimeInformation>
                                                        <RunTimeCountersPerThread Thread="0" ActualRows="65536" ActualEndOfScans="1" ActualExecutions="1" />
                                                    </RunTimeInformation>
                                                    <NestedLoops Optimized="false">
                                                        <RelOp AvgRowSize="9" EstimateCPU="0.13697" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="32768" LogicalOp="Inner Join" NodeId="4" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.33946">
                                                            <OutputList />
                                                            <Warnings NoJoinPredicate="true" />
                                                            <RunTimeInformation>
                                                                <RunTimeCountersPerThread Thread="0" ActualRows="32768" ActualEndOfScans="1" ActualExecutions="1" />
                                                            </RunTimeInformation>
                                                            <NestedLoops Optimized="false">
                                                                <RelOp AvgRowSize="9" EstimateCPU="0.0684851" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="16384" LogicalOp="Inner Join" NodeId="5" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.169722">
                                                                    <OutputList />
                                                                    <Warnings NoJoinPredicate="true" />
                                                                    <RunTimeInformation>
                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="16384" ActualEndOfScans="1" ActualExecutions="1" />
                                                                    </RunTimeInformation>
                                                                    <NestedLoops Optimized="false">
                                                                        <RelOp AvgRowSize="9" EstimateCPU="0.0342426" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="8192" LogicalOp="Inner Join" NodeId="6" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0848524">
                                                                            <OutputList />
                                                                            <Warnings NoJoinPredicate="true" />
                                                                            <RunTimeInformation>
                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="8192" ActualEndOfScans="1" ActualExecutions="1" />
                                                                            </RunTimeInformation>
                                                                            <NestedLoops Optimized="false">
                                                                                <RelOp AvgRowSize="9" EstimateCPU="0.0171213" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="4096" LogicalOp="Inner Join" NodeId="7" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0424177">
                                                                                    <OutputList />
                                                                                    <Warnings NoJoinPredicate="true" />
                                                                                    <RunTimeInformation>
                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="4096" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                    </RunTimeInformation>
                                                                                    <NestedLoops Optimized="false">
                                                                                        <RelOp AvgRowSize="9" EstimateCPU="0.00856064" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="2048" LogicalOp="Inner Join" NodeId="8" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0212003">
                                                                                            <OutputList />
                                                                                            <Warnings NoJoinPredicate="true" />
                                                                                            <RunTimeInformation>
                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="2048" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                            </RunTimeInformation>
                                                                                            <NestedLoops Optimized="false">
                                                                                                <RelOp AvgRowSize="9" EstimateCPU="0.00428032" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1024" LogicalOp="Inner Join" NodeId="9" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0105915">
                                                                                                    <OutputList />
                                                                                                    <Warnings NoJoinPredicate="true" />
                                                                                                    <RunTimeInformation>
                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="1024" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                    </RunTimeInformation>
                                                                                                    <NestedLoops Optimized="false">
                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="0.00214016" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="512" LogicalOp="Inner Join" NodeId="10" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00528701">
                                                                                                            <OutputList />
                                                                                                            <Warnings NoJoinPredicate="true" />
                                                                                                            <RunTimeInformation>
                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="512" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                            </RunTimeInformation>
                                                                                                            <NestedLoops Optimized="false">
                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="0.00107008" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="256" LogicalOp="Inner Join" NodeId="11" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0026347">
                                                                                                                    <OutputList />
                                                                                                                    <Warnings NoJoinPredicate="true" />
                                                                                                                    <RunTimeInformation>
                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="256" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                    </RunTimeInformation>
                                                                                                                    <NestedLoops Optimized="false">
                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="0.00053504" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="128" LogicalOp="Inner Join" NodeId="12" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00130846">
                                                                                                                            <OutputList />
                                                                                                                            <Warnings NoJoinPredicate="true" />
                                                                                                                            <RunTimeInformation>
                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="128" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                            </RunTimeInformation>
                                                                                                                            <NestedLoops Optimized="false">
                                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="0.00026752" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="64" LogicalOp="Inner Join" NodeId="13" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.000645262">
                                                                                                                                    <OutputList />
                                                                                                                                    <Warnings NoJoinPredicate="true" />
                                                                                                                                    <RunTimeInformation>
                                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="64" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                                    </RunTimeInformation>
                                                                                                                                    <NestedLoops Optimized="false">
                                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="0.00013376" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="32" LogicalOp="Inner Join" NodeId="14" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.000313585">
                                                                                                                                            <OutputList />
                                                                                                                                            <Warnings NoJoinPredicate="true" />
                                                                                                                                            <RunTimeInformation>
                                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="32" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                                            </RunTimeInformation>
                                                                                                                                            <NestedLoops Optimized="false">
                                                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="6.688E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="16" LogicalOp="Inner Join" NodeId="15" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.000147668">
                                                                                                                                                    <OutputList />
                                                                                                                                                    <Warnings NoJoinPredicate="true" />
                                                                                                                                                    <RunTimeInformation>
                                                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="16" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                                                    </RunTimeInformation>
                                                                                                                                                    <NestedLoops Optimized="false">
                                                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="3.344E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="8" LogicalOp="Inner Join" NodeId="16" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="6.4631E-05">
                                                                                                                                                            <OutputList />
                                                                                                                                                            <Warnings NoJoinPredicate="true" />
                                                                                                                                                            <RunTimeInformation>
                                                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="8" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                                                            </RunTimeInformation>
                                                                                                                                                            <NestedLoops Optimized="false">
                                                                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="1.672E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="4" LogicalOp="Inner Join" NodeId="17" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="2.3034E-05">
                                                                                                                                                                    <OutputList />
                                                                                                                                                                    <Warnings NoJoinPredicate="true" />
                                                                                                                                                                    <RunTimeInformation>
                                                                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="4" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                                                                    </RunTimeInformation>
                                                                                                                                                                    <NestedLoops Optimized="false">
                                                                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="2" LogicalOp="Constant Scan" NodeId="18" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="2.157E-06">
                                                                                                                                                                            <OutputList />
                                                                                                                                                                            <RunTimeInformation>
                                                                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="2" ActualEndOfScans="1" ActualExecutions="1" />
                                                                                                                                                                            </RunTimeInformation>
                                                                                                                                                                            <ConstantScan />
                                                                                                                                                                        </RelOp>
                                                                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="1" EstimateRows="2" LogicalOp="Constant Scan" NodeId="19" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="4.157E-06">
                                                                                                                                                                            <OutputList />
                                                                                                                                                                            <RunTimeInformation>
                                                                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="4" ActualEndOfScans="2" ActualExecutions="2" />
                                                                                                                                                                            </RunTimeInformation>
                                                                                                                                                                            <ConstantScan />
                                                                                                                                                                        </RelOp>
                                                                                                                                                                    </NestedLoops>
                                                                                                                                                                </RelOp>
                                                                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="1" EstimateRows="2" LogicalOp="Constant Scan" NodeId="20" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="4.157E-06">
                                                                                                                                                                    <OutputList />
                                                                                                                                                                    <RunTimeInformation>
                                                                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="8" ActualEndOfScans="4" ActualExecutions="4" />
                                                                                                                                                                    </RunTimeInformation>
                                                                                                                                                                    <ConstantScan />
                                                                                                                                                                </RelOp>
                                                                                                                                                            </NestedLoops>
                                                                                                                                                        </RelOp>
                                                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="1" EstimateRows="2" LogicalOp="Constant Scan" NodeId="21" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="4.157E-06">
                                                                                                                                                            <OutputList />
                                                                                                                                                            <RunTimeInformation>
                                                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="16" ActualEndOfScans="8" ActualExecutions="8" />
                                                                                                                                                            </RunTimeInformation>
                                                                                                                                                            <ConstantScan />
                                                                                                                                                        </RelOp>
                                                                                                                                                    </NestedLoops>
                                                                                                                                                </RelOp>
                                                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="15" EstimateRows="2" LogicalOp="Constant Scan" NodeId="22" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="3.2157E-05">
                                                                                                                                                    <OutputList />
                                                                                                                                                    <RunTimeInformation>
                                                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="32" ActualEndOfScans="16" ActualExecutions="16" />
                                                                                                                                                    </RunTimeInformation>
                                                                                                                                                    <ConstantScan />
                                                                                                                                                </RelOp>
                                                                                                                                            </NestedLoops>
                                                                                                                                        </RelOp>
                                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="15" EstimateRows="2" LogicalOp="Constant Scan" NodeId="23" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="3.2157E-05">
                                                                                                                                            <OutputList />
                                                                                                                                            <RunTimeInformation>
                                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="64" ActualEndOfScans="32" ActualExecutions="32" />
                                                                                                                                            </RunTimeInformation>
                                                                                                                                            <ConstantScan />
                                                                                                                                        </RelOp>
                                                                                                                                    </NestedLoops>
                                                                                                                                </RelOp>
                                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="15" EstimateRows="2" LogicalOp="Constant Scan" NodeId="24" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="3.2157E-05">
                                                                                                                                    <OutputList />
                                                                                                                                    <RunTimeInformation>
                                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="128" ActualEndOfScans="64" ActualExecutions="64" />
                                                                                                                                    </RunTimeInformation>
                                                                                                                                    <ConstantScan />
                                                                                                                                </RelOp>
                                                                                                                            </NestedLoops>
                                                                                                                        </RelOp>
                                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="15" EstimateRows="2" LogicalOp="Constant Scan" NodeId="25" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="3.2157E-05">
                                                                                                                            <OutputList />
                                                                                                                            <RunTimeInformation>
                                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="256" ActualEndOfScans="128" ActualExecutions="128" />
                                                                                                                            </RunTimeInformation>
                                                                                                                            <ConstantScan />
                                                                                                                        </RelOp>
                                                                                                                    </NestedLoops>
                                                                                                                </RelOp>
                                                                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="255" EstimateRows="2" LogicalOp="Constant Scan" NodeId="26" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.000512157">
                                                                                                                    <OutputList />
                                                                                                                    <RunTimeInformation>
                                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="512" ActualEndOfScans="256" ActualExecutions="256" />
                                                                                                                    </RunTimeInformation>
                                                                                                                    <ConstantScan />
                                                                                                                </RelOp>
                                                                                                            </NestedLoops>
                                                                                                        </RelOp>
                                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="255" EstimateRows="2" LogicalOp="Constant Scan" NodeId="27" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.000512157">
                                                                                                            <OutputList />
                                                                                                            <RunTimeInformation>
                                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="1024" ActualEndOfScans="512" ActualExecutions="512" />
                                                                                                            </RunTimeInformation>
                                                                                                            <ConstantScan />
                                                                                                        </RelOp>
                                                                                                    </NestedLoops>
                                                                                                </RelOp>
                                                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="255" EstimateRows="2" LogicalOp="Constant Scan" NodeId="28" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.000512157">
                                                                                                    <OutputList />
                                                                                                    <RunTimeInformation>
                                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="2048" ActualEndOfScans="1024" ActualExecutions="1024" />
                                                                                                    </RunTimeInformation>
                                                                                                    <ConstantScan />
                                                                                                </RelOp>
                                                                                            </NestedLoops>
                                                                                        </RelOp>
                                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="255" EstimateRows="2" LogicalOp="Constant Scan" NodeId="29" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.000512157">
                                                                                            <OutputList />
                                                                                            <RunTimeInformation>
                                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="4096" ActualEndOfScans="2048" ActualExecutions="2048" />
                                                                                            </RunTimeInformation>
                                                                                            <ConstantScan />
                                                                                        </RelOp>
                                                                                    </NestedLoops>
                                                                                </RelOp>
                                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="4095" EstimateRows="2" LogicalOp="Constant Scan" NodeId="30" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.00819216">
                                                                                    <OutputList />
                                                                                    <RunTimeInformation>
                                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="8192" ActualEndOfScans="4096" ActualExecutions="4096" />
                                                                                    </RunTimeInformation>
                                                                                    <ConstantScan />
                                                                                </RelOp>
                                                                            </NestedLoops>
                                                                        </RelOp>
                                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="4095" EstimateRows="2" LogicalOp="Constant Scan" NodeId="31" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.00819216">
                                                                            <OutputList />
                                                                            <RunTimeInformation>
                                                                                <RunTimeCountersPerThread Thread="0" ActualRows="16384" ActualEndOfScans="8192" ActualExecutions="8192" />
                                                                            </RunTimeInformation>
                                                                            <ConstantScan />
                                                                        </RelOp>
                                                                    </NestedLoops>
                                                                </RelOp>
                                                                <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="4095" EstimateRows="2" LogicalOp="Constant Scan" NodeId="32" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.00819216">
                                                                    <OutputList />
                                                                    <RunTimeInformation>
                                                                        <RunTimeCountersPerThread Thread="0" ActualRows="32768" ActualEndOfScans="16384" ActualExecutions="16384" />
                                                                    </RunTimeInformation>
                                                                    <ConstantScan />
                                                                </RelOp>
                                                            </NestedLoops>
                                                        </RelOp>
                                                        <RelOp AvgRowSize="9" EstimateCPU="2.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="4095" EstimateRows="2" LogicalOp="Constant Scan" NodeId="33" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="0.00819216">
                                                            <OutputList />
                                                            <RunTimeInformation>
                                                                <RunTimeCountersPerThread Thread="0" ActualRows="65536" ActualEndOfScans="32768" ActualExecutions="32768" />
                                                            </RunTimeInformation>
                                                            <ConstantScan />
                                                        </RelOp>
                                                    </NestedLoops>
                                                </RelOp>
                                            </ComputeScalar>
                                        </RelOp>
                                    </Segment>
                                </RelOp>
                            </SequenceProject>
                        </RelOp>
                    </QueryPlan>
                </StmtSimple>
            </Statements>
        </Batch>
    </BatchSequence>
</ShowPlanXML>

2つ目は、クロス結合が多いため、はるかに大きくなります。

于 2012-08-29T17:06:27.003 に答える
1

numbers_are_complete代わりに、制約クエリをトリガーに移動してくださいINSERT/UPDATE/DELETE。問題はありません。

于 2012-08-29T17:09:29.033 に答える