Tại sao truy vấn này trở nên chậm hơn đáng kể khi được bọc trong TVF?


17

Tôi có một truy vấn khá phức tạp chỉ chạy trong vài giây, nhưng khi được bọc trong một hàm có giá trị bảng, nó sẽ chậm hơn rất nhiều; Tôi thực sự không để nó kết thúc, nhưng nó chạy tới mười phút mà không kết thúc. Thay đổi duy nhất là thay thế hai biến ngày (được khởi tạo bằng chữ ngày) bằng tham số ngày:

Chạy trong bảy giây

DECLARE @StartDate DATE = '2011-05-21'
DECLARE @EndDate   DATE = '2011-05-23'

DECLARE @Data TABLE (...)
INSERT INTO @Data(...) SELECT...

SELECT * FROM @Data

Chạy trong ít nhất mười phút

CREATE FUNCTION X (@StartDate DATE, @EndDate DATE)
  RETURNS TABLE AS RETURN
  SELECT ...

SELECT * FROM X ('2011-05-21', '2011-05-23')

Trước đây tôi đã viết hàm dưới dạng TVF đa câu lệnh với mệnh đề RETURNS @Data TABLE (...), nhưng việc hoán đổi rằng cấu trúc nội tuyến không tạo ra thay đổi đáng chú ý. Thời gian dài của TVF là SELECT * FROM Xthời gian thực tế ; thực sự tạo UDF chỉ mất vài giây.

Tôi có thể đăng câu hỏi trong câu hỏi, nhưng nó hơi dài (~ 165 dòng) và, dựa trên sự thành công của cách tiếp cận đầu tiên, tôi nghi ngờ điều gì đó khác đang diễn ra. Lướt qua các kế hoạch thực hiện, chúng có vẻ giống hệt nhau.

Tôi đã thử chia truy vấn thành các phần nhỏ hơn mà không thay đổi. Không có phần nào mất nhiều hơn một vài giây khi được thực hiện một mình, nhưng TVF vẫn bị treo.

Tôi thấy một câu hỏi rất giống nhau, /programming/4190506/sql-server-2005-table-valued-feft-weird-performance , nhưng tôi không chắc rằng giải pháp đó được áp dụng. Có lẽ ai đó đã nhìn thấy vấn đề này và biết một giải pháp tổng quát hơn? Cảm ơn!

Đây là dm_exec numquests sau vài phút xử lý:

session_id              59
request_id              0
start_time              40688.46517
status                  running
command                 UPDATE
sql_handle              0x030015002D21AF39242A1101ED9E00000000000000000000
statement_start_offset  10962
statement_end_offset    16012
plan_handle             0x050015002D21AF3940C1E6B0040000000000000000000000
database_id                 21
user_id                 1
connection_id           314AE0E4-A1FB-4602-BF40-02D857BAD6CF
blocking_session_id         0
wait_type               NULL
wait_time                   0
last_wait_type          SOS_SCHEDULER_YIELD
wait_resource   
open_transaction_count  0
open_resultset_count    1
transaction_id              48030651
context_info            0x
percent_complete        0
estimated_completion_time   0
cpu_time                    344777
total_elapsed_time          348632
scheduler_id            7
task_address            0x000000045FC85048
reads                   1549
writes                  13
logical_reads           30331425
text_size               2147483647
language                us_english
date_format             mdy
date_first              7
quoted_identifier           1
arithabort              1
ansi_null_dflt_on       1
ansi_defaults           0
ansi_warnings           1
ansi_padding            1
ansi_nulls                  1
concat_null_yields_null 1
transaction_isolation_level 2
lock_timeout            -1
deadlock_priority           0
row_count                   105
prev_error              0
nest_level              1
granted_query_memory    170
executing_managed_code  0
group_id                2
query_hash              0xBE6A286546AF62FC
query_plan_hash         0xD07630B947043AF0

Đây là truy vấn đầy đủ:

