I need some help with a test, please.

  • Crud... I'm going to have to load 2K8 to actually troubleshoot this problem. I'm off to work. I'll try to load 2k8 tonight. Wish me luck. 😉

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • Jeff Moden (9/20/2010)


    HowardW (9/20/2010)


    Let me know if I've missed any options that you need:

    Howard, can you confirm that's from a 2K8 Version of Adventure works? Thanks.

    Yep - downloaded and installed from here today:

    http://msftdbprodsamples.codeplex.com/releases/view/37109

  • Jeff from the AdventureWorks2008 that was utilized in my tests of Brad Schulz's code, as posted by yourself. Table defs from SSMS 2008 using the "Script As" feature.

    [USE [AdventureWorks2008]

    GO

    /****** Object: Table [Sales].[SalesOrderDetail] Script Date: 09/20/2010 09:15:54 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    CREATE TABLE [Sales].[SalesOrderDetail](

    [SalesOrderID] [int] NOT NULL,

    [SalesOrderDetailID] [int] IDENTITY(1,1) NOT NULL,

    [CarrierTrackingNumber] [nvarchar](25) NULL,

    [OrderQty] [smallint] NOT NULL,

    [ProductID] [int] NOT NULL,

    [SpecialOfferID] [int] NOT NULL,

    [UnitPrice] [money] NOT NULL,

    [UnitPriceDiscount] [money] NOT NULL,

    [LineTotal] AS (isnull(([UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty],(0.0))),

    [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL,

    [ModifiedDate] [datetime] NOT NULL,

    CONSTRAINT [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY CLUSTERED

    (

    [SalesOrderID] ASC,

    [SalesOrderDetailID] 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

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key. Foreign key to SalesOrderHeader.SalesOrderID.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'SalesOrderID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key. One incremental unique number per product sold.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'SalesOrderDetailID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Shipment tracking number supplied by the shipper.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'CarrierTrackingNumber'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Quantity ordered per product.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'OrderQty'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Product sold to customer. Foreign key to Product.ProductID.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'ProductID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Promotional code. Foreign key to SpecialOffer.SpecialOfferID.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'SpecialOfferID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Selling price of a single product.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'UnitPrice'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Discount amount.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'UnitPriceDiscount'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Per product subtotal. Computed as UnitPrice * (1 - UnitPriceDiscount) * OrderQty.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'LineTotal'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ROWGUIDCOL number uniquely identifying the record. Used to support a merge replication sample.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'rowguid'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Date and time the record was last updated.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'COLUMN',@level2name=N'ModifiedDate'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Individual products associated with a specific sales order. See SalesOrderHeader.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key (clustered) constraint' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] WITH CHECK ADD CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID] FOREIGN KEY([SalesOrderID])

    REFERENCES [Sales].[SalesOrderHeader] ([SalesOrderID])

    ON DELETE CASCADE

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] CHECK CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Foreign key constraint referencing SalesOrderHeader.PurchaseOrderID.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] WITH CHECK ADD CONSTRAINT [FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID] FOREIGN KEY([SpecialOfferID], [ProductID])

    REFERENCES [Sales].[SpecialOfferProduct] ([SpecialOfferID], [ProductID])

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] CHECK CONSTRAINT [FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Foreign key constraint referencing SpecialOfferProduct.SpecialOfferIDProductID.' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] WITH CHECK ADD CONSTRAINT [CK_SalesOrderDetail_OrderQty] CHECK (([OrderQty]>(0)))

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] CHECK CONSTRAINT [CK_SalesOrderDetail_OrderQty]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [OrderQty] > (0)' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'CK_SalesOrderDetail_OrderQty'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] WITH CHECK ADD CONSTRAINT [CK_SalesOrderDetail_UnitPrice] CHECK (([UnitPrice]>=(0.00)))

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] CHECK CONSTRAINT [CK_SalesOrderDetail_UnitPrice]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [UnitPrice] >= (0.00)' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'CK_SalesOrderDetail_UnitPrice'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] WITH CHECK ADD CONSTRAINT [CK_SalesOrderDetail_UnitPriceDiscount] CHECK (([UnitPriceDiscount]>=(0.00)))

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] CHECK CONSTRAINT [CK_SalesOrderDetail_UnitPriceDiscount]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [UnitPriceDiscount] >= (0.00)' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'CK_SalesOrderDetail_UnitPriceDiscount'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] ADD CONSTRAINT [DF_SalesOrderDetail_UnitPriceDiscount] DEFAULT ((0.0)) FOR [UnitPriceDiscount]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of 0.0' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'DF_SalesOrderDetail_UnitPriceDiscount'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] ADD CONSTRAINT [DF_SalesOrderDetail_rowguid] DEFAULT (newid()) FOR [rowguid]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of NEWID()' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'DF_SalesOrderDetail_rowguid'

    GO

    ALTER TABLE [Sales].[SalesOrderDetail] ADD CONSTRAINT [DF_SalesOrderDetail_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of GETDATE()' , @level0type=N'SCHEMA',@level0name=N'Sales', @level1type=N'TABLE',@level1name=N'SalesOrderDetail', @level2type=N'CONSTRAINT',@level2name=N'DF_SalesOrderDetail_ModifiedDate'

    GO

    /code]

    USE [AdventureWorks2008]

    GO

    /****** Object: Table [Production].[Product] Script Date: 09/20/2010 09:17:33 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    CREATE TABLE [Production].[Product](

    [ProductID] [int] IDENTITY(1,1) NOT NULL,

    [Name] [dbo].[Name] NOT NULL,

    [ProductNumber] [nvarchar](25) NOT NULL,

    [MakeFlag] [dbo].[Flag] NOT NULL,

    [FinishedGoodsFlag] [dbo].[Flag] NOT NULL,

    [Color] [nvarchar](15) NULL,

    [SafetyStockLevel] [smallint] NOT NULL,

    [ReorderPoint] [smallint] NOT NULL,

    [StandardCost] [money] NOT NULL,

    [ListPrice] [money] NOT NULL,

    [Size] [nvarchar](5) NULL,

    [SizeUnitMeasureCode] [nchar](3) NULL,

    [WeightUnitMeasureCode] [nchar](3) NULL,

    [Weight] [decimal](8, 2) NULL,

    [DaysToManufacture] [int] NOT NULL,

    [ProductLine] [nchar](2) NULL,

    [Class] [nchar](2) NULL,

    [Style] [nchar](2) NULL,

    [ProductSubcategoryID] [int] NULL,

    [ProductModelID] [int] NULL,

    [SellStartDate] [datetime] NOT NULL,

    [SellEndDate] [datetime] NULL,

    [DiscontinuedDate] [datetime] NULL,

    [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL,

    [ModifiedDate] [datetime] NOT NULL,

    CONSTRAINT [PK_Product_ProductID] PRIMARY KEY CLUSTERED

    (

    [ProductID] 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

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key for Product records.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ProductID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Name of the product.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'Name'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Unique product identification number.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ProductNumber'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'0 = Product is purchased, 1 = Product is manufactured in-house.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'MakeFlag'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'0 = Product is not a salable item. 1 = Product is salable.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'FinishedGoodsFlag'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Product color.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'Color'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Minimum inventory quantity. ' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'SafetyStockLevel'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Inventory level that triggers a purchase order or work order. ' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ReorderPoint'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Standard cost of the product.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'StandardCost'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Selling price.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ListPrice'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Product size.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'Size'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Unit of measure for Size column.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'SizeUnitMeasureCode'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Unit of measure for Weight column.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'WeightUnitMeasureCode'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Product weight.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'Weight'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Number of days required to manufacture the product.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'DaysToManufacture'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'R = Road, M = Mountain, T = Touring, S = Standard' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ProductLine'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'H = High, M = Medium, L = Low' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'Class'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'W = Womens, M = Mens, U = Universal' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'Style'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Product is a member of this product subcategory. Foreign key to ProductSubCategory.ProductSubCategoryID. ' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ProductSubcategoryID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Product is a member of this product model. Foreign key to ProductModel.ProductModelID.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ProductModelID'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Date the product was available for sale.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'SellStartDate'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Date the product was no longer available for sale.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'SellEndDate'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Date the product was discontinued.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'DiscontinuedDate'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ROWGUIDCOL number uniquely identifying the record. Used to support a merge replication sample.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'rowguid'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Date and time the record was last updated.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'COLUMN',@level2name=N'ModifiedDate'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Products sold or used in the manfacturing of sold products.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product'

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Primary key (clustered) constraint' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'PK_Product_ProductID'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [FK_Product_ProductModel_ProductModelID] FOREIGN KEY([ProductModelID])

    REFERENCES [Production].[ProductModel] ([ProductModelID])

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [FK_Product_ProductModel_ProductModelID]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Foreign key constraint referencing ProductModel.ProductModelID.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'FK_Product_ProductModel_ProductModelID'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [FK_Product_ProductSubcategory_ProductSubcategoryID] FOREIGN KEY([ProductSubcategoryID])

    REFERENCES [Production].[ProductSubcategory] ([ProductSubcategoryID])

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [FK_Product_ProductSubcategory_ProductSubcategoryID]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Foreign key constraint referencing ProductSubcategory.ProductSubcategoryID.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'FK_Product_ProductSubcategory_ProductSubcategoryID'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [FK_Product_UnitMeasure_SizeUnitMeasureCode] FOREIGN KEY([SizeUnitMeasureCode])

    REFERENCES [Production].[UnitMeasure] ([UnitMeasureCode])

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [FK_Product_UnitMeasure_SizeUnitMeasureCode]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Foreign key constraint referencing UnitMeasure.UnitMeasureCode.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'FK_Product_UnitMeasure_SizeUnitMeasureCode'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [FK_Product_UnitMeasure_WeightUnitMeasureCode] FOREIGN KEY([WeightUnitMeasureCode])

    REFERENCES [Production].[UnitMeasure] ([UnitMeasureCode])

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [FK_Product_UnitMeasure_WeightUnitMeasureCode]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Foreign key constraint referencing UnitMeasure.UnitMeasureCode.' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'FK_Product_UnitMeasure_WeightUnitMeasureCode'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_Class] CHECK ((upper([Class])='H' OR upper([Class])='M' OR upper([Class])='L' OR [Class] IS NULL))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_Class]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [Class]=''h'' OR [Class]=''m'' OR [Class]=''l'' OR [Class]=''H'' OR [Class]=''M'' OR [Class]=''L'' OR [Class] IS NULL' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_Class'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_DaysToManufacture] CHECK (([DaysToManufacture]>=(0)))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_DaysToManufacture]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [DaysToManufacture] >= (0)' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_DaysToManufacture'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_ListPrice] CHECK (([ListPrice]>=(0.00)))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_ListPrice]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [ListPrice] >= (0.00)' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_ListPrice'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_ProductLine] CHECK ((upper([ProductLine])='R' OR upper([ProductLine])='M' OR upper([ProductLine])='T' OR upper([ProductLine])='S' OR [ProductLine] IS NULL))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_ProductLine]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [ProductLine]=''r'' OR [ProductLine]=''m'' OR [ProductLine]=''t'' OR [ProductLine]=''s'' OR [ProductLine]=''R'' OR [ProductLine]=''M'' OR [ProductLine]=''T'' OR [ProductLine]=''S'' OR [ProductLine] IS NULL' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_ProductLine'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_ReorderPoint] CHECK (([ReorderPoint]>(0)))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_ReorderPoint]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [ReorderPoint] > (0)' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_ReorderPoint'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_SafetyStockLevel] CHECK (([SafetyStockLevel]>(0)))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_SafetyStockLevel]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [SafetyStockLevel] > (0)' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_SafetyStockLevel'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_SellEndDate] CHECK (([SellEndDate]>=[SellStartDate] OR [SellEndDate] IS NULL))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_SellEndDate]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [SellEndDate] >= [SellStartDate] OR [SellEndDate] IS NULL' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_SellEndDate'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_StandardCost] CHECK (([StandardCost]>=(0.00)))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_StandardCost]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [SafetyStockLevel] > (0)' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_StandardCost'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_Style] CHECK ((upper([Style])='U' OR upper([Style])='M' OR upper([Style])='W' OR [Style] IS NULL))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_Style]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [Style]=''u'' OR [Style]=''m'' OR [Style]=''w'' OR [Style]=''U'' OR [Style]=''M'' OR [Style]=''W'' OR [Style] IS NULL' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_Style'

    GO

    ALTER TABLE [Production].[Product] WITH CHECK ADD CONSTRAINT [CK_Product_Weight] CHECK (([Weight]>(0.00)))

    GO

    ALTER TABLE [Production].[Product] CHECK CONSTRAINT [CK_Product_Weight]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Check constraint [Weight] > (0.00)' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'CK_Product_Weight'

    GO

    ALTER TABLE [Production].[Product] ADD CONSTRAINT [DF_Product_MakeFlag] DEFAULT ((1)) FOR [MakeFlag]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of 1' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'DF_Product_MakeFlag'

    GO

    ALTER TABLE [Production].[Product] ADD CONSTRAINT [DF_Product_FinishedGoodsFlag] DEFAULT ((1)) FOR [FinishedGoodsFlag]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of 1' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'DF_Product_FinishedGoodsFlag'

    GO

    ALTER TABLE [Production].[Product] ADD CONSTRAINT [DF_Product_rowguid] DEFAULT (newid()) FOR [rowguid]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of NEWID()' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'DF_Product_rowguid'

    GO

    ALTER TABLE [Production].[Product] ADD CONSTRAINT [DF_Product_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]

    GO

    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Default constraint value of GETDATE()' , @level0type=N'SCHEMA',@level0name=N'Production', @level1type=N'TABLE',@level1name=N'Product', @level2type=N'CONSTRAINT',@level2name=N'DF_Product_ModifiedDate'

    GO

    If everything seems to be going well, you have obviously overlooked something.

    Ron

    Please help us, help you -before posting a question please read[/url]
    Before posting a performance problem please read[/url]

  • Jeff Moden (9/20/2010)


    Ah... perfect, Paul. It looks like the Tally Table join became a Cartesian Join of sorts. I haven't loaded up 2k8, yet.

    It's just a 'performance spool' (sort + lazy spool combination) introduced based on inaccurate/missing statistical information. If you disable the performance spool optimization with DBCC TRACEON (8690), you get a much better plan.

    edit: this trace flag should not be enabled on a production server without instructions from Microsoft CSS. It does more than just disable the perf spool optimization. Turn it off afterwards, and clear the procedure cache.

    For those of you that don't know what a perf spool is, is an optimization for nested loops join. When the outer input is estimated to have a high number of duplicate values, the optimizer introduces a sort before the join to ensure they arrive in order (so duplicates are grouped together).

    The lazy spool on the inner input to the loops join then caches the last result from the inner input. The idea is that duplicate outer input values can be matched from the spool's cache, rather than re-executing the sub-tree under the spool.

    Unfortunately, bad statistical information results in the spool replaying 1,000 rows for each of the 121,317 rows arriving at the loops join's outer input. 1,000 x 121,317 = 121,317,000 rows. Not optimal!

    A detailed analysis would take me hours to write, so suffice it to say that the poor plan is a result of inadequate statistics, and reasoning limitations in the optimizer.

    Paul

  • Thanks Howard and Ron. The only datatype mismatch I'm seeing is in the code itself where there's a conversion in the join...

    from dbo.Split8KTally(@CSVList,',') a

    join AdventureWorks.Sales.SalesOrderDetail d on [font="Arial Black"]cast(a.ItemValue as int)[/font]=d.ProductID

    Like I said, guess I'm going to have to finally load up 2K8 and figure out why that works in 2K5 but not in 2K8. Thanks to all you good folks all running the same code with the same Tally Table, we know it's not the Tally Table itself or even the code. Something changed in 2K8 and I've got to figure out what it is.

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • rob.symonds (9/20/2010)


    Anyone else a little concerned about the 2k8 results for the inline Tally?

    The latest scripts and results simply show that the optimizer can generate a poor plan, especially when it isn't provided with good quality information.

    XML operations generally have only one possible plan implementation, so the optimizer can't do much with them, except move them (as a unit) around a bit. Also, estimated row counts from XML operations are based on fixed guesses (there are no statistics available), which are only slightly modified by the contextual query information. These guesses are generally very low - a couple of hundred rows is typical.

    Wrapping the Tally in an in-line function allows the optimizer to expand the function definition into the wider query before optimization. Usually, this is a good thing, as it allows for many plan alternatives to be considered. In this case, a lack of good information, the cast from varchar to int on ProductID, and various other factors, conspire to produce a duff plan for the Tally solution.

    It just so happens that the XML implementation's lack of statistics, low row estimates, and limited optimization possibilities happen to produce a plan that works well on the AdventureWorks query. Importantly, wrapping the XML approach in an in-line function doesn't hurt as much because the optimizer can't do much more than plonk the whole thing into the plan as a whole.

    So, in summary, Jeff and Brad are both correct, and both methods are best, as is the CLR one. :w00t:

    Paul

  • @howard - thanks for replying so quickly.

    Sorry, that was pretty rude.

    Had a bit of a busy day, I didn't intend on posting and then ignoring the thread.

    Paul, thanks for the insight into what's going on.

    So, I guess it's an "it depends" but in your opinion, updating the stats on AW2008 should resolve it?

    I guess I'm going to have to get a 2008 instance and see how it performs with our data.

    Oh well - I'm sure we're going to get a few rainy days for that in the near future 🙂

    Jeff - I'm getting a .net error trying to upload the attachment, I'll try again later.

  • Jeff, here is my test results for the AdventureWorks JOIN query you asked to give results for. this is run in my slowest environment (Env2)

  • Jeff tested Brad Schulz's code, as posted by yourself, but I added two lines (DBCC TRACEON(8690,-1) per Paul White NZ and then tested

    --===== Do this in a nice safe place that everyone has

    USE tempdb;

    GO

    DBCC TRACEON(8690,-1);

    GO

    SQL 2008 Developer Edition

    DB Settings:

    Auto Update Statistics ON

    Auto Update Statistics Asynchronously OFF

    Here is a sample of one set of statistics

    Statistics for INDEX 'IX_SalesOrderDetail_ProductID'.

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Name Updated Rows Rows Sampled Steps Density Average Key Length String Index

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    IX_SalesOrderDetail_ProductID May 15 2009 10:27PM 121317 121317 200 0.0078125 12 NO 121317

    All Density Average Length Columns

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    0.003759399 4 ProductID

    8.242868E-06 8 ProductID, SalesOrderID

    8.242868E-06 12 ProductID, SalesOrderID, SalesOrderDetailID

    Histogram Steps

    RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    707 0 3083 0 1

    708 0 3007 0 1

    709 0 188 0 1

    710 0 44 0 1

    711 0 3090 0 1

    712 0 3382 0 1

    713 0 429 0 1

    714 0 1218 0 1

    715 0 1635 0 1

    716 0 1076 0 1

    718 218 219 1 218

    719 0 44 0 1

    722 0 392 0 1

    723 0 52 0 1

    725 0 374 0 1

    726 0 288 0 1

    727 0 48 0 1

    729 0 375 0 1

    730 0 288 0 1

    732 0 130 0 1

    738 154 600 2 77

    741 167 94 1 167

    742 0 288 0 1

    743 0 481 0 1

    747 89 289 2 44.5

    748 0 491 0 1

    749 0 470 0 1

    750 0 358 0 1

    751 0 409 0 1

    752 0 378 0 1

    753 0 475 0 1

    754 0 226 0 1

    756 164 171 1 164

    757 0 77 0 1

    758 0 267 0 1

    759 0 282 0 1

    760 0 680 0 1

    761 0 638 0 1

    762 0 689 0 1

    763 0 649 0 1

    764 0 440 0 1

    765 0 642 0 1

    766 0 460 0 1

    767 0 293 0 1

    768 0 441 0 1

    769 0 293 0 1

    770 0 703 0 1

    771 0 241 0 1

    773 221 233 1 221

    774 0 204 0 1

    776 234 228 1 234

    778 242 243 1 242

    779 0 1094 0 1

    780 0 1040 0 1

    781 0 1054 0 1

    782 0 1252 0 1

    783 0 1177 0 1

    784 0 1059 0 1

    786 220 223 1 220

    788 228 223 1 228

    789 0 364 0 1

    790 0 377 0 1

    791 0 314 0 1

    792 0 526 0 1

    793 0 705 0 1

    794 0 712 0 1

    795 0 667 0 1

    796 0 486 0 1

    797 0 725 0 1

    798 0 687 0 1

    799 0 648 0 1

    800 0 495 0 1

    801 0 723 0 1

    805 200 46 2 100

    808 220 301 2 110

    809 0 507 0 1

    811 216 98 1 216

    813 0 270 0 1

    815 226 232 1 226

    819 218 195 2 109

    820 0 206 0 1

    822 0 356 0 1

    824 148 265 1 148

    825 0 258 0 1

    826 0 305 0 1

    831 110 198 3 36.66667

    832 0 256 0 1

    833 0 88 0 1

    835 0 489 0 1

    836 0 350 0 1

    838 0 201 0 1

    843 207 260 2 103.5

    844 0 267 0 1

    849 0 283 0 1

    850 0 131 0 1

    852 0 422 0 1

    853 0 114 0 1

    854 0 441 0 1

    856 231 353 1 231

    857 0 178 0 1

    858 0 883 0 1

    859 0 1086 0 1

    860 0 673 0 1

    862 240 359 1 240

    863 0 364 0 1

    864 0 682 0 1

    865 0 555 0 1

    866 0 201 0 1

    867 0 648 0 1

    868 0 681 0 1

    869 0 707 0 1

    870 0 4688 0 1

    871 0 2025 0 1

    872 0 1712 0 1

    873 0 3354 0 1

    874 0 593 0 1

    875 0 604 0 1

    876 0 796 0 1

    877 0 1327 0 1

    878 0 2121 0 1

    879 0 249 0 1

    880 0 1074 0 1

    881 0 717 0 1

    882 0 407 0 1

    883 0 805 0 1

    884 0 904 0 1

    886 135 130 1 135

    889 80 161 2 40

    892 116 169 2 58

    894 140 145 1 140

    898 227 9 3 75.66666

    900 117 110 1 117

    904 34 253 2 17

    905 0 230 0 1

    907 87 113 1 87

    909 153 138 1 153

    910 0 222 0 1

    916 150 177 4 37.5

    918 224 159 1 224

    921 175 3095 2 87.5

    922 0 2376 0 1

    923 0 1488 0 1

    924 0 162 0 1

    926 227 164 1 227

    927 0 9 0 1

    928 0 862 0 1

    929 0 1161 0 1

    930 0 1396 0 1

    931 0 1044 0 1

    932 0 926 0 1

    933 0 858 0 1

    934 0 935 0 1

    936 195 158 1 195

    938 255 309 1 255

    939 0 265 0 1

    940 0 264 0 1

    944 82 164 3 27.33333

    945 0 257 0 1

    948 139 266 2 69.5

    949 0 176 0 1

    950 0 28 0 1

    952 219 250 1 219

    953 0 346 0 1

    954 0 440 0 1

    955 0 342 0 1

    956 0 271 0 1

    957 0 433 0 1

    958 0 281 0 1

    960 239 157 1 239

    961 0 318 0 1

    962 0 280 0 1

    964 227 159 1 227

    965 0 319 0 1

    966 0 442 0 1

    967 0 336 0 1

    968 0 277 0 1

    969 0 439 0 1

    970 0 283 0 1

    971 0 198 0 1

    972 0 380 0 1

    973 0 573 0 1

    974 0 455 0 1

    975 0 332 0 1

    976 0 566 0 1

    977 0 537 0 1

    978 0 157 0 1

    979 0 306 0 1

    981 253 301 1 253

    983 231 239 1 231

    985 221 221 1 221

    986 0 195 0 1

    988 228 236 1 228

    989 0 150 0 1

    991 195 193 1 195

    992 0 232 0 1

    994 146 150 1 146

    996 0 218 0 1

    997 0 466 0 1

    998 0 685 0 1

    999 0 696 0 1

    Editted to add statistics

    If everything seems to be going well, you have obviously overlooked something.

    Ron

    Please help us, help you -before posting a question please read[/url]
    Before posting a performance problem please read[/url]

  • Apologies for the delayed response - my PC died!

    I'm currently re-running the script (from the OP) on a SQL2005 and a SQL2008 on the same machine

    In the meantime here is the output from a Win 2008 Standard 32 bit, SQL2008 SP1 Standard, 2x quad core CPU, 6GB RAM

    ------------------------------------------------------------------------
    Bite-sized fiction (with added teeth) [/url]

  • rob.symonds (9/20/2010)


    Paul, thanks for the insight into what's going on. So, I guess it's an "it depends" but in your opinion, updating the stats on AW2008 should resolve it?

    I wish it were that simple 🙂

    Brad's query example is not a nice one for the optimizer: the input is a variable (obviously no stats on a variable!), there's an opaque cast from string to integer in the join, lots of string functions (charindex, len), well the list goes on...that's what I mean by incorrect/missing statistics: the optimizer just doesn't have the info it needs (and there's no way to provide it).

    The reasonable plan on 2K5 is probably just luck, I'll start my 2K5 up tomorrow and check the plan out to be sure.

  • And here's the other two.

    System1 = SQL2008 RTM Enterprise

    System2 = SQL2005 SP3 Standard

    Both on Win Server 2003 R2 Standard, one dual core CPU, 3.75GB RAM

    When I get home I'll try out the AdventureWorks related ones (and have a good read of where the thread has got to!)

    ------------------------------------------------------------------------
    Bite-sized fiction (with added teeth) [/url]

  • Paul White NZ (9/20/2010)

    I wish it were that simple 🙂

    Brad's query example is not a nice one for the optimizer: the input is a variable (obviously no stats on a variable!), there's an opaque cast from string to integer in the join, lots of string functions (charindex, len), well the list goes on...that's what I mean by incorrect/missing statistics: the optimizer just doesn't have the info it needs (and there's no way to provide it).

    The reasonable plan on 2K5 is probably just luck, I'll start my 2K5 up tomorrow and check the plan out to be sure.

    Ahh, fair enough, thanks again for clearing that up - I'll stop with the questions now.

  • ColdCoffee (9/20/2010)


    Jeff, here is my test results for the AdventureWorks JOIN query you asked to give results for. this is run in my slowest environment (Env2)

    Wow! 109ms CPU but more than 70000 ms duration. 2k8 really doesn't like this query,.

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

  • rob.symonds (9/20/2010)


    Ahh, fair enough, thanks again for clearing that up - I'll stop with the questions now.

    Questions are all good, Rob. 😎

Viewing 15 posts - 106 through 120 (of 214 total)

You must be logged in to reply to this topic. Login to reply