如何解决优化查询设计Teradata
由于有人退休,我被要求快速自动化某些事情。该过程有成百上千的查询,对代码的快速概览当然可以做得更好,但是他们希望在月底之前完成它,而这让我没有时间进行修复。
我们的Teradata环境中,数据库管理员中止了超过20k cpu使用量的查询。到目前为止,我已经完成了使用多个循环填充易失表的第60步,我有以下步骤。
create volatile table IATA as (
SELECT
b."DOM/INTL- pos",a.REV,a.RPM,a.TKTNG_ARLN_CD,a.PARENT_PNR,a.PNR_CREATE_DT,a.Fare_Product,a.SPACE_HELD,a.TKTD_PAX,a.UNTKTD_PAX,a.XNCL_DT,a.DAYS_HELD,a.DPTR_DT,a.BKG_TYPE,a.create_to_dept,a.create_to_xncl,a.cancel_to_dept,a.HOME_OFFICE_IATA,a.SUB_OFFICE_IATA,b.COUNTRY_NAME
FROM GQI_COM28_IATA a
right join IATA1 b
on a.PARENT_PNR = b.PARENT_PNR
and a.PNR_CREATE_DT = b.PNR_CREATE_DT
WHERE a.pnr_create_dt between date-1085 and date - 1
) with data no primary index ON COMMIT PRESERVE ROWS;
我尝试使用btet将以上内容分成一个循环,并使用VBA一次循环一天,如下所示:
Public Function GQI_62 ()
QueryStringX = ""
QueryStringX = QueryStringX & " "
QueryStringX = QueryStringX & " create volatile table IATA as ( "
QueryStringX = QueryStringX & " SELECT "
QueryStringX = QueryStringX & " b.""DOM/INTL- pos"","
QueryStringX = QueryStringX & " a.REV,"
QueryStringX = QueryStringX & " a.RPM,"
QueryStringX = QueryStringX & " a.TKTNG_ARLN_CD,"
QueryStringX = QueryStringX & " a.PARENT_PNR,"
QueryStringX = QueryStringX & " a.PNR_CREATE_DT,"
QueryStringX = QueryStringX & " a.Fare_Product,"
QueryStringX = QueryStringX & " a.SPACE_HELD,"
QueryStringX = QueryStringX & " a.TKTD_PAX,"
QueryStringX = QueryStringX & " a.UNTKTD_PAX,"
QueryStringX = QueryStringX & " a.XNCL_DT,"
QueryStringX = QueryStringX & " a.DAYS_HELD,"
QueryStringX = QueryStringX & " a.DPTR_DT,"
QueryStringX = QueryStringX & " a.BKG_TYPE,"
QueryStringX = QueryStringX & " a.create_to_dept,"
QueryStringX = QueryStringX & " a.create_to_xncl,"
QueryStringX = QueryStringX & " a.cancel_to_dept,"
QueryStringX = QueryStringX & " a.HOME_OFFICE_IATA,"
QueryStringX = QueryStringX & " a.SUB_OFFICE_IATA,"
QueryStringX = QueryStringX & " b.COUNTRY_NAME "
QueryStringX = QueryStringX & " FROM GQI_COM28_IATA a "
QueryStringX = QueryStringX & " right join IATA1 b "
QueryStringX = QueryStringX & " on a.PARENT_PNR = b.PARENT_PNR "
QueryStringX = QueryStringX & " and a.PNR_CREATE_DT = b.PNR_CREATE_DT "
QueryStringX = QueryStringX & " WHERE a.pnr_create_dt between date-10 and date - 0 "
QueryStringX = QueryStringX & " ) with data no primary index ON COMMIT DELETE ROWS; "
Call Variants.Query_X
QueryStringX = " "
QueryStringX = QueryStringX & "BT; "
x = 0
For i = 1 To 1085
x = x + 1
If i < 108 Then y = x + 9
If i = 108 Then y = 1085
QueryStringX = QueryStringX & " insert into IATA "
QueryStringX = QueryStringX & " SELECT "
QueryStringX = QueryStringX & " b.""DOM/INTL- pos"","
QueryStringX = QueryStringX & " b.COUNTRY_NAME "
QueryStringX = QueryStringX & " FROM GQI_COM28_IATA a "
QueryStringX = QueryStringX & " right join IATA1 b "
QueryStringX = QueryStringX & " on a.PARENT_PNR = b.PARENT_PNR "
QueryStringX = QueryStringX & " and a.PNR_CREATE_DT = b.PNR_CREATE_DT "
QueryStringX = QueryStringX & " WHERE a.pnr_create_dt = date-" & i & " "
'QueryStringX = QueryStringX & " WHERE a.pnr_create_dt between date-" & y & " and date-" & x & " "
QueryStringX = QueryStringX & " ; "
'Call Variants.Query_X
x = y
Next i
QueryStringX = QueryStringX & " ET; "
'QueryStringX = QueryStringX & "sel count(*) AS CntR from IATA1 "
Call Variants.Query_X
On Error Resume Next
If Not (rs Is Nothing) Then
If (rs.State And adStateOpen) = adStateOpen Then
rs.Close
End If
Set rs = Nothing
End If
End Function
上面的代码在几天的测试中效果很好,但是由于查询已中止,因此完整1085错误。因此,我决定尝试一下,希望节食者能在给定的背景下看到并能提供任何想法或好的建议?
这是我从上面开始优化并使用多年的查询调用。
Public ns As ADODB.Connection
Public rs As ADODB.Recordset
Public connector As String
Public QueryStringX As String
Public GRPcntR As Integer
Public FlyR As Integer
Public BgDT As Integer
Public EnDT As Integer
Public DtFltr As Date
Public Function ObjectConnect(AAConn As String)
ObjectConnect = AAConn
End Function
Public Sub NewConnect()
Dim cnn As ADODB.Connection
Dim dlk As MSDASC.DataLinks
Set cnn = New ADODB.Connection
Set dlk = New MSDASC.DataLinks
cnn.ConnectionString = dlk.PromptNew
DoCmd.RunSQL (" DELETE Cred.* FROM Cred;")
DoCmd.RunSQL ("INSERT INTO Cred ( ID,Nm ) SELECT '" & cnn.ConnectionString & "' AS Expr1,'" & Environ("USERNAME") & "' As Exp2;")
Dim ns As ADODB.Connection
Set ns = New ADODB.Connection
ns.ConnectionTimeout = 99000
ns.CommandTimeout = 99000
connector = CurrentDb.OpenRecordset("SELECT Cred.ID FROM Cred;").Fields(0).Value
'connector = cnn.ConnectionString
ns.Open connector
Set cnn = Nothing
Set dlk = Nothing
End Sub
Public Sub Query_X()
'Err.Clear
'Debug.Print Err.Description
Dim txtN As String
Dim DL As String
Dim Query As String
Dim LogIDr As String
On Error GoTo GrpErr
Set rs = New ADODB.Recordset
'rs.CursorLocation = adUseClient
Query = QueryStringX
'MsgBox Query
If Not (ns Is Nothing) Then
If (ns.State And adStateOpen) = adStateOpen Then
With rs
.ActiveConnection = ns
.Open Query
End With
'x = rs.Fields(0).Value
End If
Else
Set ns = New ADODB.Connection
ns.ConnectionTimeout = 99000
ns.CommandTimeout = 99000
If Len(connector) < 1 Then
ObjectConnect connector
End If
ObjectConnect connector
ns.Open connector
With rs
.ActiveConnection = ns
.Open Query
End With
End If
'Debug.Print Err.Description
GrpErr:
If Len(Err.Description) > 2 Then
Debug.Print "Error occured in " & IIf(FlyR = 0,"GQI_","ABK_") & GRPcntR & ": " & Err.Description
Err.Clear
End If
GRPcntR = GRPcntR + 1
End Sub
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com(将#修改为@)