CREATE FUNCTION Routine.MarketingDashboardECommerceBase (@StartDate DATE, @EndDate DATE)
RETURNS TABLE AS RETURN
    WITH RegionsByCode AS (SELECT CountryCode, MIN(Region) AS Region FROM Staging.Volusion.MarketingRegions GROUP BY CountryCode)
        SELECT
            D.Date, Div.Division, Region.Region, C.Category1, C.Category2, C.Category3,
            COALESCE(V.Visits,          0) AS Visits,
            COALESCE(Dem.Demos,         0) AS Demos,
            COALESCE(S.GrossStores,     0) AS GrossStores,
            COALESCE(S.PaidStores,      0) AS PaidStores,
            COALESCE(S.NetStores,       0) AS NetStores,
            COALESCE(S.StoresActiveNow, 0) AS StoresActiveNow
            -- This line causes the run time to climb from a few seconds to over an hour!
            --COALESCE(V.Visits,          0) * COALESCE(ACS.AvgClickCost, GAAC.AvgAdCost, 0.00) AS TotalAdCost
            -- This line alone does not inflate the run time
            --ACS.AvgClickCost
            -- This line is enough to increase the run time to at least a couple minutes
            --GAAC.AvgAdCost
        FROM
            --Dates AS D
            (SELECT SQLDate AS Date FROM Dates WHERE SQLDate BETWEEN @StartDate AND @EndDate) AS D
            CROSS JOIN (SELECT 'UK' AS Division UNION SELECT 'US' UNION SELECT 'IN' UNION SELECT 'Unknown') AS Div
            CROSS JOIN (SELECT Category1, Category2, Category3 FROM Routine.MarketingDashboardCampaignMap UNION SELECT 'Unknown', 'Unknown', 'Unknown') AS C
            CROSS JOIN (SELECT DISTINCT Region FROM Staging.Volusion.MarketingRegions) AS Region
            -- Visitors
            LEFT JOIN
                (
                SELECT
                    V.Date,
                    CASE    WHEN V.Country IN ('United Kingdom', 'Guernsey', 'Ireland', 'Jersey') THEN 'UK'
                        WHEN V.Country IN ('United States', 'Canada', 'Puerto Rico', 'U.S. Virgin Islands') THEN 'US'
                        ELSE 'IN' END AS Division,
                    COALESCE(MR.Region, 'Unknown') AS Region,
                    C.Category1, C.Category2, C.Category3,
                    SUM(V.Visits) AS Visits
                FROM
                             RawData.GoogleAnalytics.Visits        AS V
                    INNER JOIN Routine.MarketingDashboardCampaignMap AS C ON V.LandingPage = C.LandingPage AND V.Campaign = C.Campaign AND V.Medium = C.Medium AND V.Referrer = C.Referrer AND V.Source = C.Source
                    LEFT JOIN  Staging.Volusion.MarketingRegions     AS MR ON V.Country = MR.CountryName
                WHERE
                    V.Date BETWEEN @StartDate AND @EndDate
                GROUP BY
                    V.Date,
                    CASE    WHEN V.Country IN ('United Kingdom', 'Guernsey', 'Ireland', 'Jersey') THEN 'UK'
                        WHEN V.Country IN ('United States', 'Canada', 'Puerto Rico', 'U.S. Virgin Islands') THEN 'US'
                        ELSE 'IN' END,
                    COALESCE(MR.Region, 'Unknown'), C.Category1, C.Category2, C.Category3
                ) AS V ON D.Date = V.Date AND Div.Division = V.Division AND Region.Region = V.Region AND C.Category1 = V.Category1 AND C.Category2 = V.Category2 AND C.Category3 = V.Category3
            -- Demos
            LEFT JOIN
                (
                SELECT
                    OD.SQLDate,
                    G.Division,
                    COALESCE(MR.Region,   'Unknown') AS Region,
                    COALESCE(C.Category1, 'Unknown') AS Category1,
                    COALESCE(C.Category2, 'Unknown') AS Category2,
                    COALESCE(C.Category3, 'Unknown') AS Category3,
                    SUM(D.Demos) AS Demos
                FROM
                             Demos            AS D
                    INNER JOIN Orders           AS O  ON D."Order" = O."Order"
                    INNER JOIN Dates            AS OD ON O.OrderDate = OD.DateSerial
                    INNER JOIN MarketingSources AS MS ON D.Source = MS.Source
                    LEFT JOIN  RegionsByCode    AS MR ON MS.CountryCode = MR.CountryCode
                    LEFT JOIN
                        (
                        SELECT
                            G.TransactionID,
                            MIN (
                                CASE WHEN G.Country IN ('United Kingdom', 'Guernsey', 'Ireland', 'Jersey') THEN 'UK'
                                    WHEN G.Country IN ('United States', 'Canada', 'Puerto Rico', 'U.S. Virgin Islands') THEN 'US'
                                    ELSE 'IN' END
                                ) AS Division
                        FROM
                            RawData.GoogleAnalytics.Geography AS G
                        WHERE
                                TransactionDate BETWEEN @StartDate AND @EndDate
                            AND NOT EXISTS (SELECT * FROM RawData.GoogleAnalytics.Geography AS G2 WHERE G.TransactionID = G2.TransactionID AND G2.EffectiveDate > G.EffectiveDate)
                        GROUP BY
                            G.TransactionID
                        ) AS G  ON O.VolusionOrderID = G.TransactionID
                    LEFT JOIN  RawData.GoogleAnalytics.Referrers     AS R  ON O.VolusionOrderID = R.TransactionID AND NOT EXISTS (SELECT * FROM RawData.GoogleAnalytics.Referrers AS R2 WHERE R.TransactionID = R2.TransactionID AND R2.EffectiveDate > R.EffectiveDate)
                    LEFT JOIN  Routine.MarketingDashboardCampaignMap AS C  ON MS.LandingPage = C.LandingPage AND MS.Campaign = C.Campaign AND MS.Medium = C.Medium AND COALESCE(R.ReferralPath, '(not set)') = C.Referrer AND MS.SourceName = C.Source
                WHERE
                        O.IsDeleted = 'No'
                    AND OD.SQLDate BETWEEN @StartDate AND @EndDate
                GROUP BY
                    OD.SQLDate,
                    G.Division,
                    COALESCE(MR.Region,   'Unknown'),
                    COALESCE(C.Category1, 'Unknown'),
                    COALESCE(C.Category2, 'Unknown'),
                    COALESCE(C.Category3, 'Unknown')
                ) AS Dem ON D.Date = Dem.SQLDate AND Div.Division = Dem.Division AND Region.Region = Dem.Region AND C.Category1 = Dem.Category1 AND C.Category2 = Dem.Category2 AND C.Category3 = Dem.Category3
            -- Stores
            LEFT JOIN
                (
                SELECT
                    OD.SQLDate,
                    CASE WHEN O.VolusionCountryCode = 'GB' THEN 'UK'
                        WHEN A.CountryShortName IN ('U.S.', 'Canada', 'Puerto Rico', 'U.S. Virgin Islands') THEN 'US'
                        ELSE 'IN' END AS Division,
                    COALESCE(MR.Region,     'Unknown') AS Region,
                    COALESCE(CpM.Category1, 'Unknown') AS Category1,
                    COALESCE(CpM.Category2, 'Unknown') AS Category2,
                    COALESCE(CpM.Category3, 'Unknown') AS Category3,
                    SUM(S.Stores) AS GrossStores,
                    SUM(CASE WHEN O.DatePaid <> -1 THEN 1 ELSE 0 END) AS PaidStores,
                    SUM(CASE WHEN O.DatePaid <> -1 AND CD.WeekEnding <> OD.WeekEnding THEN 1 ELSE 0 END) AS NetStores,
                    SUM(CASE WHEN O.DatePaid <> -1 THEN SH.ActiveStores ELSE 0 END) AS StoresActiveNow
                FROM
                             Stores           AS S
                    INNER JOIN Orders           AS O   ON S."Order" = O."Order"
                    INNER JOIN Dates            AS OD  ON O.OrderDate = OD.DateSerial
                    INNER JOIN Dates            AS CD  ON O.CancellationDate = CD.DateSerial
                    INNER JOIN Customers        AS C   ON O.CustomerNow = C.Customer
                    INNER JOIN MarketingSources AS MS  ON C.Source = MS.Source
                    INNER JOIN StoreHistory     AS SH  ON S.MostRecentHistory = SH.History
                    INNER JOIN Addresses        AS A   ON C.Address = A.Address
                    LEFT JOIN  RegionsByCode    AS MR  ON MS.CountryCode = MR.CountryCode
                    LEFT JOIN  Routine.MarketingDashboardCampaignMap AS CpM ON CpM.LandingPage = 'N/A' AND MS.Campaign = CpM.Campaign AND MS.Medium = CpM.Medium AND CpM.Referrer = 'N/A' AND MS.SourceName = CpM.Source
                WHERE
                        O.IsDeleted = 'No'
                    AND OD.SQLDate BETWEEN @StartDate AND @EndDate
                GROUP BY
                    OD.SQLDate,
                    CASE WHEN O.VolusionCountryCode = 'GB' THEN 'UK'
                        WHEN A.CountryShortName IN ('U.S.', 'Canada', 'Puerto Rico', 'U.S. Virgin Islands') THEN 'US'
                        ELSE 'IN' END,
                    COALESCE(MR.Region,     'Unknown'),
                    COALESCE(CpM.Category1, 'Unknown'),
                    COALESCE(CpM.Category2, 'Unknown'),
                    COALESCE(CpM.Category3, 'Unknown')
                ) AS S ON D.Date = S.SQLDate AND Div.Division = S.Division AND Region.Region = S.Region AND C.Category1 = S.Category1 AND C.Category2 = S.Category2 AND C.Category3 = S.Category3
            -- Google Analytics spend
            LEFT JOIN
                (
                SELECT
                    AC.Date, C.Category1, C.Category2, C.Category3, SUM(AC.AdCost) / SUM(AC.Visits) AS AvgAdCost
                FROM
                    RawData.GoogleAnalytics.AdCosts AS AC
                    INNER JOIN
                        (
                        SELECT Campaign, Medium, Source, MIN(Category1) AS Category1, MIN(Category2) AS Category2, MIN(Category3) AS Category3
                        FROM Routine.MarketingDashboardCampaignMap
                        WHERE Category1 <> 'Affiliate'
                        GROUP BY Campaign, Medium, Source
                        ) AS C ON AC.Campaign = C.Campaign AND AC.Medium = C.Medium AND AC.Source = C.Source
                WHERE
                    AC.Date BETWEEN @StartDate AND @EndDate
                GROUP BY
                    AC.Date, C.Category1, C.Category2, C.Category3
                HAVING
                    SUM(AC.AdCost) > 0.00 AND SUM(AC.Visits) > 0
                ) AS GAAC ON D.Date = GAAC.Date AND C.Category1 = GAAC.Category1 AND C.Category2 = GAAC.Category2 AND C.Category3 = GAAC.Category3
            -- adCenter spend
            LEFT JOIN
                (
                SELECT Date, SUM(Spend) / SUM(Clicks) AS AvgClickCost
                FROM RawData.AdCenter.Spend
                WHERE Date BETWEEN @StartDate AND @EndDate
                GROUP BY Date
                HAVING SUM(Spend) > 0.00 AND SUM(Clicks) > 0
                ) AS ACS ON D.Date = ACS.Date AND C.Category1 = 'PPC' AND C.Category2 = 'adCenter' AND C.Category3 = 'N/A'
        WHERE
            V.Visits > 0 OR Dem.Demos > 0 OR S.GrossStores > 0
