I have the below SQL Script which is run from Excel VBA using ADO against a SQL Server 2000 database.
The issue I have is that although there is only one SELECT statement in the script, I sometimes receive three recordsets back when executing the .Open method. I say sometimes as on occassion and on other 'parallel' databases I only receive one recordset back.
I know all about the .NextRecordset() method etc. but I am trying to understand why I get three recordsets back some times and other times I only receive one. I'm shortly going to run a SQL trace to see if that throws up any ideas but as usual, any help or advice would be greatly appreciated.
SET NOCOUNT ON
DECLARE #RunDate VARCHAR(8)
SET #RunDate = CONVERT(VARCHAR(8), DATEADD(d, -1 * 1, GETDATE()), 112)
IF OBJECT_ID('tempdb..#ActiveOrders') IS NOT NULL DROP TABLE #ActiveOrders
IF OBJECT_ID('tempdb..#ApplicableOrders') IS NOT NULL DROP TABLE #ApplicableOrders
IF OBJECT_ID('tempdb..#FilterOut') IS NOT NULL DROP TABLE #FilterOut
/*Temp table created as it has a self-join in the below query */
CREATE TABLE #ActiveOrders(
order_id VARCHAR(30)
, instrument_id VARCHAR(30)
, side CHAR(1)
)
CREATE INDEX idx_ActiveOrders_orderId ON #ActiveOrders(order_id)
/*Build dataset of all orders which have had activity on the run date or are in an Open status. Ignoring Program Trades.*/
INSERT INTO #ActiveOrders
SELECT o1.order_id COLLATE Latin1_General_CI_AS
, o1.instrument_id
, o1.side
FROM orders o1
INNER JOIN desk d1 ON d1.desk_id = o1.investment_desk
INNER JOIN (SELECT o0.order_id
FROM orders o0
WHERE ((LEFT(o0.added_datetime, 8) = #RunDate
OR LEFT(o0.approved_datetime, 8) = #RunDate)
OR (LEFT(o0.added_datetime, 8) <= #RunDate
AND o0.summary_status IN (1, 2, 3, 5, 8, 9))) /*Approved, Assigned, Acknowledged, Working, Partial, WorkingPartial*/
UNION
(SELECT r0.order_id
FROM releases r0
WHERE LEFT(r0.added_datetime, 8) = #RunDate)
UNION
(SELECT e0.order_id
FROM executions e0
WHERE LEFT(e0.execution_datetime, 8) = #RunDate
OR LEFT(e0.allocated_datetime, 8) = #RunDate)
) t1 ON o1.order_id = t1.order_id
WHERE d1.location_id = 'LDEQ'
AND o1.summary_status <> 4
AND o1.list_id IS NULL /*Ignore program trades*/
/*This is now the actual dataset we are interested in.
This is everything which could be a contender for aggregation.*/
CREATE TABLE #ApplicableOrders(
order_id VARCHAR(30)
, instrument_id VARCHAR(30)
, side CHAR(1)
, approved_datetime DATETIME
, acknowledged_datetime DATETIME
, last_allocation_datetime DATETIME
, latest_status INT
, merged_orders VARCHAR(500)
, dealer VARCHAR(100)
, manager VARCHAR(100)
, limit_price FLOAT
, original_qty FLOAT
, executed_qty FLOAT
, trader_instruction TEXT
, dealer_note TEXT
)
CREATE INDEX idx_ApplicableOrders_orderId ON #ApplicableOrders(order_id)
CREATE INDEX idx_ApplicableOrders_lastAllocation ON #ApplicableOrders(last_allocation_datetime)
CREATE INDEX idx_ApplicableOrders_approved ON #ApplicableOrders(approved_datetime)
/*All orders from #ActiveOrders where there are two or more orders which are for the same instrument and in the same direction.*/
INSERT INTO #ApplicableOrders
SELECT o.order_id
, o.instrument_id
, o.side
, dbo.mglz_datetime(o.approved_datetime)
, dbo.mglz_datetime(o.ack_datetime)
, MAX(dbo.mglz_datetime(e.allocated_datetime)) "Last Allocation DateTime"
, o.summary_status
, o.merged_orders
, o.ack_id
, o.approver_id
, o.limit_price
, o.original_qty
, o.executed_qty_at
, CONVERT(VARCHAR(900), o.trader_instruction)
, CONVERT(VARCHAR(900), o.dealer_note)
FROM orders o
INNER JOIN #ActiveOrders t ON o.order_id = t.order_id COLLATE Latin1_General_CI_AS
INNER JOIN #ActiveOrders s ON s.order_id <> o.order_id COLLATE Latin1_General_CI_AS
AND s.instrument_id = o.instrument_id COLLATE Latin1_General_CI_AS
AND s.side = o.side COLLATE Latin1_General_CI_AS
LEFT JOIN executions e ON e.order_id = o.order_id
GROUP BY o.order_id
, o.instrument_id
, o.side
, o.approved_datetime
, o.ack_datetime
, o.summary_status
, o.merged_orders
, o.ack_id
, o.approver_id
, o.limit_price
, o.original_qty
, o.executed_qty_at
, CONVERT(VARCHAR(900), o.trader_instruction)
, CONVERT(VARCHAR(900), o.dealer_note)
/*Filter out any orders where Order2.Approved_Date > Order1.Last_Release_Date AND Order1.Is_Complete
Order1 is defined as the order which was approved first.*/
SELECT t1.*
INTO #FilterOut
FROM #ApplicableOrders t1
WHERE EXISTS (SELECT 1
FROM
(SELECT order2.order_id
FROM (SELECT b.order_id
, b.instrument_id
, b.side
, b.approved_datetime
, b.last_allocation_datetime
, b.latest_status
, b.executed_qty
, b.original_qty
FROM #ApplicableOrders b
WHERE b.approved_datetime = (SELECT MIN(b1.approved_datetime) FirstApproval
FROM #ApplicableOrders b1
WHERE b1.instrument_id = b.instrument_id
AND b1.side = b.side)
) order1
INNER JOIN
(SELECT c.order_id
, c.instrument_id
, c.side
, c.approved_datetime
FROM #ApplicableOrders c
WHERE c.approved_datetime > (SELECT MIN(c1.approved_datetime) FirstApproval
FROM #ApplicableOrders c1
WHERE c1.instrument_id = c.instrument_id
AND c1.side = c.side)
) order2
ON order1.instrument_id = order2.instrument_id
AND order1.side = order2.side
AND order2.approved_datetime > order1.last_allocation_datetime
AND (order1.latest_status = 6 OR order1.executed_qty = order1.original_qty)) filter1
WHERE t1.order_id = filter1.order_id)
/*Filter out any orders where Order2.Acknowledged_Date > Order1.Last_Allocation_Date.*/
INSERT INTO #FilterOut
SELECT t1.*
FROM #ApplicableOrders t1
WHERE EXISTS (SELECT 1
FROM
(SELECT order2.order_id
FROM (SELECT b.order_id
, b.instrument_id
, b.side
, b.approved_datetime
, b.last_allocation_datetime
FROM #ApplicableOrders b
WHERE b.approved_datetime = (SELECT MIN(b1.approved_datetime) FirstApproval
FROM #ApplicableOrders b1
WHERE b1.instrument_id = b.instrument_id
AND b1.side = b.side)
) order1
INNER JOIN
(SELECT c.order_id
, c.instrument_id
, c.side
, c.approved_datetime
, c.acknowledged_datetime
FROM #ApplicableOrders c
WHERE c.approved_datetime > (SELECT MIN(c1.approved_datetime) FirstApproval
FROM #ApplicableOrders c1
WHERE c1.instrument_id = c.instrument_id
AND c1.side = c.side)
) order2
ON order1.instrument_id = order2.instrument_id
AND order1.side = order2.side
AND order2.acknowledged_datetime > order1.last_allocation_datetime) filter2
WHERE t1.order_id = filter2.order_id)
AND NOT EXISTS (SELECT 1
FROM #FilterOut a1
WHERE a1.order_id = t1.order_id)
/*Filter any 'single' orders. I.e. all 'matching' orders have been excluded so the instrument/direction combination is not applicable for Aggregation.*/
INSERT INTO #FilterOut
SELECT t1.*
FROM #ApplicableOrders t1 INNER JOIN (SELECT DISTINCT t.instrument_id
, t.side
FROM #ApplicableOrders t
INNER JOIN #FilterOut a ON t.instrument_id = a.instrument_id
AND t.side = a.side
GROUP BY t.instrument_id
, t.side
HAVING COUNT(t.instrument_id) > 1) t2 ON t1.instrument_id = t2.instrument_id
AND t1.side = t2.side
WHERE NOT EXISTS (SELECT 1
FROM #FilterOut a1
WHERE a1.order_id = t1.order_id)
/*Final Report*/
/*A list of all orders where aggregation could have possibly occurred but didn't.*/
SELECT t1.order_id "Order ID"
, i.name "Name"
, t1.side "B/S"
, userDealer.short_name "Dlr"
, userManager.short_name "FM"
, t1.limit_price "Limit"
, t1.approved_datetime "Order Approved"
, t1.acknowledged_datetime "Order Acknowledged"
, t1.last_allocation_datetime "Last Execution"
, t1.merged_orders "Merged Orders"
, m.description "Status"
, t1.dealer_note "Dealer Note"
, t1.trader_instruction "Trader Instruction"
FROM #ApplicableOrders t1
INNER JOIN instrument i ON t1.instrument_id = i.instrument_id COLLATE Latin1_General_CI_AS
INNER JOIN mnemonics m ON t1.latest_status = m.value AND m.attribute = 'order_summary_status'
LEFT JOIN users userDealer ON userDealer.user_id = t1.dealer COLLATE Latin1_General_CI_AS
LEFT JOIN users userManager ON userManager.user_id = t1.manager COLLATE Latin1_General_CI_AS
WHERE NOT EXISTS (SELECT 1
FROM #FilterOut t2
WHERE t1.order_id = t2.order_id)
ORDER BY t1.name
, t1.side
, t1.approved_datetime
IF OBJECT_ID('tempdb..#ActiveOrders') IS NOT NULL DROP TABLE #ActiveOrders
IF OBJECT_ID('tempdb..#ApplicableOrders') IS NOT NULL DROP TABLE #ApplicableOrders
IF OBJECT_ID('tempdb..#FilterOut') IS NOT NULL DROP TABLE #FilterOut
I would add an isotope column (dummy column) to the end of your temp tables so that when you see the three recordsets you can interrogate the columns names to see where they're coming from. And what happens when you take the SQL from profile and run directly in SSMS? Do you get just one resultset?
I finally found the issue and thought I would report back. The problem was with NULL values in two of the Aggregation Functions in the script. The reason this only occurred occasionally is because the data was constantly changing.
Although SQL Server handles the issue 'silently' it does produce warnings which ADO sees as recordsets although in my case (might be every case) these recordsets are closed and so impossible to actually see what they contain or what produced them.
Instead of re-writing the SQL script with ISNULL() logic, I have opted simply to include the
SET ANSI_WARNINGS OFF
statement at the top of the script. This prevents the warnings from being reported and thus ADO does not produce these additional, unwanted recordsets.
Disappointed I didn't spot this earlier but at least I've learnt something new. :)
Related
How can I optimize my SQL Server query ? Here is the code that I want to optimize
CREATE TABLE #Temp
(
TransactionId int PRIMARY KEY,
TransactionStepId int
)
INSERT INTO #Temp(TransactionId, TransactionStepId)
SELECT
TransactionId, MAX(TransactionStepId) TransactionStepId
FROM
[WarehouseMgmt].[FactPaymentTrans] FPT
JOIN
WarehouseMgmt.DimTimeZone DTZ on FPT.[TimeId] = DTZ.TimeUTCId
WHERE
FactType = 'SOURCE'
AND (DTZ.TimeId BETWEEN #DimStartDate AND #DimEndDate)
GROUP BY
TransactionId
IF(UPPER(#ReportBy) = 'TRANSACTION')
BEGIN
SET #sql = '
INSERT INTO #Results (
[PaymentTypeId],
[TransactionDate],
[PaymentMethodId],
[3DSecureId],
[ProductId],
[ProductTypeId],
[TransactionStatusId],
[Amount],
[Currency],
[PlayerId],
[PlayerSourceOrigId],
[Username],
[FirstName],
[LastName],
[BrandId],
[VIPLevelId],
[MarketingChannelId],
[MarketingSourceId],
[CommentId],
[CommentRefId],
[AdminName],
[OriginalTransactionId],
[TransactionId],
[RelatedTransactionId],
[ProviderTransactionOrigId]
)
SELECT
DTST.[Id],
FPT.[StartTime],
FPT.[PaymentMethodId],
FPT.[3DSecureId],
FPT.[ProductId],
DPT.[Id],
FPT.[TransactionStatusId],
FPT.[Amount],
FPT.CurrencyId,
FPT.[PlayerId],
DPL.[SourceOrigId],
DPL.[Username],
DPL.[FirstName],
DPL.[LastName],
DPL.[BrandId],
DPL.[VIPLevelId],
DPL.[MarketingChannelId],
DPL.[MarketingSourceId],
FPT.[PaymentReasonTextId],
FPT_Ref.[PaymentReasonTextId],
FPT.CreatedByAdminId,
FPT.[OriginalTransactionId],
FPT.[TransactionId],
FPT_Ref.[OriginalTransactionId],
FPT.[ProviderTransactionOrigId]
FROM WarehouseMgmt.FactPaymentTrans AS FPT
JOIN #Temp T ON FPT.TransactionId = T.TransactionId AND FPT.TransactionStepId = T.TransactionStepId
JOIN WarehouseMgmt.DimTransactionStepType AS DTST ON FPT.[TransactionStepTypeId] = DTST.[Id]
JOIN WarehouseMgmt.DimPlayer AS DPL ON FPT.PlayerId = DPL.Id
JOIN WarehouseMgmt.DimProduct AS DP ON DP.Id = FPT.ProductId
JOIN WarehouseMgmt.DimProductType AS DPT ON DPT.Id = DP.ProductTypeId
--JOIN WarehouseMgmt.DimTimeZone DTZ on FPT.[TimeId] = DTZ.TimeUTCId
JOIN [WarehouseMgmt].[DimLoyaltyProgramLevel] DLPL ON DLPL.[Id]=DPL.VipLevelId
LEFT JOIN
(
SELECT FPT_Ref_1.TransactionId,FPT_Ref_1.FactType,FPT_Ref_1.OriginalTransactionId,FPT_Ref_1.[PaymentReasonTextId]
FROM WarehouseMgmt.FactPaymentTrans AS FPT_Ref_1
JOIN #Temp T ON T.TransactionId = FPT_Ref_1.OriginalTransactionId AND T.TransactionStepId = FPT_Ref_1.TransactionStepId
) AS FPT_Ref ON FPT_Ref.OriginalTransactionId = FPT.TransactionId AND FPT_Ref.FactType = ''SOURCE''
WHERE (FPT.FactType = ''SOURCE'') ' + #sqlFilters
I tried to put this
SELECT TransactionId,MAX(TransactionStepId) TransactionStepId
FROM [WarehouseMgmt].[FactPaymentTrans]
WHERE FactType = ''SOURCE''
GROUP BY TransactionId
in a temp table, but this is even worst that without temp table. I want to select latest TransactionId(thats made by MAX(TransactionStepId) and also to select last TransactionId in the left JOIN
My execution plan is:
Have you considered using ROW_NUMBER instead of joining your table twice? Please try this:
;WITH FactPaymentTrans_Last
AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY TransactionID ORDER BY TransactionStepID DESC) AS RN
FROM WarehouseMgmt.FactPaymentTrans
)
SELECT DTST.[Id]
, FPT.[StartTime]
, FPT.[PaymentMethodId]
, FPT.[3DSecureId]
, FPT.[ProductId]
, DPT.[Id]
, FPT.[TransactionStatusId]
, FPT.[Amount]
, FPT.CurrencyId
, FPT.[PlayerId]
, DPL.[SourceOrigId]
, DPL.[Username]
, DPL.[FirstName]
, DPL.[LastName]
, DPL.[BrandId]
, DPL.[VIPLevelId]
, DPL.[MarketingChannelId]
, DPL.[MarketingSourceId]
, FPT.[PaymentReasonTextId]
, FPT_Ref.[PaymentReasonTextId]
, FPT.CreatedByAdminId
, FPT.[OriginalTransactionId]
, FPT.[TransactionId]
, FPT_Ref.[OriginalTransactionId]
, FPT.[ProviderTransactionOrigId]
FROM FactPaymentTrans_Last AS FPT
INNER JOIN WarehouseMgmt.DimTransactionStepType AS DTST
ON FPT.[TransactionStepTypeId] = DTST.[Id]
INNER JOIN WarehouseMgmt.DimPlayer AS DPL
ON FPT.PlayerId = DPL.Id
INNER JOIN WarehouseMgmt.DimProduct AS DP
ON DP.Id = FPT.ProductId
WHERE FPT.RN = 1;
It's just a snippet to give you idea how you can use this to get latest TransactionIds based on its TransactionStepId.
If it's not enough - please post these:
Your table structure
Indices on them
Your execution plan
It will help to give you suggestions.
There are multiple factors which can improve query performance and one of them which can be done, without necessarily knowing details about indexes, database schema, data distribution etc. is the order of the JOINs in the query.
I have refactored your query and I think you should get the same result as before, but with an improved execution time:
SELECT DTST.[Id]
,FPT.[StartTime]
,FPT.[PaymentMethodId]
,FPT.[3DSecureId]
,FPT.[ProductId]
,DPT.[Id]
,FPT.[TransactionStatusId]
,FPT.[Amount]
,FPT.CurrencyId
,FPT.[PlayerId]
,DPL.[SourceOrigId]
,DPL.[Username]
,DPL.[FirstName]
,DPL.[LastName]
,DPL.[BrandId]
,DPL.[VIPLevelId]
,DPL.[MarketingChannelId]
,DPL.[MarketingSourceId]
,FPT.[PaymentReasonTextId]
,FPT_Ref.[PaymentReasonTextId]
,FPT.CreatedByAdminId
,FPT.[OriginalTransactionId]
,FPT.[TransactionId]
,FPT_Ref.[OriginalTransactionId]
,FPT.[ProviderTransactionOrigId]
FROM WarehouseMgmt.FactPaymentTrans AS FPT
INNER JOIN WarehouseMgmt.DimPlayer AS DPL
ON FPT.PlayerId = DPL.Id
INNER JOIN WarehouseMgmt.DimProduct AS DP
ON DP.Id = FPT.ProductId
INNER JOIN WarehouseMgmt.DimProductType AS DPT
ON DPT.Id = DP.ProductTypeId
INNER JOIN WarehouseMgmt.DimTransactionStepType AS DTST
ON FPT.[TransactionStepTypeId] = DTST.[Id]
WHERE (FPT.FactType = '' SOURCE '')
AND EXISTS (SELECT 1
FROM [WarehouseMgmt].[FactPaymentTrans]
WHERE FactType = '' SOURCE ''
AND FPT.TransactionId = TransactionId
AND FPT.TransactionStepId = TransactionStepId)
AND EXISTS (SELECT 1
FROM [WarehouseMgmt].[DimLoyaltyProgramLevel] DLPL
WHERE DLPL.[Id] = DPL.VipLevelId)
AND EXISTS (SELECT 1
FROM WarehouseMgmt.DimTimeZone DTZ
WHERE FPT.[TimeId] = DTZ.TimeUTCId
AND DTZ.TimeId BETWEEN #DimStartDate AND #DimEndDate)
I need to update based on a select. The following errors with: the column '' was specified multiple times for Q
UPDATE Evolution1.DimAdministrator
SET Evolution1.DimAdministrator.ClaimSystemCodeId = 17
FROM Evolution1.DimAdministrator da INNER JOIN (
Select
ExtractId,
base.AdministratorId,
base.CardprocessorAdministratorId,
AdministratorName,
EffectiveDate,
CancelDate ,
State,
StageError ,
AdministratorKey,
CustomerKey ,
Name ,
EffectiveDateKey ,
CancelDateKey,
StateProvinceKey ,
Alias ,
NavId ,
warehouse.AdministratorId ,
warehouse.CardprocessorAdministratorId,
warehouse.ClaimSystemCodeId,
Inserted ,
Updated
FROM OneStage.OnePay.Administrator base
INNER JOIN OneWarehouse.Evolution1.DimAdministrator warehouse ON base.AdministratorId = warehouse.AdministratorId
WHERE base.ClaimSystemCodeId <> warehouse.ClaimSystemCodeId
AND base.ClaimSystemCodeId = 1
) AS Q
Help please. Thanks.
You have multiple columns with duplicate names.
Put an alias on them like this:
UPDATE Evolution1.DimAdministrator
SET Evolution1.DimAdministrator.ClaimSystemCodeId = 17
FROM Evolution1.DimAdministrator da INNER JOIN (
Select
ExtractId,
base.AdministratorId AS base_AdminID,
base.CardprocessorAdministratorId AS base_CardID,
AdministratorName,
EffectiveDate,
CancelDate ,
State,
StageError ,
AdministratorKey,
CustomerKey ,
Name ,
EffectiveDateKey ,
CancelDateKey,
StateProvinceKey ,
Alias ,
NavId ,
warehouse.AdministratorId wh_AdminID,
warehouse.CardprocessorAdministratorId AS WH_CardID,
warehouse.ClaimSystemCodeId,
Inserted ,
Updated
FROM OneStage.OnePay.Administrator base
INNER JOIN OneWarehouse.Evolution1.DimAdministrator warehouse ON base.AdministratorId = warehouse.AdministratorId
WHERE base.ClaimSystemCodeId <> warehouse.ClaimSystemCodeId
AND base.ClaimSystemCodeId = 1
) AS Q
Are you sure you don't need to JOIN Q ON something?
Ive got an SQL Query trying to get 1 record back when a 1 to many relationship exists.
SELECT dbo.BlogEntries.ID AS blog_entries_id, dbo.BlogEntries.BlogTitle, dbo.BlogEntries.BlogEntry, dbo.BlogEntries.BlogName,
dbo.BlogEntries.DateCreated AS blog_entries_datecreated, dbo.BlogEntries.inActive AS blog_entries_in_active,
dbo.BlogEntries.HtmlMetaDescription AS blog_entries_html_meta_description, dbo.BlogEntries.HtmlMetaKeywords AS blog_entries_html_meta_keywords,
dbo.BlogEntries.image1, dbo.BlogEntries.image2, dbo.BlogEntries.image3, dbo.BlogEntries.formSelector, dbo.BlogEntries.image1Alignment,
dbo.BlogEntries.image2Alignment, dbo.BlogEntries.image3Alignment, dbo.BlogEntries.blogEntryDisplayName, dbo.BlogEntries.published AS blog_entries_published,
dbo.BlogEntries.entered_by, dbo.BlogEntries.dateApproved, dbo.BlogEntries.approved_by, dbo.blog_entry_tracking.id AS blog_entry_tracking_id,
dbo.blog_entry_tracking.blog, dbo.blog_entry_tracking.blog_entry, dbo.BlogCategories.ID, dbo.BlogCategories.BlogCategoryName,
dbo.BlogCategories.BlogCategoryComments, dbo.BlogCategories.DateCreated, dbo.BlogCategories.BlogCategoryTitle, dbo.BlogCategories.BlogCategoryTemplate,
dbo.BlogCategories.inActive, dbo.BlogCategories.HtmlMetaDescription, dbo.BlogCategories.HtmlMetaKeywords, dbo.BlogCategories.entry_sort_order,
dbo.BlogCategories.per_page, dbo.BlogCategories.shorten_page_content, dbo.BlogCategories.BlogCategoryDisplayName, dbo.BlogCategories.published,
dbo.BlogCategories.blogParent
FROM dbo.BlogEntries LEFT OUTER JOIN
dbo.blog_entry_tracking ON dbo.BlogEntries.ID = dbo.blog_entry_tracking.blog_entry LEFT OUTER JOIN
dbo.BlogCategories ON dbo.blog_entry_tracking.blog = dbo.BlogCategories.ID
i have some records assigned to 2 different blogcategories, and when i query everything it returns duplicate records.
How do i only return 1 instance of a blog?
Try this one -
SELECT blog_entries_id = be.Id
, be.BlogTitle
, be.BlogEntry
, be.BlogName
, blog_entries_datecreated = be.DateCreated
, blog_entries_in_active = be.inActive
, blog_entries_html_meta_description = be.HtmlMetaDescription
, blog_entries_html_meta_keywords = be.HtmlMetaKeywords
, be.image1
, be.image2
, be.image3
, be.formSelector
, be.image1Alignment
, be.image2Alignment
, be.image3Alignment
, be.blogEntryDisplayName
, blog_entries_published = be.published
, be.entered_by
, be.dateApproved
, be.approved_by
, blog_entry_tracking_id = bet.Id
, bet.blog
, bet.blog_entry
, bc2.Id
, bc2.BlogCategoryName
, bc2.BlogCategoryComments
, bc2.DateCreated
, bc2.BlogCategoryTitle
, bc2.BlogCategoryTemplate
, bc2.inActive
, bc2.HtmlMetaDescription
, bc2.HtmlMetaKeywords
, bc2.entry_sort_order
, bc2.per_page
, bc2.shorten_page_content
, bc2.BlogCategoryDisplayName
, bc2.published
, bc2.blogParent
FROM dbo.BlogEntries be
LEFT JOIN dbo.blog_entry_tracking bet ON be.Id = bet.blog_entry
OUTER APPLY (
SELECT TOP 1 *
FROM dbo.BlogCategories bc
WHERE bet.blog = bc.Id
) bc2
Also, I would like to mention that in this case, using of aliases in the column names decreases the size of your query and makes it more convenient for understanding.
if you just need one record back, you can use
SELECT TOP 1 dbo.BlogEntries.ID AS blog_entries_id, dbo.Bl.... (same as you have now).
it is more efficient than SELECT DISTINCT
Here is a Northwind Example.
It will return only 1 row in the Order Detail table for each Order.
Use Northwind
GO
Select COUNT(*) from dbo.Orders
select COUNT(*) from dbo.[Order Details]
select * from dbo.Orders ord
join
(select ROW_NUMBER() OVER(PARTITION BY OrderID ORDER BY UnitPrice DESC) AS "MyRowID" , * from dbo.[Order Details] innerOD) derived1
on ord.OrderID = derived1.OrderID
Where
derived1.MyRowID = 1
Order by ord.OrderID
I have a complex view, which is described here: View of multiple tables. Need to remove "doubles" defined by 1 table
I used a Cross Apply in it, and the code is this: (please do check the url above to understand the view)
SELECT dbo.InstellingGegevens.INST_SUBTYPE
, dbo.InstellingGegevens.INST_BRON
, dbo.InstellingGegevens.INST_INSTELLINGSNUMMER
, dbo.InstellingGegevens.INST_NAAM
, dbo.InstellingGegevens.INST_KORTENAAM
, dbo.InstellingGegevens.INST_VESTIGINGSNAAM
, dbo.InstellingGegevens.INST_ROEPNAAM
, dbo.InstellingGegevens.INST_STATUUT
, dbo.InstellingGegevens.ONDERWIJSNIVEAU_REF
, dbo.InstellingGegevens.ONDERWIJSSOORT_REF
, dbo.InstellingGegevens.DATUM_TOT
, dbo.InstellingGegevens.DATUM_VAN
, dbo.InstellingGegevens.VERBOND_REF
, dbo.InstellingGegevens.VSKO_LID
, dbo.InstellingGegevens.NET_REF
, dbo.Instellingen.Inst_ID
, dbo.Instellingen.INST_TYPE
, dbo.Instellingen.INST_REF
, dbo.Instellingen.INST_LOC_REF
, dbo.Instellingen.INST_LOCNR
, dbo.Instellingen.Opt_KalStandaard
, dbo.InstellingTelecom.INST_TEL
, dbo.InstellingTelecom.INST_FAX
, dbo.InstellingTelecom.INST_EMAIL
, dbo.InstellingTelecom.INST_WEB
, dbo.InstellingAdressen.SOORT
, dbo.InstellingAdressen.STRAAT
, dbo.InstellingAdressen.POSTCODE
, dbo.InstellingAdressen.GEMEENTE
, dbo.InstellingAdressen.GEM_REF
, dbo.InstellingAdressen.FUSIEGEM_REF
, dbo.InstellingAdressen.FUSIEGEM
, dbo.InstellingAdressen.ALFA_G
, dbo.InstellingAdressen.PROVINCIE
, dbo.InstellingAdressen.BISDOM
, dbo.InstellingAdressen.ARRONDISSEMENT
, dbo.InstellingAdressen.GEWEST
, dbo.InstellingContPersDirecteurs.AANSPREKING
, dbo.InstellingContPersDirecteurs.CONTACTPERSOON
, dbo.InstellingContPersDirecteurs.FUNCTIE
, InstellingLogin.Inst_Gebruikersnaam
, InstellingLogin.Inst_Concode
, InstellingLogin.Inst_DirCode
, InstellingLogin.DOSSNR
, InstellingLogin.Instelling_ID
FROM dbo.InstellingGegevens
RIGHT OUTER JOIN dbo.Instellingen
ON dbo.InstellingGegevens.INST_TYPE = dbo.Instellingen.INST_TYPE
AND dbo.InstellingGegevens.INST_REF = dbo.Instellingen.INST_REF
AND dbo.InstellingGegevens.INST_LOC_REF = dbo.Instellingen.INST_LOC_REF
AND dbo.InstellingGegevens.INST_LOCNR = dbo.Instellingen.INST_LOCNR
LEFT OUTER JOIN dbo.InstellingTelecom
ON dbo.InstellingGegevens.INST_TYPE = dbo.InstellingTelecom.INST_TYPE
AND dbo.InstellingGegevens.INST_REF = dbo.InstellingTelecom.INST_REF
AND dbo.InstellingGegevens.INST_LOC_REF = dbo.InstellingTelecom.INST_LOC_REF
LEFT OUTER JOIN dbo.InstellingAdressen
ON dbo.InstellingGegevens.INST_TYPE = dbo.InstellingAdressen.INST_TYPE
AND dbo.InstellingGegevens.INST_REF = dbo.InstellingAdressen.INST_REF
AND dbo.InstellingGegevens.INST_LOC_REF = dbo.InstellingAdressen.INST_LOC_REF
LEFT OUTER JOIN dbo.InstellingContPersDirecteurs
ON dbo.InstellingGegevens.INST_TYPE = dbo.InstellingContPersDirecteurs.INST_TYPE
AND dbo.InstellingGegevens.INST_REF = dbo.InstellingContPersDirecteurs.INST_REF
AND dbo.InstellingGegevens.INST_LOC_REF = dbo.InstellingContPersDirecteurs.INST_LOC_REF
CROSS APPLY
(SELECT TOP (1) *
FROM InstellingLogin AS il
WHERE Instellingen.INST_LOC_REF = il.Inst_Loc_REF
AND Instellingen.INST_LOCNR = il.Inst_Loc_Nr
AND Instellingen.INST_REF = il.Inst_InstellingIKON_REF
AND Instellingen.INST_TYPE = il.Inst_InstellingIKONType
ORDER BY CASE
WHEN il.datum_tot IS NULL
THEN 0 ELSE 1
END
, il.datum_tot DESC) InstellingLogin
This view returns me about 5.5k rows, in about 1s. This is fast!
However!
When I call this view with a where clause:
SELECT *
FROM [Tink].[dbo].[InstellingAlleDetails]
where gemeente is not null and (DATUM_TOT is null or DATUM_TOT > GETDATE())
order by GEMEENTE, POSTCODE,STRAAT, INST_NAAM
it takes 1min 20s to return all rows.
When I drop the gemeente is not null part, it takes again 1s.
Gemeente is a varchar(255). I also tried it with Inst_Naam is not null and that also took about 1min 30s.
Why does this is not null take so much time? And more importantly: how do I fix this?
I don't know why. Probably SQL Server comes up with a query plan that is not so good.
You could try to first run the query without gemeente is not null and put the result in a temp table and then query the temp table with gemeente is not null.
select *
into #TempTable
from YourView
select *
from #TempTable
where gemeente is not null
drop table #TempTable
First check the execution plans on both the query with and without that is not null and see the differences.
BTW are any of these joins to other views? That can cause tremendous performance problems.
I am facing strange issue in Db2 .
I am getting DB2 SQL error: SQLCODE: -101, SQLSTATE: 54001, SQLERRMC: 1
The same query works for 1000 even 10000 records but does not works for particualar sets of records(150-300).I am able to reproduce now with those records.
Query uses Select and With cause only.
So I donot think increasing STMT Heap Memory will make any sense as the query works for larger records.
Query is Big and Consists of only Select Join and few Case statement.
Query is also using With statement.
#Note Every Record is independent in its own have relation with another record.
Here is Query
WITH
itemStyle_ AS (
SELECT * FROM item.itemStyle WHERE itemSTY_SEQ
---- This Parameter gets changes to 1000 only
IN( 'awudhjqwdvwd12' )
),CustomsInfo AS
(SELECT 3 AS ReitemrtGrp, 3 AS REitemRTGRP2, HSYS_NO, NHSYS_NO, itemCUSTOMSINFO.itemDEL_SEQ,-1 AS COL_NO,
itemStyle.MyApp_item_NO, itemStyle.SIZE_TNAME, itemStyle.CS_DATE, itemStyle.SIZ1TABID, itemDELIVERY.DS_NO,
itemStyle.ABM_Date, itemStyle.RS_Date,itemStyle.CustCo_NO, itemStyle.Cust_Code, itemStyle.UCustCo_No, itemStyle.Prodiv_desc, itemStyle.Busunidesc,itemStyle.COno, itemStyle.STY_NO
FROM item.itemCUSTOMSINFO itemCUSTOMSINFO INNER JOIN item.itemDELIVERY itemDELIVERY ON itemCUSTOMSINFO.itemDEL_SEQ = itemDELIVERY.itemDEL_SEQ, itemStyle_ itemStyle
WHERE (HSYS_NO IS NOT NULL OR NHSYS_NO IS NOT NULL)
AND itemCUSTOMSINFO.itemSTY_SEQ = itemStyle.itemSTY_SEQ
),
SizeInfo AS(
SELECT 1 AS ReitemrtGrp2,
itemStyle.SIZ1TABID, itemDELCOLOR.itemDEL_SEQ, itemStyle.MyApp_item_NO, itemStyle.CS_DATE, itemStyle.STY_NO,
itemStyle.ABM_Date, itemStyle.RS_Date,itemStyle.CustCo_NO, itemStyle.Cust_Code, itemStyle.UCustCo_No, itemStyle.Prodiv_desc, itemStyle.Busunidesc,itemStyle.COno,itemDELCOLOR.DS_NO,
itemColor.COL_NO,CUSIZ_CODE,
itemDELSIZE.QUANTITY,itemDELSIZE.OCP_FACTOR,itemDELSIZE.SKU_CODE,
itemSIZE.SIZE_CODE, itemSIZE.UNIT_PRC,itemSIZE.SURCHARGE,itemSIZE.SIZNUM itemSIZE_NUM, itemSIZE.UNIT_DISC, itemSIZE.PACK_UNIT
FROM
itemStyle_ AS itemStyle
INNER JOIN item.itemColor itemColor ON itemStyle.itemSTY_SEQ = itemColor.itemSTY_SEQ
INNER JOIN item.itemDELCOLOR itemDELCOLOR ON itemDELCOLOR.itemCOL_SEQ = itemColor.itemCOL_SEQ
INNER JOIN item.itemDELSIZE itemDELSIZE ON itemDELCOLOR.itemDELCOL_SEQ = itemDELSIZE.itemDELCOL_SEQ
INNER JOIN item.itemSIZE itemSIZE ON itemDELSIZE.itemSIZ_SEQ = itemSIZE.itemSIZ_SEQ
),OrderChar AS(
SELECT 3 AS ReitemrtGrp2, 2.6 AS ReitemrtGrp,
ordchar_desc, itemStyle.COno, CS_Date, SIZ1TABID, itemStyle.MyApp_item_NO, itemStyle.STY_NO,
itemStyle.ABM_Date, itemStyle.RS_Date,itemStyle.CustCo_NO, itemStyle.Cust_Code, itemStyle.UCustCo_No, itemStyle.Prodiv_desc, itemStyle.Busunidesc,itemDELIVERY.itemDEL_SEQ FROM
item.itemORDERCHAR itemOrderChar INNER JOIN itemStyle_ itemStyle ON itemOrderChar.itemSty_Seq = itemStyle.itemSty_Seq
INNER JOIN item.itemDELIVERY itemDELIVERY ON itemStyle.itemSTY_SEQ = itemDELIVERY.itemSTY_SEQ
),
Supp_Address AS (
SELECT ADDRESS.COMPANY1 AS SuppAdd_COMPANY1,
ADDRESS.COMPANY2 AS SuppAdd_COMPANY2,
ADDRESS.COMPANY3 AS SuppAdd_COMPANY3,
ADDRESS.STREET1 AS SuppAdd_STREET1,
ADDRESS.STREET2 AS SuppAdd_STREET2,
ADDRESS.STREET3 AS SuppAdd_STREET3,
ADDRESS.CITY AS SuppAdd_CITY,
ADDRESS.STATENAME AS SuppAdd_STATENAME,
ADDRESS.COUNTRY AS SuppAdd_COUNTRY,
ADDRESS.ZIP_CODE AS SuppAdd_ZIP_CODE,
SUPPLIER.SUP1COMID,
CONTACTINF.C_PHONENO, CONTACTINF.A_PHONENO, CONTACTINF.M_PHONE ,
ADDRESS.ZitemST_BOX , ADDRESS.itemST_BOX
FROM item.ADDRESS ADDRESS,
item.ORGANZN ORGANZN
LEFT OUTER JOIN item.SUPPLIER SUPPLIER
ON ORGANZN.ORG_ID=SUPPLIER.ORG_ID,
item.CONTACTINF CONTACTINF WHERE
( ADDRESS.ORG_ID=ORGANZN.ORG_ID ) AND
( CONTACTINF.ADDRESS_ID=ADDRESS.ADDRESS_ID ) AND
(
SUPPLIER.SUPP_FLAG = 'Y'
)) ,
Cust_Address AS (
SELECT VALUE(ADDRESS.COMPANY1,'') CustAdd_COMPANY1 ,
VALUE(ADDRESS.COMPANY2,'') AS CustAdd_COMPANY2,
VALUE(ADDRESS.COMPANY3,'') AS CustAdd_COMPANY3,
VALUE(ADDRESS.STREET1,'') AS CustAdd_STREET1,
VALUE(ADDRESS.STREET2,'') AS CustAdd_STREET2,
VALUE(ADDRESS.STREET3 ,'') AS CustAdd_STREET3,
VALUE(ADDRESS.CITY,'') AS CustAdd_CITY,
VALUE(ADDRESS.STATENAME,'') AS CustAdd_STATENAME,
VALUE(ADDRESS.COUNTRY ,'') AS CustAdd_COUNTRY,
VALUE(ADDRESS.ZIP_CODE ,'')AS CustAdd_ZIPCODE,
VALUE(CUSTOMER.CUST_ID ,'')AS CustAdd_CUST_ID,
VALUE(ADDRESS.ZitemST_BOX,'') AS CustAdd_ZitemST_BOX ,
VALUE(ADDRESS.itemST_BOX,'') AS CustAdd_itemST_BOX
FROM item.ADDRESS ADDRESS,
item.CUSTOMER CUSTOMER
LEFT OUTER JOIN item.ORGANZN ORGANZN
ON ORGANZN.ORG_ID=CUSTOMER.ORG_ID,
item.ORGDEFAULTS ORGDEFAULTSWHERE
( ADDRESS.ORG_ID=ORGANZN.ORG_ID )
AND (
ADDRESS.ADDRESS_ID=ORGDEFAULTS.DEFAULT_VALUE_ID ) AND
( CUSTOMER.CUST_FLAG='Y' )
AND ORGDEFAULTS.DEFAULT_ITEM = 'MAILING_ADDRESS'
SELECT VALUE(CustomsInfo.ReitemrtGrp, OrderChar.ReitemrtGrp, 3) AS ReitemrtGrp,
VALUE(SizeInfo.ReitemrtGrp2, OrderChar.ReitemrtGrp2, CustomsInfo.ReitemrtGrp2, 4) AS ReitemrtGrp2,
VALUE(itemStyle.MyApp_item_NO, CUSTOMSINFO.MyApp_item_NO, SizeInfo.MyApp_item_NO,OrderChar .MyApp_item_NO) AS MyApp_item_NO ,
itemStyle.COno ,
itemStyle.STAT_DESC ,
itemStyle.CUST_CODE ,
itemStyle.CUST_NAME ,
itemStyle.CUSTCO_NO ,
itemStyle.UCUST_CODE ,
itemStyle.UCUST_NAME ,
itemStyle.DSHIP_FLAG ,
itemStyle.STY_NO ,
itemStyle.STY_DESC ,
itemStyle.BRAND_DESC ,
itemStyle.PRODIV_DESC ,
itemStyle.CUSTY_DESC ,
itemStyle.SEA_DESC ,
itemStyle.LINNAMDESC ,
itemStyle.SUPP_CODE ,
itemStyle.SUPP_NAME,
itemStyle.CONCEPDESC ,
itemStyle.RS_DATE ,
itemStyle.ABM_DATE ,
VALUE(itemStyle.CS_DATE, CustomsInfo.CS_DATE, SizeInfo.CS_DATE, OrderChar.CS_Date) AS CS_DATE ,
itemStyle.REMARKS ,
itemStyle.LASTUPDATE ,
itemStyle.FACT_CODE ,
itemStyle.C_ORIGIN ,
itemStyle.itemDDESC,
VALUE(itemDELIVERY.DS_NO, SizeInfo.DS_NO,CustomsInfo.DS_NO) AS DS_NO ,
itemDELIVERY.CUST_DS_NO ,
itemDELIVERY.ULTCUST_DS_NO,
itemDELIVERY.LCS_DATE ,
itemDELIVERY.DTERM_DESC ,
itemSHIPINST.SHIP_MARKS ,
itemDELIVERY.PACK_INST,
itemStyle.KEY_SIZE ,
itemSHIPINST.SMODE_DESC ,
itemSHIPINST.ORIGN_itemRT ,
itemSHIPINST.DEST_itemRT ,
itemSHIPINST.CARR_DESC ,
itemSHIPINST.SPL_INST,
itemStyle.PAYM_DESC ,
itemStyle.PAYT_DESC ,
itemStyle.UCUSTCO_NO ,
itemStyle.ORD_RDATE ,
itemStyle.ORG_NAME ,
itemStyle.CUSTY_NO ,
VALUE(itemDELADDRESS.COMPANY1,'') AS DELCOMPANY1 ,
VALUE(itemDELADDRESS.COMPANY2,'') AS DELCOMPANY2 ,
VALUE(itemDELADDRESS.COMPANY3,'') AS DELCOMPANY3 ,
VALUE(itemDELADDRESS.STREET1,'') AS DELSTREET1,
VALUE(itemDELADDRESS.STREET2,'') AS DELSTREET2,
VALUE(itemDELADDRESS.STREET3,'') AS DELSTREET3,
VALUE(itemDELADDRESS.CITY,'') AS DELCITY,
VALUE(itemDELADDRESS.STATENAME,'') AS DELSTATENAME,
VALUE(itemDELADDRESS.COUNTRY,'') AS DELCOUNTRY,
VALUE(itemDELADDRESS.ZIP_CODE,'') AS DELZIP ,
VALUE(itemDELIVERY.itemDEL_SEQ , CustomsInfo.itemDEL_SEQ, SizeInfo.itemDEL_SEQ, OrderChar.itemDEL_SEQ) AS itemDEL_SEQ ,
itemStyle.DEBTOR_CODE ,
VALUE(itemADDRESS.STATENAME,'') AS STATENAME,
VALUE(itemADDRESS.COMPANY1,'') AS COMPANY1,
VALUE(itemADDRESS.COMPANY2,'') AS COMPANY2,
VALUE(itemADDRESS.COMPANY3,'') AS COMPANY3,
VALUE(itemADDRESS.STREET1,'') AS STREET1,
VALUE(itemADDRESS.STREET2,'') AS STREET2,
VALUE(itemADDRESS.STREET3,'') AS STREET3,
VALUE(itemADDRESS.CITY,'') AS CITY,
VALUE(itemADDRESS.COUNTRY,'') AS itemADDRCOUNTRY,
VALUE(itemADDRESS.ZIP_CODE,'') AS ZIP_CODE,
itemStyle.CURRENCY ,
itemStyle.CREATEDATE ,
itemStyle.SIZE_TNAME ,
itemStyle.BUSUNIDESC ,
VALUE (itemStyle.SIZ1TABID, CustomsInfo.SIZ1TABID, SizeInfo.SIZ1TABID, OrderChar.SIZ1TABID) AS SIZ1TABID,
itemStyle.DISC_VALUE ,
HSYS_NO, NHSYS_NO ,
VALUE(itemColor.COL_NO, SizeInfo.COL_NO, CustomsInfo.COL_NO) AS COL_NO,
itemColor.PROCH_DESC ,
itemColor.PROREQDESC ,
itemColor.COL_DESC ,
VALUE (itemColor.HAND_CHARGE,0) HAND_CHARGE ,
VALUE(itemColor.OTHER_CHARGES, 0) OTHER_CHARGES ,
itemColor.PERF_CODE,
SizeInfo.QUANTITY ,
SizeInfo.OCP_FACTOR ,
SizeInfo.SKU_CODE ,
SizeInfo.SIZE_CODE ,
SizeInfo.UNIT_PRC ,
SizeInfo.SURCHARGE ,
SizeInfo.itemSIZE_NUM ,
SizeInfo.UNIT_DISC,
SizeInfo.CUSIZ_CODE,
SizeInfo.PACK_UNIT,
YOUTSOLE.ITMDES AS OUTSOLEDESC, YOUTSOLE.OUTSOLE AS OUTSOLECODE,
/* (SELECT ITMDES FROM item.YCATEGO YCATEGO WHERE YCATEGO.categoid = art1sty.categoid) AS CategoDesc,
(SELECT ITMDES FROM item.YACTGRP YACTGRP WHERE YACTGRP.actgrpid = art1sty.actgrpid) AS ACTGRPDesc,*/
LEADTM_DESC AS LeadTime,
/* (SELECT SUM(VALUE(hand_charge,0) + VALUE(other_charges,0)) AS TotalCharge FROM item.itemColor itemColor WHERE itemColor.itemSTY_SEQ = itemStyle.itemSTY_SEQ) AS TotalCharge,*/
itemDelivery.AMD_Date,
OrderChar.ordchar_desc,
YPROCON.ITMDES AS PromotionContract,
(SELECT SUM(QUANTITY) FROM SizeInfo WHERE SizeInfo.MyApp_item_NO = itemStyle.MyApp_item_NO) AS OrderTotalQty,
Supp_Address.*,
Cust_Address.*,
CASE WHEN 'MyAppitemNo' = 'csDate' THEN VALUE(itemStyle.CS_Date, CustomsInfo.CS_Date, SizeInfo.CS_Date, OrderChar.CS_Date)
WHEN 'MyAppitemNo' = 'rsDate' THEN VALUE(itemStyle.RS_Date, CustomsInfo.RS_Date,SizeInfo.RS_Date, OrderChar.RS_Date)
WHEN 'MyAppitemNo' = 'lcsDate' THEN VALUE(itemStyle.CS_Date, CustomsInfo.CS_Date, SizeInfo.CS_Date, OrderChar.CS_Date)
ELSE '2010-01-01'
END AS SortDate,
CASE WHEN 'MyAppitemNo' = 'MyAppitemNo' THEN VALUE(itemStyle.MyApp_item_NO, CustomsInfo.MyApp_item_NO, SizeInfo.MyApp_item_NO, OrderChar.MyApp_item_NO)
WHEN 'MyAppitemNo' = 'MyAppCoNo' THEN VALUE(itemStyle.COno, CustomsInfo.COno, SizeInfo.COno, OrderChar.COno)
WHEN 'MyAppitemNo' = 'custCoNo' THEN VALUE(itemStyle.CustCO_NO, CustomsInfo.CustCO_NO, SizeInfo.CustCO_NO, OrderChar.CustCO_NO)
WHEN 'MyAppitemNo' = 'custCode' THEN VALUE(itemStyle.Cust_Code, CustomsInfo.Cust_Code,SizeInfo.Cust_Code, OrderChar.Cust_Code)
WHEN 'MyAppitemNo' = 'ucustCoNo' THEN VALUE(itemStyle.UCustCO_NO, CustomsInfo.UCustCO_NO, SizeInfo.UCustCO_NO, OrderChar.UCustCO_NO)
WHEN 'MyAppitemNo' = 'proDivDesc' THEN VALUE(itemStyle.Prodiv_Desc, CustomsInfo.Prodiv_Desc, SizeInfo.Prodiv_Desc, OrderChar.Prodiv_Desc)
WHEN 'MyAppitemNo' = 'busUniDesc' THEN VALUE(itemStyle.BUSUNIDESC, CustomsInfo.BusuniDesc, SizeInfo.BusuniDesc, OrderChar.BusuniDesc)
WHEN 'MyAppitemNo' = 'styNo' THEN VALUE(itemStyle.STY_NO, CustomsInfo.STY_NO, SizeInfo.STY_NO, OrderChar.STY_NO)
ELSE 'xxx'
END AS SortField
FROM itemStyle_ AS itemStyle
INNER JOIN item.itemDELIVERY itemDELIVERY ON itemStyle.itemSTY_SEQ = itemDELIVERY.itemSTY_SEQ
INNER JOIN item.itemDELCOLOR itemDELCOLOR ON itemDELCOLOR.itemDEL_SEQ = itemDELIVERY.itemDEL_SEQ
INNER JOIN item.itemColor itemColor ON itemDELCOLOR.itemCOL_SEQ = itemColor.itemCOL_SEQ
INNER JOIN item.itemSHIPINST itemSHIPINST ON itemSHIPINST.itemDEL_SEQ = itemDELIVERY.itemDEL_SEQ
INNER JOIN item.itemDELADDRESS itemDELADDRESS ON itemDELADDRESS.itemDEL_SEQ = itemDELIVERY.itemDEL_SEQ
INNER JOIN item.itemADDRESS itemADDRESS ON itemADDRESS.itemSTY_SEQ = itemStyle.itemSTY_SEQ
INNER JOIN item.ART1STY ART1STY ON ART1STY.ART1STYID = itemStyle.ART1STYID
INNER JOIN Supp_Address ON itemStyle.SUPP_ID = Supp_Address.SUP1COMID
INNER JOIN Cust_Address ON itemStyle.CUST_ID = Cust_Address.CustAdd_Cust_ID
LEFT OUTER JOIN item.ART4COS ART4COS ON itemColor.ART4COSID = ART4COS.ART4COSID
LEFT OUTER JOIN item.ART2STS ART2STS ON ART2STS.ART2STSID = ART4COS.ART2STSID
LEFT JOIN item.YPROCON YPROCON ON ART2STS.PROCONID = YPROCON.PROCONID
LEFT OUTER JOIN item.YOUTSOLE YOUTSOLE ON YOUTSOLE.OUTSOLEID = ART1STY.OUTSOLEID
FULL OUTER JOIN CustomsInfo ON 1=2
FULL OUTER JOIN SizeInfo ON 1=2
FULL OUTER JOIN OrderChar ON 1=2
ORDER BY
SortDate DESC, SortField DESC,
MyApp_item_NO ,
VALUE(DS_NO,0),
VALUE(COL_NO,0),
itemDEL_SEQ,
ReitemrtGrp,
ReitemrtGrp2 DESC, SizeInfo.itemSIZE_NUM
FOR READ ONLY
Update:
My DB is having no triggers and procedures
The Strange part is for those set of (300) records query fails but works fine for 1000 rows/records/input parameters. Any Idea.
It is because of the query statement exceed the default size of 4KB. You can set the statement heap size as the following.
db2 update db cfg for YOUR_DATABASE_NAME using STMTHEAP 8192 AUTOMATIC