gpt4 book ai didi

sql-server - 处理大量数据,以及在 SQL Server 2008 中使用 12 个内部联接的查询

转载 作者:行者123 更新时间:2023-12-03 16:37:22 27 4
gpt4 key购买 nike

有一个旧的 SSIS 包每天从 oracle 中提取大量数据到我们的 Sql Server 数据库。数据被插入到一个非规范化数据库中,我正在处理一个存储过程来选择该数据,并将其插入到一个规范化数据库中。 Oracle 数据库过度规范化,所以我编写的查询最终有 12 个内部联接来获取我需要的所有列。另一个问题是我正在处理大量数据。我从中选择的一张表有超过 1200 万条记录。这是我的查询:

Declare @MewLive Table
(

UPC_NUMBER VARCHAR(50),
ITEM_NUMBER VARCHAR(50),
STYLE_CODE VARCHAR(20),
COLOR VARCHAR(8),
SIZE VARCHAR(8),
UPC_TYPE INT,
LONG_DESC VARCHAR(120),
LOCATION_CODE VARCHAR(20),
TOTAL_ON_HAND_RETAIL NUMERIC(14,0),
VENDOR_CODE VARCHAR(20),
CURRENT_RETAIL NUMERIC(14,2)


)

INSERT INTO @MewLive(UPC_NUMBER,ITEM_NUMBER,STYLE_CODE,COLOR,[SIZE],UPC_TYPE,LONG_DESC,LOCATION_CODE,TOTAL_ON_HAND_RETAIL,VENDOR_CODE,CURRENT_RETAIL)
SELECT U.UPC_NUMBER, REPLACE(ST.STYLE_CODE, '.', '')
+ '-' + SC.SHORT_DESC + '-' + REPLACE(SM.PRIM_SIZE_LABEL, '.', '') AS ItemNumber,
REPLACE(ST.STYLE_CODE, '.', '') AS Style_Code, SC.SHORT_DESC AS Color,
REPLACE(SM.PRIM_SIZE_LABEL, '.', '') AS Size, U.UPC_TYPE, ST.LONG_DESC, L.LOCATION_CODE,
IB.TOTAL_ON_HAND_RETAIL, V.VENDOR_CODE, SD.CURRENT_RETAIL
FROM MewLive.dbo.STYLE AS ST INNER JOIN
MewLive.dbo.SKU AS SK ON ST.STYLE_ID = SK.STYLE_ID INNER JOIN
MewLive.dbo.UPC AS U ON SK.SKU_ID = U.SKU_ID INNER JOIN
MewLive.dbo.IB_INVENTORY_TOTAL AS IB ON SK.SKU_ID = IB.SKU_ID INNER JOIN
MewLive.dbo.LOCATION AS L ON IB.LOCATION_ID = L.LOCATION_ID INNER JOIN
MewLive.dbo.STYLE_COLOR AS SC ON ST.STYLE_ID = SC.STYLE_ID INNER JOIN
MewLive.dbo.COLOR AS C ON SC.COLOR_ID = C.COLOR_ID INNER JOIN
MewLive.dbo.STYLE_SIZE AS SS ON ST.STYLE_ID = SS.STYLE_ID INNER JOIN
MewLive.dbo.SIZE_MASTER AS SM ON SS.SIZE_MASTER_ID = SM.SIZE_MASTER_ID INNER JOIN
MewLive.dbo.STYLE_VENDOR AS SV ON ST.STYLE_ID = SV.STYLE_ID INNER JOIN
MewLive.dbo.VENDOR AS V ON SV.VENDOR_ID = V.VENDOR_ID INNER JOIN
MewLive.dbo.STYLE_DETAIL AS SD ON ST.STYLE_ID = SD.STYLE_ID
WHERE (U.UPC_TYPE = 1) AND (ST.ACTIVE_FLAG = 1)

该查询几乎使我们的服务器崩溃。我试图通过将查询分解为更小的查询来解决问题,但我使用的临时表变量导致 tempdb 数据库填满硬盘驱动器。我认为这是因为服务器内存不足并崩溃了。有没有办法解决这个问题?

最佳答案

您是否尝试过使用真实表而不是临时表。您可以使用 SELECT INTO 创建一个真正的表来存储结果,而不是一个临时表。

语法为:

SELECT 
U.UPC_NUMBER,
REPLACE(ST.STYLE_CODE, '.', '').
....
INTO
MEWLIVE
FROM
MewLive.dbo.STYLE AS ST INNER JOIN
...

该命令将创建表,并可能有助于解决您遇到的内存问题。

另外尝试查看查询分析器中的执行计划或尝试使用索引优化向导建议一些可能有助于加快查询速度的索引。

关于sql-server - 处理大量数据,以及在 SQL Server 2008 中使用 12 个内部联接的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com