GO


SELECT * FROM Routine.MarketingDashboardECommerceBase('2011-05-21', '2011-05-23')

Bạn có thể chỉ cho chúng tôi các kế hoạch truy vấn văn bản xin vui lòng? Và trong truy vấn đầu tiên, loại nào là @StartDate + @EndDate
gbn

@gbn: Xin lỗi, kế hoạch quá dài, khoảng 32K ký tự. Có một số tập hợp con sẽ hữu ích nhất? Ngoài ra, bạn muốn kế hoạch cho truy vấn độc lập hoặc TVF?
Jon của tất cả các giao dịch

Chạy kế hoạch thực hiện trên mẫu TVF của truy vấn sẽ không có thông tin hữu ích, vì vậy tôi cho rằng bạn đang tìm kiếm gói truy vấn cho phiên bản không phải TVF. Hoặc có cách nào để lên kế hoạch thực hiện được TVF thực sự sử dụng?
Jon của tất cả các giao dịch

Không có nhiệm vụ chờ đợi. Tôi không quen thuộc với dm_exec numquests, nhưng tôi đã nối thêm đầu ra kể từ mốc năm phút trong quá trình thực hiện của TVF.
Jon của tất cả các giao dịch

@Martin: Vâng; truy vấn độc lập có thời gian CPU là 7021 (2% phiên bản TVF một phần ) và 154K lần đọc logic (0,5%). Gần đây tôi đã rời phiên bản TVF để chạy và nó đã hoàn thành sau 27 phút. Vì vậy, nó chắc chắn đang chuyển qua nhiều dữ liệu hơn ... nhưng làm thế nào tôi có thể sử dụng nó để sử dụng một kế hoạch tốt hơn? Tôi sẽ nghiên cứu kế hoạch thực hiện tốt một cách chi tiết và xem nếu một vài gợi ý giúp đỡ.
Jon của tất cả các giao dịch

Câu trả lời:


3

Tôi tách vấn đề thành một dòng trong truy vấn. Hãy nhớ rằng truy vấn dài 160 dòng và tôi cũng bao gồm các bảng có liên quan, nếu tôi tắt dòng này khỏi mệnh đề SELECT:

COALESCE(V.Visits, 0) * COALESCE(ACS.AvgClickCost, GAAC.AvgAdCost, 0.00)

... thời gian chạy giảm từ 63 phút xuống còn năm giây (nội tuyến CTE đã làm cho nó nhanh hơn một chút so với truy vấn bảy giây ban đầu). Bao gồm ACS.AvgClickCosthoặc GAAC.AvgAdCostgây ra thời gian chạy để phát nổ. Điều làm cho nó đặc biệt kỳ lạ là các trường này đến từ hai truy vấn con, tương ứng, mười hàng và ba! Mỗi cái chúng chạy trong 0 giây khi chạy độc lập và với số lượng hàng quá ngắn, tôi sẽ hy vọng thời gian tham gia là không đáng kể ngay cả khi sử dụng các vòng lặp lồng nhau.

Bạn có đoán được tại sao phép tính tưởng chừng như vô hại này sẽ loại bỏ hoàn toàn TVF, trong khi nó chạy rất nhanh như một truy vấn độc lập không?


Tôi đã đăng truy vấn, nhưng như bạn có thể thấy nó được vẽ trên một tá bảng, bao gồm một số lượt xem và một TVF khác, vì vậy tôi sợ nó sẽ không hữu ích. Phần tôi không hiểu là cách gói truy vấn trong TVF có thể nhân thời gian chạy với 750. Nó chỉ xảy ra nếu tôi bao gồm GAAC.AvgAdCost(hôm nay; hôm qua ACS.AvgClickCostcũng là một vấn đề), do đó, việc truy vấn phụ dường như bị loại bỏ kế hoạch thực hiện .
Jon của tất cả các giao dịch

1
Tôi đoán bạn phải xem điều khoản tham gia cho các truy vấn con. Nếu bạn nhận được nhiều mối quan hệ giữa nhiều bảng, bạn sẽ nhận được nhiều hơn 10 lần các bản ghi để xử lý.

Tại một số điểm trong dự án của chúng tôi (trong đó có rất nhiều quan điểm lồng nhau và TVFs inline), chúng tôi thấy mình thay thế COALESCE()với ISNULL()sự giúp đỡ kế hoạch dự thảo truy vấn tối ưu tốt hơn. Tôi nghĩ rằng nó phải làm với ISNULL()việc có một loại đầu ra dễ dự đoán hơn COALESCE(). Đáng để thử? Tôi biết điều này là mơ hồ, nhưng theo kinh nghiệm hạn chế của chúng tôi, ảnh hưởng đến trình tối ưu hóa truy vấn đối với các kế hoạch tốt hơn có vẻ như là một nghệ thuật mờ nhạt, vì vậy thử một loạt các ý tưởng điên rồ mơ hồ vì tuyệt vọng là cách duy nhất chúng tôi đạt được.

2

Tôi hy vọng điều này có liên quan đến việc đánh hơi thông số.

Một số thảo luận về các vấn đề ở đây (và bạn có thể tìm kiếm SO để đánh hơi thông số.)

http://bloss.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx


Bạn không nhận được thông số đánh hơi với TVF nội tuyến: chúng chỉ là các macro mở rộng như lượt xem.
gbn

@gbn: Có thể đúng là bản thân TVF được mở rộng như macro, nhưng (theo tôi hiểu), truy vấn hoặc sproc cuối cùng thực hiện việc mở rộng đó phải tuân theo quy hoạch và tham số hóa tiềm năng. (Chúng tôi đã chiến đấu với điều này trong SQL Server 2005 một thời gian trước. Cuộc chiến đặc biệt khó khăn cho đến khi chúng tôi tìm thấy SQL Server Management Studio sử dụng các cài đặt phiên khác nhau ( ARITHABORTcó thể?) So với Dịch vụ báo cáo và / hoặc jTDS, do đó, một trong số chúng đôi khi sẽ xuất hiện một kế hoạch "xấu" nhưng những người khác sẽ (tức giận) làm tốt "trên cùng một truy vấn".)

Nó có mùi như đánh hơi với tôi ....
Hogan

Hmm, đọc nhiều để làm. Đối với giá trị của nó, không có sự khác biệt lớn về số lượng thẻ cho các giá trị được tham số hóa: truy vấn bao gồm bảng Ngày, với một hàng mỗi ngày và một số bảng khác có nhiều hàng mỗi ngày, nhưng về cùng một số cho bất kỳ ngày nào. Tôi sử dụng cùng một thông số (21/05 đến 23/05) trong một lần thực hiện kiểm tra ngay sau khi (tái) tạo UDF, vì vậy nếu có bất cứ điều gì thì nên "mồi" cho các giá trị đó.
Jon của tất cả các giao dịch

Thêm một lưu ý: việc gán các giá trị của các tham số cho các biến cục bộ như được mô tả bởi Jetson trong stackoverflow.com/questions/211355/ trộm không có tác động vật chất.
Jon của tất cả các giao dịch

1

Thật không may, công cụ tối ưu hóa truy vấn của SQL không thể nhìn thấy bên trong các chức năng.

Vì vậy, tôi sẽ sử dụng kế hoạch thực hiện từ kế hoạch nhanh để tìm ra gợi ý nào để áp dụng trong TF. Rửa sạch và lặp lại cho đến khi kế hoạch thực hiện của TF gần đúng với kế hoạch nhanh hơn.

http://sqlblog.com/bloss/tibor_karazi/archive/2008/08/29/execut-plan-re-use-sp-executesql-and-tsql-variables.aspx


2
Trình tối ưu hóa truy vấn SQL Server có thể thấy bên trong ITVF (các hàm có giá trị bảng nội tuyến), nhưng không có bất kỳ hàm nào khác.

Lưu ý: các chức năng bảng nội tuyến với áp dụng chéo khi được thiết kế chính xác có thể dẫn đến hiệu suất tăng rất lớn. Ví dụ: một biểu thức không thể nói được trên một phép nối như sự kết hợp của bạn, có thể được gói trong một câu lệnh áp dụng, được đánh giá là một tập hợp, và sau đó được nối với trong truy vấn tiếp theo mà không trở thành RBAR. Thử nghiệm một chút. Áp dụng chéo là khó để làm chủ, nhưng rất đáng giá!
SheldonH

0

Xin vui lòng cho biết sự khác biệt trong các giá trị này là gì?

arithabort              1
ansi_null_dflt_on       1
ansi_defaults           0
ansi_warnings           1
ansi_padding            1
ansi_nulls              1

Những điều này (đặc biệt là arithabort) đã được chứng minh là ảnh hưởng nghiêm trọng đến hiệu suất truy vấn theo cách này.


Điều này là bởi vì nó là một khóa bộ nhớ cache kế hoạch chứ không phải bất cứ điều gì về arithabortchính nó mặc dù không phải là nó? Vì SQL Server 2005, tôi nghĩ rằng cài đặt này không có hiệu lực miễn ansi_warningslà bật. (Trong 2000 lượt xem được lập chỉ mục sẽ không được sử dụng nếu được đặt không chính xác)
Martin Smith

@Martin: Tôi không có kinh nghiệm trực tiếp về điều này nhưng nhớ lại việc đọc những thứ gần đây. Và tìm một số câu trả lời SO trên đó. Nó có thể giúp OP, nó có thể không ... Chỉnh sửa: sqlblog.com/bloss/kalen_delaney/archive/2008/06/19/ thở dài
gbn

Tôi đã đọc các yêu cầu khá rõ ràng tương tự về SO. Tôi chưa bao giờ thấy bất cứ điều gì cho phép tôi tái tạo nó cho chính mình hoặc bất kỳ lời giải thích hợp lý nào về lý do tại sao arithabortcài đặt sẽ có ảnh hưởng lớn đến hiệu suất như vậy mặc dù vậy tôi hơi nghi ngờ về điều đó vào lúc này.
Martin Smith

ARITHABORT, ANSI_WARNINGS, ANSI_PADDING và ANSI_NULL là 1, phần còn lại là NULL.
Jon của tất cả các giao dịch

FYI, tôi đang làm việc hoàn toàn trong SSMS, vì vậy các cài đặt khác nhau trong VS hoặc các máy khách khác không có vấn đề gì.
Jon của tất cả các giao dịch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.